ETH Price: $3,313.20 (-4.53%)

Token

AQ1 (AQ1)
 

Overview

Max Total Supply

1,000 AQ1

Holders

244

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AQ1
0x178B95f34bDf5Bd1637Ee8C03633CDF855Bc92f2
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AQ1

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-21
*/

// SPDX-License-Identifier: MIT
/*          



                                       ██████████
                                       ██████████
                                       ██████████
                                       ██████████
                                       ██████████
                                       ██████████
                                       ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████          ██████████
                             ██████████████████████████████
                             ██████████████████████████████
                             ██████████████████████████████
                             ██████████████████████████████
                             ██████████████████████████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████
                  ▐██████████                              ███████████



*/

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/IOperatorFilterRegistry.sol

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/OperatorFilterer.sol
pragma solidity ^0.8.13;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/main/src/DefaultOperatorFilterer.sol
pragma solidity ^0.8.13;

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.0;

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}


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


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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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



// 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)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `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)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 {}
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


contract AQ1 is ERC721Enumerable, ReentrancyGuard, DefaultOperatorFilterer, Ownable {
    
    uint256 public price = 55000000000000000; //0.055 ETH
    uint256 public constant MAX_SUPPLY = 1000;

    // Inspired by 0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7
    constructor() ERC721("AQ1", "AQ1") {}
    
    string[] private firstrow = [
        "11 00 11 00 01 00", "00 00 00 10 00 10", "00 11 00 11 01 01", "10 00 00 11 11 01", "01 10 11 01 01 10",
        "10 00 11 11 11 10", "00 01 10 01 10 11", "00 01 10 10 10 00", "10 01 10 11 01 01", "10 11 00 11 00 10",
        "01 10 01 11 11 01", "00 11 00 00 00 00", "11 00 00 01 00 10", "11 10 10 11 11 01", "01 10 00 01 00 11",
        "10 10 10 00 00 11", "01 11 01 11 11 01", "11 10 11 10 11 00", "01 01 10 11 10 00", "10 10 00 00 11 01"
    ];

    string[] private secondrow = [
        "11 00 01 01 00 00", "10 00 01 01 00 11", "00 10 11 01 10 10", "10 11 11 00 11 11", "11 01 11 00 01 11",
        "00 10 00 10 00 11", "01 01 00 10 01 11", "00 01 00 11 11 11", "10 11 11 11 01 10", "10 01 10 01 01 00",
        "10 01 10 01 11 11", "10 01 01 01 01 11", "01 01 11 01 01 01", "11 00 11 10 00 10", "01 11 01 11 11 00",
        "00 11 00 10 11 10", "01 11 11 10 00 11", "00 00 01 11 11 01", "11 11 10 11 10 10", "10 11 00 11 10 00"
    ];

    string[] private thirdrow = [
        "10 00 00 11 10 00", "11 10 10 10 11 00", "01 00 11 10 11 11", "01 00 10 11 00 01", "01 10 11 11 00 11",
        "11 10 01 00 10 10", "00 10 01 01 11 10", "11 01 01 11 11 00", "11 10 00 10 00 00", "11 10 11 10 00 10",
        "00 11 01 01 00 10", "01 11 00 01 10 01", "00 11 01 11 11 00", "01 00 00 00 11 11", "10 10 01 11 01 01",
        "11 11 01 11 00 00", "11 11 01 10 01 11", "10 11 01 01 11 01", "00 01 11 11 11 11", "00 10 01 00 00 10"
    ];

    string[] private fourthrow = [
        "10 11 00 11 10 00", "11 01 10 01 11 10", "11 11 00 11 00 11", "00 11 10 10 11 00", "00 11 01 10 01 01",
        "10 10 11 11 11 00", "00 01 01 10 10 11", "00 00 00 11 11 11", "11 01 11 00 10 00", "11 10 01 00 00 10",
        "10 00 00 00 01 01", "00 00 00 10 00 10", "10 00 10 01 11 10", "01 00 10 00 01 10", "10 00 10 01 01 10",
        "11 00 01 01 11 00", "01 10 01 11 01 11", "01 11 01 10 00 11", "01 00 11 10 11 10", "00 10 10 01 10 00"
    ];

    string[] private fifthrow = [
        "00 11 10 10 10 00", "01 00 11 11 00 11", "10 11 10 01 11 00", "00 01 11 01 00 10", "11 10 01 10 10 01",
        "10 11 11 11 01 11", "00 01 11 10 00 01", "11 10 10 10 01 01", "11 10 11 10 01 11", "00 01 11 01 00 11",
        "10 01 01 00 00 00", "10 11 01 11 10 00", "01 01 00 11 11 00", "10 00 11 11 00 01", "11 00 10 10 01 11",
        "00 00 10 10 11 11", "10 11 11 10 00 11", "11 11 10 10 11 10", "11 11 10 00 01 01", "01 01 10 11 00 00"
    ];

    string[] private sixthrow = [
        "10 10 01 00 11 10", "00 00 01 00 00 00", "00 10 11 11 00 11", "01 00 11 01 11 00", "11 00 10 00 11 00",
        "10 00 00 11 11 10", "11 10 11 00 01 10", "01 01 11 11 00 10", "01 11 10 01 00 11", "00 00 00 10 11 10",
        "11 01 00 11 00 11", "10 01 10 11 11 01", "10 11 00 10 00 01", "01 00 00 01 11 11", "10 10 01 10 10 01",
        "01 11 00 10 10 10", "11 01 11 00 11 11", "11 00 00 10 00 01", "01 10 10 01 00 00", "01 00 01 01 00 10"
    ];

      function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getFirst(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FIRSTROW", firstrow);
    }

    function getSecond(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SECONDROW", secondrow);
    }

    function getThird(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "THIRDROW", thirdrow);
    }

    function getFourth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FOURTHROW", fourthrow);
    }

    function getFifth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FIFTHROW", fifthrow);
    }

    function getSixth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SIXTHROW", sixthrow);
    }

    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray
    ) internal pure returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        return output;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        string[13] memory parts;
        parts[
            0
        ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 700 700"><style>.base { fill: #fff; font-family: sans-serif; font-size: 22px; font-weight: bold;}</style><rect width="100%" height="100%" fill="#0052ff" /><g transform="translate(0.000000,700.000000) scale(0.017500,-0.017500)" fill="#fff" stroke="none"> <path d="M29800 37135 c-591 -61 -1101 -260 -1550 -605 -136 -105 -399 -372 -507 -515 -449 -597 -661 -1236 -704 -2118 -36 -759 97 -1490 372 -2040 378 -754 956 -1265 1718 -1517 664 -219 1496 -207 2139 32 48 18 86 27 91 22 4 -5 131 -165 281 -356 l273 -348 594 0 c473 0 593 3 587 13 -4 6 -211 273 -459 592 -248 319 -454 586 -459 592 -4 8 27 45 89 105 415 396 722 943 874 1553 124 501 160 1138 96 1705 -69 607 -250 1129 -547 1579 -227 344 -538 653 -863 859 -328 207 -706 350 -1105 418 -256 43 -656 56 -920 29z m508 -1095 c621 -48 1120 -380 1415 -940 135 -256 224 -548 273 -902 25 -178 27 -219 27 -528 0 -306 -2 -352 -26 -525 -49 -355 -137 -651 -269 -903 -91 -174 -285 -441 -309 -427 -5 3 -135 170 -290 370 l-280 365 -555 0 c-442 0 -554 -3 -548 -12 5 -7 208 -276 452 -596 244 -321 440 -587 436 -592 -5 -4 -63 -18 -129 -31 -107 -21 -146 -24 -360 -24 -223 1 -250 3 -375 29 -536 110 -938 420 -1202 926 -129 247 -216 538 -265 885 -25 176 -27 215 -26 535 0 317 2 360 26 531 80 565 272 1005 580 1329 355 372 863 554 1425 510z"/> <path d="M22382 37003 c-11 -32 -545 -1550 -1187 -3373 -643 -1823 -1170 -3323 -1173 -3332 -4 -17 32 -18 651 -18 l654 0 279 833 280 832 1275 3 1276 2 280 -832 280 -833 656 -3 656 -2 -28 82 c-32 93 -2346 6653 -2356 6681 -7 16 -53 17 -765 17 l-758 0 -20 -57z m884 -1565 c42 -128 247 -739 456 -1358 208 -619 378 -1128 378 -1132 0 -5 -423 -8 -941 -8 -575 0 -939 4 -937 9 2 5 208 620 458 1365 452 1348 455 1356 482 1356 26 0 29 -7 104 -232z"/><path d="M35123 36517 l-843 -541 0 -564 0 -564 28 18 c15 10 371 237 790 506 466 298 773 488 788 488 l24 0 0 -2790 0 -2790 615 0 615 0 0 3390 0 3390 -587 0 -588 -1 -842 -542z"/></g> <text x="50" y="460" class="base">';

        parts[1] = getFirst(tokenId);

        parts[2] = '</text><text x="50" y="498" class="base">';

        parts[3] = getSecond(tokenId);

        parts[4] = '</text><text x="50" y="536" class="base">';

        parts[5] = getThird(tokenId);

        parts[6] = '</text><text x="50" y="574" class="base">';

        parts[7] = getFourth(tokenId);

        parts[8] = '</text><text x="50" y="612" class="base">';

        parts[9] = getFifth(tokenId);

        parts[10] = '</text><text x="50" y="650" class="base">';

        parts[11] = getSixth(tokenId);

        parts[12] = '</text></svg>';

        
        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6])
        );
        output = string(
            abi.encodePacked(
                output,
                parts[7],
                parts[8],
                parts[9],
                parts[10],
                parts[11],
                parts[12]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "AQ1 #',
                        toString(tokenId),
                        '", "description": "", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

            return output;

    }

    function mint(uint256 tokenId) public payable nonReentrant {
        require(tokenId > 0 && tokenId <= 1000, "Token ID invalid");
        require(price <= msg.value, "Ether value sent is not correct");
        _safeMint(_msgSender(), tokenId);
    }
    
    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
          
    }
    
  
    // Operator Filter Registry https://github.com/ProjectOpenSea/operator-filter-registry
    function setApprovalForAll(address operator, bool approved) public override (ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override (ERC721, IERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override (ERC721, IERC721) 
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFifth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFirst","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFourth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecond","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSixth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getThird","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66c3663566a58000600c556011610300818152700313120303020313120303020303120303607c1b610320526080908152610340828152700303020303020303020313020303020313607c1b6103605260a05261038082815270303020313120303020313120303120303160781b6103a05260c0526103c082815270313020303020303020313120313120303160781b6103e05260e052610400828152700303120313020313120303120303120313607c1b6104205261010052610440828152700313020303020313120313120313120313607c1b610460526101205261048082815270303020303120313020303120313020313160781b6104a052610140526104c0828152700303020303120313020313020313020303607c1b6104e0526101605261050082815270313020303120313020313120303120303160781b6105205261018052610540828152700313020313120303020313120303020313607c1b610560526101a05261058082815270303120313020303120313120313120303160781b6105a0526101c0526105c0828152700303020313120303020303020303020303607c1b6105e0526101e052610600828152700313120303020303020303120303020313607c1b610620526102005261064082815270313120313020313020313120313120303160781b610660526102205261068082815270303120313020303020303120303020313160781b6106a052610240526106c082815270313020313020313020303020303020313160781b6106e0526102605261070082815270303120313120303120313120313120303160781b6107205261028052610740828152700313120313020313120313020313120303607c1b610760526102a052610780828152700303120303120313020313120313020303607c1b6107a0526102c0526108006040526107c091825270313020313020303020303020313120303160781b6107e0526102e091909152620002df90600d906014620015a1565b50604080516102c08101825260116102808201818152700313120303020303120303120303020303607c1b6102a084015282528251808401845281815270313020303020303120303120303020313160781b6020828101919091528084019190915283518085018552828152700303020313020313120303120313020313607c1b81830152838501528351808501855282815270313020313120313120303020313120313160781b8183015260608401528351808501855282815270313120303120313120303020303120313160781b8183015260808401528351808501855282815270303020313020303020313020303020313160781b8183015260a08401528351808501855282815270303120303120303020313020303120313160781b8183015260c08401528351808501855282815270303020303120303020313120313120313160781b8183015260e084015283518085018552828152700313020313120313120313120303120313607c1b8183015261010084015283518085018552828152700313020303120313020303120303120303607c1b818301526101208401528351808501855282815270313020303120313020303120313120313160781b818301526101408401528351808501855282815270313020303120303120303120303120313160781b818301526101608401528351808501855282815270303120303120313120303120303120303160781b8183015261018084015283518085018552828152700313120303020313120313020303020313607c1b818301526101a084015283518085018552828152700303120313120303120313120313120303607c1b818301526101c084015283518085018552828152700303020313120303020313020313120313607c1b818301526101e08401528351808501855282815270303120313120313120313020303020313160781b818301526102008401528351808501855282815270303020303020303120313120313120303160781b8183015261022084015283518085018552828152700313120313120313020313120313020313607c1b818301526102408401528351808501909452908352700313020313120303020313120313020303607c1b908301526102608101919091526200063090600e906014620015a1565b50604080516102c08101825260116102808201818152700313020303020303020313120313020303607c1b6102a0840152825282518084018452818152700313120313020313020313020313120303607c1b602082810191909152808401919091528351808501855282815270303120303020313120313020313120313160781b81830152838501528351808501855282815270303120303020313020313120303020303160781b8183015260608401528351808501855282815270303120313020313120313120303020313160781b81830152608084015283518085018552828152700313120313020303120303020313020313607c1b8183015260a084015283518085018552828152700303020313020303120303120313120313607c1b8183015260c084015283518085018552828152700313120303120303120313120313120303607c1b8183015260e084015283518085018552828152700313120313020303020313020303020303607c1b8183015261010084015283518085018552828152700313120313020313120313020303020313607c1b8183015261012084015283518085018552828152700303020313120303120303120303020313607c1b818301526101408401528351808501855282815270303120313120303020303120313020303160781b8183015261016084015283518085018552828152700303020313120303120313120313120303607c1b818301526101808401528351808501855282815270303120303020303020303020313120313160781b818301526101a08401528351808501855282815270313020313020303120313120303120303160781b818301526101c084015283518085018552828152700313120313120303120313120303020303607c1b818301526101e08401528351808501855282815270313120313120303120313020303120313160781b818301526102008401528351808501855282815270313020313120303120303120313120303160781b818301526102208401528351808501855282815270303020303120313120313120313120313160781b818301526102408401528351808501909452908352700303020313020303120303020303020313607c1b908301526102608101919091526200098190600f906014620015a1565b50604080516102c08101825260116102808201818152700313020313120303020313120313020303607c1b6102a0840152825282518084018452818152700313120303120313020303120313120313607c1b602082810191909152808401919091528351808501855282815270313120313120303020313120303020313160781b818301528385015283518085018552828152700303020313120313020313020313120303607c1b8183015260608401528351808501855282815270303020313120303120313020303120303160781b81830152608084015283518085018552828152700313020313020313120313120313120303607c1b8183015260a08401528351808501855282815270303020303120303120313020313020313160781b8183015260c08401528351808501855282815270303020303020303020313120313120313160781b8183015260e084015283518085018552828152700313120303120313120303020313020303607c1b8183015261010084015283518085018552828152700313120313020303120303020303020313607c1b818301526101208401528351808501855282815270313020303020303020303020303120303160781b8183015261014084015283518085018552828152700303020303020303020313020303020313607c1b8183015261016084015283518085018552828152700313020303020313020303120313120313607c1b8183015261018084015283518085018552828152700303120303020313020303020303120313607c1b818301526101a084015283518085018552828152700313020303020313020303120303120313607c1b818301526101c084015283518085018552828152700313120303020303120303120313120303607c1b818301526101e08401528351808501855282815270303120313020303120313120303120313160781b818301526102008401528351808501855282815270303120313120303120313020303020313160781b8183015261022084015283518085018552828152700303120303020313120313020313120313607c1b818301526102408401528351808501909452908352700303020313020313020303120313020303607c1b9083015261026081019190915262000cd2906010906014620015a1565b50604080516102c08101825260116102808201818152700303020313120313020313020313020303607c1b6102a084015282528251808401845281815270303120303020313120313120303020313160781b6020828101919091528084019190915283518085018552828152700313020313120313020303120313120303607c1b818301528385015283518085018552828152700303020303120313120303120303020313607c1b8183015260608401528351808501855282815270313120313020303120313020313020303160781b8183015260808401528351808501855282815270313020313120313120313120303120313160781b8183015260a08401528351808501855282815270303020303120313120313020303020303160781b8183015260c08401528351808501855282815270313120313020313020313020303120303160781b8183015260e08401528351808501855282815270313120313020313120313020303120313160781b818301526101008401528351808501855282815270303020303120313120303120303020313160781b8183015261012084015283518085018552828152700313020303120303120303020303020303607c1b8183015261014084015283518085018552828152700313020313120303120313120313020303607c1b8183015261016084015283518085018552828152700303120303120303020313120313120303607c1b818301526101808401528351808501855282815270313020303020313120313120303020303160781b818301526101a08401528351808501855282815270313120303020313020313020303120313160781b818301526101c08401528351808501855282815270303020303020313020313020313120313160781b818301526101e08401528351808501855282815270313020313120313120313020303020313160781b8183015261020084015283518085018552828152700313120313120313020313020313120313607c1b818301526102208401528351808501855282815270313120313120313020303020303120303160781b818301526102408401528351808501909452818452700303120303120313020313120303020303607c1b908401526102608201929092526200102191906014620015a1565b50604080516102c08101825260116102808201818152700313020313020303120303020313120313607c1b6102a0840152825282518084018452818152700303020303020303120303020303020303607c1b602082810191909152808401919091528351808501855282815270303020313020313120313120303020313160781b818301528385015283518085018552828152700303120303020313120303120313120303607c1b81830152606084015283518085018552828152700313120303020313020303020313120303607c1b81830152608084015283518085018552828152700313020303020303020313120313120313607c1b8183015260a084015283518085018552828152700313120313020313120303020303120313607c1b8183015260c084015283518085018552828152700303120303120313120313120303020313607c1b8183015260e08401528351808501855282815270303120313120313020303120303020313160781b8183015261010084015283518085018552828152700303020303020303020313020313120313607c1b818301526101208401528351808501855282815270313120303120303020313120303020313160781b818301526101408401528351808501855282815270313020303120313020313120313120303160781b818301526101608401528351808501855282815270313020313120303020313020303020303160781b818301526101808401528351808501855282815270303120303020303020303120313120313160781b818301526101a08401528351808501855282815270313020313020303120313020313020303160781b818301526101c084015283518085018552828152700303120313120303020313020313020313607c1b818301526101e08401528351808501855282815270313120303120313120303020313120313160781b818301526102008401528351808501855282815270313120303020303020313020303020303160781b8183015261022084015283518085018552828152700303120313020313020303120303020303607c1b818301526102408401528351808501909452908352700303120303020303120303120303020313607c1b9083015261026081019190915262001372906012906014620015a1565b503480156200138057600080fd5b5060408051808201825260038082526241513160e81b602080840182815285518087019096529285528401528151733cc6cdda760b79bafa08df41ecfa224f810dceb693600193929091620013d89160009162001605565b508051620013ee90600190602084019062001605565b50506001600a55506daaeb6d7670e522a718067333cd4e3b156200153b5780156200148957604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200146a57600080fd5b505af11580156200147f573d6000803e3d6000fd5b505050506200153b565b6001600160a01b03821615620014da5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200144f565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200152157600080fd5b505af115801562001536573d6000803e3d6000fd5b505050505b50620015499050336200154f565b62001746565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620015f3579160200282015b82811115620015f35782518051620015e291849160209091019062001605565b5091602001919060010190620015c2565b506200160192915062001690565b5090565b82805462001613906200170a565b90600052602060002090601f01602090048101928262001637576000855562001682565b82601f106200165257805160ff191683800117855562001682565b8280016001018555821562001682579182015b828111156200168257825182559160200191906001019062001665565b5062001601929150620016b1565b8082111562001601576000620016a78282620016c8565b5060010162001690565b5b80821115620016015760008155600101620016b2565b508054620016d6906200170a565b6000825580601f10620016e7575050565b601f016020900490600052602060002090810190620017079190620016b1565b50565b600181811c908216806200171f57607f821691505b6020821081036200174057634e487b7160e01b600052602260045260246000fd5b50919050565b61351c80620017566000396000f3fe6080604052600436106101cd5760003560e01c8063667386f7116100f7578063a035b1fe11610095578063c87b56dd11610064578063c87b56dd14610500578063e985e9c514610520578063f2fde38b14610569578063fa7f71b11461058957600080fd5b8063a035b1fe14610497578063a0712d68146104ad578063a22cb465146104c0578063b88d4fde146104e057600080fd5b80638aa001fc116100d15780638aa001fc146104245780638da5cb5b1461044457806395d89b41146104625780639ec29b821461047757600080fd5b8063667386f7146103cf57806370a08231146103ef578063715018a61461040f57600080fd5b80632f745c591161016f57806342842e0e1161013e57806342842e0e1461034f57806342d9d8761461036f5780634f6ccce71461038f5780636352211e146103af57600080fd5b80632f745c59146102e257806332cb6b0c146103025780633ccfd60b1461031857806341f434341461032d57600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630b2503a61461028357806318160ddd146102a357806323b872dd146102c257600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed36600461254d565b6105a9565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105d4565b6040516101fe91906125c9565b34801561023557600080fd5b506102496102443660046125dc565b610666565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004612611565b61068d565b005b34801561028f57600080fd5b5061021c61029e3660046125dc565b61075b565b3480156102af57600080fd5b506008545b6040519081526020016101fe565b3480156102ce57600080fd5b506102816102dd36600461263b565b610859565b3480156102ee57600080fd5b506102b46102fd366004612611565b610932565b34801561030e57600080fd5b506102b46103e881565b34801561032457600080fd5b506102816109c8565b34801561033957600080fd5b506102496daaeb6d7670e522a718067333cd4e81565b34801561035b57600080fd5b5061028161036a36600461263b565b6109ff565b34801561037b57600080fd5b5061021c61038a3660046125dc565b610acd565b34801561039b57600080fd5b506102b46103aa3660046125dc565b610bc2565b3480156103bb57600080fd5b506102496103ca3660046125dc565b610c55565b3480156103db57600080fd5b5061021c6103ea3660046125dc565b610cb5565b3480156103fb57600080fd5b506102b461040a366004612677565b610daa565b34801561041b57600080fd5b50610281610e30565b34801561043057600080fd5b5061021c61043f3660046125dc565b610e44565b34801561045057600080fd5b50600b546001600160a01b0316610249565b34801561046e57600080fd5b5061021c610f3a565b34801561048357600080fd5b5061021c6104923660046125dc565b610f49565b3480156104a357600080fd5b506102b4600c5481565b6102816104bb3660046125dc565b61103f565b3480156104cc57600080fd5b506102816104db3660046126a0565b61114a565b3480156104ec57600080fd5b506102816104fb3660046126ed565b61120e565b34801561050c57600080fd5b5061021c61051b3660046125dc565b6112ea565b34801561052c57600080fd5b506101f261053b3660046127c9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561057557600080fd5b50610281610584366004612677565b611522565b34801561059557600080fd5b5061021c6105a43660046125dc565b611598565b60006001600160e01b0319821663780e9d6360e01b14806105ce57506105ce8261168d565b92915050565b6060600080546105e3906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461060f906127fc565b801561065c5780601f106106315761010080835404028352916020019161065c565b820191906000526020600020905b81548152906001019060200180831161063f57829003601f168201915b5050505050905090565b6000610671826116dd565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b1561074c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156106fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071f9190612836565b61074c57604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610756838361173c565b505050565b60606105ce82604051806040016040528060088152602001674649465448524f5760c01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156108505783829060005260206000200180546107c3906127fc565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef906127fc565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b5050505050815260200190600101906107a4565b5050505061184c565b826daaeb6d7670e522a718067333cd4e3b1561092157336001600160a01b0382160361088f5761088a8484846118ba565b61092c565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190612836565b61092157604051633b79c77360e21b8152336004820152602401610743565b61092c8484846118ba565b50505050565b600061093d83610daa565b821061099f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610743565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109d06118eb565b60405133904780156108fc02916000818181858888f193505050501580156109fc573d6000803e3d6000fd5b50565b826daaeb6d7670e522a718067333cd4e3b15610ac257336001600160a01b03821603610a305761088a848484611945565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa39190612836565b610ac257604051633b79c77360e21b8152336004820152602401610743565b61092c848484611945565b60606105ce82604051806040016040528060088152602001675349585448524f5760c01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610b35906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b61906127fc565b8015610bae5780601f10610b8357610100808354040283529160200191610bae565b820191906000526020600020905b815481529060010190602001808311610b9157829003601f168201915b505050505081526020019060010190610b16565b6000610bcd60085490565b8210610c305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610743565b60088281548110610c4357610c43612853565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105ce5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610743565b60606105ce82604051806040016040528060088152602001674649525354524f5760c01b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610d1d906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d49906127fc565b8015610d965780601f10610d6b57610100808354040283529160200191610d96565b820191906000526020600020905b815481529060010190602001808311610d7957829003601f168201915b505050505081526020019060010190610cfe565b60006001600160a01b038216610e145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610743565b506001600160a01b031660009081526003602052604090205490565b610e386118eb565b610e426000611960565b565b60606105ce82604051806040016040528060098152602001685345434f4e44524f5760b81b815250600e805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610ead906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed9906127fc565b8015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b505050505081526020019060010190610e8e565b6060600180546105e3906127fc565b60606105ce8260405180604001604052806009815260200168464f55525448524f5760b81b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610fb2906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610fde906127fc565b801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b505050505081526020019060010190610f93565b6002600a54036110915760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610743565b6002600a5580158015906110a757506103e88111155b6110e65760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b6044820152606401610743565b34600c5411156111385760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610743565b61114233826119b2565b506001600a55565b816daaeb6d7670e522a718067333cd4e3b1561120457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc9190612836565b61120457604051633b79c77360e21b81526001600160a01b0382166004820152602401610743565b61075683836119d0565b836daaeb6d7670e522a718067333cd4e3b156112d757336001600160a01b0382160361124557611240858585856119db565b6112e3565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b89190612836565b6112d757604051633b79c77360e21b8152336004820152602401610743565b6112e3858585856119db565b5050505050565b60606112f461250f565b6040518061080001604052806107da8152602001612c296107da9139815261131b83610cb5565b816001602002018190525060405180606001604052806029815260200161340360299139604082015261134d83610e44565b606080830191909152604080519182019052602980825261342c6020830139608082015261137a83611598565b60a08201526040805160608101909152602980825261347e602083013960c08201526113a583610f49565b60e082015260408051606081019091526029808252612c0060208301396101008201526113d18361075b565b6101208201526040805160608101909152602980825261345560208301396101408201526113fe83610acd565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c0890151975160009861146398909101612869565b60408051808303601f190181529082905260e08401516101008501516101208601516101408701516101608801516101808901519597506114a996889690602001612869565b604051602081830303815290604052905060006114f66114c886611a0d565b6114d184611b16565b6040516020016114e29291906128fb565b604051602081830303815290604052611b16565b90508060405160200161150991906129a4565b60408051601f1981840301815291905295945050505050565b61152a6118eb565b6001600160a01b03811661158f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610743565b6109fc81611960565b60606105ce82604051806040016040528060088152602001675448495244524f5760c01b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054611600906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461162c906127fc565b80156116795780601f1061164e57610100808354040283529160200191611679565b820191906000526020600020905b81548152906001019060200180831161165c57829003601f168201915b5050505050815260200190600101906115e1565b60006001600160e01b031982166380ac58cd60e01b14806116be57506001600160e01b03198216635b5e139f60e01b145b806105ce57506301ffc9a760e01b6001600160e01b03198316146105ce565b6000818152600260205260409020546001600160a01b03166109fc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610743565b600061174782610c55565b9050806001600160a01b0316836001600160a01b0316036117b45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610743565b336001600160a01b03821614806117d057506117d0813361053b565b6118425760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610743565b6107568383611c80565b606060006118828461185d87611a0d565b60405160200161186e9291906129e9565b604051602081830303815290604052611cee565b90506000838451836118949190612a2e565b815181106118a4576118a4612853565b6020026020010151905080925050509392505050565b6118c43382611d1f565b6118e05760405162461bcd60e51b815260040161074390612a42565b610756838383611d9d565b600b546001600160a01b03163314610e425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610743565b6107568383836040518060200160405280600081525061120e565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6119cc828260405180602001604052806000815250611f44565b5050565b6119cc338383611f77565b6119e53383611d1f565b611a015760405162461bcd60e51b815260040161074390612a42565b61092c84848484612045565b606081600003611a345750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a5e5780611a4881612aa6565b9150611a579050600a83612abf565b9150611a38565b60008167ffffffffffffffff811115611a7957611a796126d7565b6040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b5090505b8415611b0e57611ab8600183612ad3565b9150611ac5600a86612a2e565b611ad0906030612aea565b60f81b818381518110611ae557611ae5612853565b60200101906001600160f81b031916908160001a905350611b07600a86612abf565b9450611aa7565b949350505050565b80516060906000819003611b3a575050604080516020810190915260008152919050565b60006003611b49836002612aea565b611b539190612abf565b611b5e906004612b02565b90506000611b6d826020612aea565b67ffffffffffffffff811115611b8557611b856126d7565b6040519080825280601f01601f191660200182016040528015611baf576020820181803683370190505b50905060006040518060600160405280604081526020016134a7604091399050600181016020830160005b86811015611c3b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611bda565b506003860660018114611c555760028114611c6657611c72565b613d3d60f01b600119830152611c72565b603d60f81b6000198301525b505050918152949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cb582610c55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081604051602001611d019190612b21565b60408051601f19818403018152919052805160209091012092915050565b600080611d2b83610c55565b9050806001600160a01b0316846001600160a01b03161480611d7257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b0e5750836001600160a01b0316611d8b84610666565b6001600160a01b031614949350505050565b826001600160a01b0316611db082610c55565b6001600160a01b031614611e145760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610743565b6001600160a01b038216611e765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b611e81838383612078565b611e8c600082611c80565b6001600160a01b0383166000908152600360205260408120805460019290611eb5908490612ad3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ee3908490612aea565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611f4e8383612130565b611f5b600084848461227e565b6107565760405162461bcd60e51b815260040161074390612b3d565b816001600160a01b0316836001600160a01b031603611fd85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610743565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612050848484611d9d565b61205c8484848461227e565b61092c5760405162461bcd60e51b815260040161074390612b3d565b6001600160a01b0383166120d3576120ce81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6120f6565b816001600160a01b0316836001600160a01b0316146120f6576120f6838261237f565b6001600160a01b03821661210d576107568161241c565b826001600160a01b0316826001600160a01b0316146107565761075682826124cb565b6001600160a01b0382166121865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610743565b6000818152600260205260409020546001600160a01b0316156121eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610743565b6121f760008383612078565b6001600160a01b0382166000908152600360205260408120805460019290612220908490612aea565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561237457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122c2903390899088908890600401612b8f565b6020604051808303816000875af19250505080156122fd575060408051601f3d908101601f191682019092526122fa91810190612bcc565b60015b61235a573d80801561232b576040519150601f19603f3d011682016040523d82523d6000602084013e612330565b606091505b5080516000036123525760405162461bcd60e51b815260040161074390612b3d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b0e565b506001949350505050565b6000600161238c84610daa565b6123969190612ad3565b6000838152600760205260409020549091508082146123e9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061242e90600190612ad3565b6000838152600960205260408120546008805493945090928490811061245657612456612853565b90600052602060002001549050806008838154811061247757612477612853565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124af576124af612be9565b6001900381819060005260206000200160009055905550505050565b60006124d683610daa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806101a00160405280600d905b606081526020019060019003908161251f5790505090565b6001600160e01b0319811681146109fc57600080fd5b60006020828403121561255f57600080fd5b813561256a81612537565b9392505050565b60005b8381101561258c578181015183820152602001612574565b8381111561092c5750506000910152565b600081518084526125b5816020860160208601612571565b601f01601f19169290920160200192915050565b60208152600061256a602083018461259d565b6000602082840312156125ee57600080fd5b5035919050565b80356001600160a01b038116811461260c57600080fd5b919050565b6000806040838503121561262457600080fd5b61262d836125f5565b946020939093013593505050565b60008060006060848603121561265057600080fd5b612659846125f5565b9250612667602085016125f5565b9150604084013590509250925092565b60006020828403121561268957600080fd5b61256a826125f5565b80151581146109fc57600080fd5b600080604083850312156126b357600080fd5b6126bc836125f5565b915060208301356126cc81612692565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561270357600080fd5b61270c856125f5565b935061271a602086016125f5565b925060408501359150606085013567ffffffffffffffff8082111561273e57600080fd5b818701915087601f83011261275257600080fd5b813581811115612764576127646126d7565b604051601f8201601f19908116603f0116810190838211818310171561278c5761278c6126d7565b816040528281528a60208487010111156127a557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156127dc57600080fd5b6127e5836125f5565b91506127f3602084016125f5565b90509250929050565b600181811c9082168061281057607f821691505b60208210810361283057634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561284857600080fd5b815161256a81612692565b634e487b7160e01b600052603260045260246000fd5b60008851602061287c8285838e01612571565b89519184019161288f8184848e01612571565b89519201916128a18184848d01612571565b88519201916128b38184848c01612571565b87519201916128c58184848b01612571565b86519201916128d78184848a01612571565b85519201916128e98184848901612571565b919091019a9950505050505050505050565b6e7b226e616d65223a2022415131202360881b8152825160009061292681600f850160208801612571565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a2022600f918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602f8201528351612989816049840160208801612571565b61227d60f01b60499290910191820152604b01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129dc81601d850160208701612571565b91909101601d0192915050565b600083516129fb818460208801612571565b835190830190612a0f818360208801612571565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082612a3d57612a3d612a18565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060018201612ab857612ab8612a90565b5060010190565b600082612ace57612ace612a18565b500490565b600082821015612ae557612ae5612a90565b500390565b60008219821115612afd57612afd612a90565b500190565b6000816000190483118215151615612b1c57612b1c612a90565b500290565b60008251612b33818460208701612571565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc29083018461259d565b9695505050505050565b600060208284031215612bde57600080fd5b815161256a81612537565b634e487b7160e01b600052603160045260246000fdfe3c2f746578743e3c7465787420783d2235302220793d223631322220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302037303020373030223e3c7374796c653e2e62617365207b2066696c6c3a20236666663b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20323270783b20666f6e742d7765696768743a20626f6c643b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330303532666622202f3e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3730302e30303030303029207363616c6528302e3031373530302c2d302e30313735303029222066696c6c3d222366666622207374726f6b653d226e6f6e65223e203c7061746820643d224d323938303020333731333520632d353931202d3631202d31313031202d323630202d31353530202d363035202d313336202d313035202d333939202d333732202d353037202d353135202d343439202d353937202d363631202d31323336202d373034202d32313138202d3336202d373539203937202d3134393020333732202d3230343020333738202d37353420393536202d313236352031373138202d3135313720363634202d3231392031343936202d32303720323133392033322034382031382038362032372039312032322034202d3520313331202d31363520323831202d333536206c323733202d3334382035393420302063343733203020353933203320353837203133202d342036202d32313120323733202d34353920353932202d32343820333139202d34353420353836202d34353920353932202d342038203237203435203839203130352034313520333936203732322039343320383734203135353320313234203530312031363020313133382039362031373035202d363920363037202d3235302031313239202d3534372031353739202d32323720333434202d35333820363533202d38363320383539202d33323820323037202d37303620333530202d3131303520343138202d323536203433202d363536203536202d3932302032397a206d353038202d313039352063363231202d34382031313230202d3338302031343135202d39343020313335202d32353620323234202d35343820323733202d393032203235202d313738203237202d323139203237202d3532382030202d333036202d32202d333532202d3236202d353235202d3439202d333535202d313337202d363531202d323639202d393033202d3931202d313734202d323835202d343431202d333039202d343237202d352033202d31333520313730202d32393020333730206c2d32383020333635202d353535203020632d3434322030202d353534202d33202d353438202d31322035202d3720323038202d32373620343532202d35393620323434202d33323120343430202d35383720343336202d353932202d35202d34202d3633202d3138202d313239202d3331202d313037202d3231202d313436202d3234202d333630202d3234202d3232332031202d3235302033202d333735203239202d35333620313130202d39333820343230202d3132303220393236202d31323920323437202d32313620353338202d32363520383835202d323520313736202d323720323135202d3236203533352030203331372032203336302032362035333120383020353635203237322031303035203538302031333239203335352033373220383633203535342031343235203531307a222f3e203c7061746820643d224d323233383220333730303320632d3131202d3332202d353435202d31353530202d31313837202d33333733202d363433202d31383233202d31313730202d33333233202d31313733202d33333332202d34202d3137203332202d313820363531202d3138206c363534203020323739203833332032383020383332203132373520332031323736203220323830202d38333220323830202d38333320363536202d3320363536202d32202d323820383220632d3332203933202d323334362036363533202d323335362036363831202d37203136202d3533203137202d373635203137206c2d3735382030202d3230202d35377a206d383834202d3135363520633432202d31323820323437202d37333920343536202d3133353820323038202d36313920333738202d3131323820333738202d313133322030202d35202d343233202d38202d393431202d38202d3537352030202d3933392034202d39333720392032203520323038203632302034353820313336352034353220313334382034353520313335362034383220313335362032362030203239202d3720313034202d3233327a222f3e3c7061746820643d224d3335313233203336353137206c2d383433202d3534312030202d3536342030202d3536342032382031382063313520313020333731203233372037393020353036203436362032393820373733203438382037383820343838206c323420302030202d323739302030202d323739302036313520302036313520302030203333393020302033333930202d3538372030202d353838202d31202d383432202d3534327a222f3e3c2f673e203c7465787420783d2235302220793d223436302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223439382220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223533362220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223537342220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122085aa5f89caacb908dbeb0b530bf1d7d8ac75788b4feb3edfff3c2b204252539c64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063667386f7116100f7578063a035b1fe11610095578063c87b56dd11610064578063c87b56dd14610500578063e985e9c514610520578063f2fde38b14610569578063fa7f71b11461058957600080fd5b8063a035b1fe14610497578063a0712d68146104ad578063a22cb465146104c0578063b88d4fde146104e057600080fd5b80638aa001fc116100d15780638aa001fc146104245780638da5cb5b1461044457806395d89b41146104625780639ec29b821461047757600080fd5b8063667386f7146103cf57806370a08231146103ef578063715018a61461040f57600080fd5b80632f745c591161016f57806342842e0e1161013e57806342842e0e1461034f57806342d9d8761461036f5780634f6ccce71461038f5780636352211e146103af57600080fd5b80632f745c59146102e257806332cb6b0c146103025780633ccfd60b1461031857806341f434341461032d57600080fd5b8063095ea7b3116101ab578063095ea7b3146102615780630b2503a61461028357806318160ddd146102a357806323b872dd146102c257600080fd5b806301ffc9a7146101d257806306fdde0314610207578063081812fc14610229575b600080fd5b3480156101de57600080fd5b506101f26101ed36600461254d565b6105a9565b60405190151581526020015b60405180910390f35b34801561021357600080fd5b5061021c6105d4565b6040516101fe91906125c9565b34801561023557600080fd5b506102496102443660046125dc565b610666565b6040516001600160a01b0390911681526020016101fe565b34801561026d57600080fd5b5061028161027c366004612611565b61068d565b005b34801561028f57600080fd5b5061021c61029e3660046125dc565b61075b565b3480156102af57600080fd5b506008545b6040519081526020016101fe565b3480156102ce57600080fd5b506102816102dd36600461263b565b610859565b3480156102ee57600080fd5b506102b46102fd366004612611565b610932565b34801561030e57600080fd5b506102b46103e881565b34801561032457600080fd5b506102816109c8565b34801561033957600080fd5b506102496daaeb6d7670e522a718067333cd4e81565b34801561035b57600080fd5b5061028161036a36600461263b565b6109ff565b34801561037b57600080fd5b5061021c61038a3660046125dc565b610acd565b34801561039b57600080fd5b506102b46103aa3660046125dc565b610bc2565b3480156103bb57600080fd5b506102496103ca3660046125dc565b610c55565b3480156103db57600080fd5b5061021c6103ea3660046125dc565b610cb5565b3480156103fb57600080fd5b506102b461040a366004612677565b610daa565b34801561041b57600080fd5b50610281610e30565b34801561043057600080fd5b5061021c61043f3660046125dc565b610e44565b34801561045057600080fd5b50600b546001600160a01b0316610249565b34801561046e57600080fd5b5061021c610f3a565b34801561048357600080fd5b5061021c6104923660046125dc565b610f49565b3480156104a357600080fd5b506102b4600c5481565b6102816104bb3660046125dc565b61103f565b3480156104cc57600080fd5b506102816104db3660046126a0565b61114a565b3480156104ec57600080fd5b506102816104fb3660046126ed565b61120e565b34801561050c57600080fd5b5061021c61051b3660046125dc565b6112ea565b34801561052c57600080fd5b506101f261053b3660046127c9565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561057557600080fd5b50610281610584366004612677565b611522565b34801561059557600080fd5b5061021c6105a43660046125dc565b611598565b60006001600160e01b0319821663780e9d6360e01b14806105ce57506105ce8261168d565b92915050565b6060600080546105e3906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461060f906127fc565b801561065c5780601f106106315761010080835404028352916020019161065c565b820191906000526020600020905b81548152906001019060200180831161063f57829003601f168201915b5050505050905090565b6000610671826116dd565b506000908152600460205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b1561074c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156106fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071f9190612836565b61074c57604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b610756838361173c565b505050565b60606105ce82604051806040016040528060088152602001674649465448524f5760c01b8152506011805480602002602001604051908101604052809291908181526020016000905b828210156108505783829060005260206000200180546107c3906127fc565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef906127fc565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b5050505050815260200190600101906107a4565b5050505061184c565b826daaeb6d7670e522a718067333cd4e3b1561092157336001600160a01b0382160361088f5761088a8484846118ba565b61092c565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156108de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109029190612836565b61092157604051633b79c77360e21b8152336004820152602401610743565b61092c8484846118ba565b50505050565b600061093d83610daa565b821061099f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610743565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6109d06118eb565b60405133904780156108fc02916000818181858888f193505050501580156109fc573d6000803e3d6000fd5b50565b826daaeb6d7670e522a718067333cd4e3b15610ac257336001600160a01b03821603610a305761088a848484611945565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa39190612836565b610ac257604051633b79c77360e21b8152336004820152602401610743565b61092c848484611945565b60606105ce82604051806040016040528060088152602001675349585448524f5760c01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610b35906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b61906127fc565b8015610bae5780601f10610b8357610100808354040283529160200191610bae565b820191906000526020600020905b815481529060010190602001808311610b9157829003601f168201915b505050505081526020019060010190610b16565b6000610bcd60085490565b8210610c305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610743565b60088281548110610c4357610c43612853565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105ce5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610743565b60606105ce82604051806040016040528060088152602001674649525354524f5760c01b815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610d1d906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d49906127fc565b8015610d965780601f10610d6b57610100808354040283529160200191610d96565b820191906000526020600020905b815481529060010190602001808311610d7957829003601f168201915b505050505081526020019060010190610cfe565b60006001600160a01b038216610e145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610743565b506001600160a01b031660009081526003602052604090205490565b610e386118eb565b610e426000611960565b565b60606105ce82604051806040016040528060098152602001685345434f4e44524f5760b81b815250600e805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610ead906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed9906127fc565b8015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b505050505081526020019060010190610e8e565b6060600180546105e3906127fc565b60606105ce8260405180604001604052806009815260200168464f55525448524f5760b81b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054610fb2906127fc565b80601f0160208091040260200160405190810160405280929190818152602001828054610fde906127fc565b801561102b5780601f106110005761010080835404028352916020019161102b565b820191906000526020600020905b81548152906001019060200180831161100e57829003601f168201915b505050505081526020019060010190610f93565b6002600a54036110915760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610743565b6002600a5580158015906110a757506103e88111155b6110e65760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b6044820152606401610743565b34600c5411156111385760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610743565b61114233826119b2565b506001600a55565b816daaeb6d7670e522a718067333cd4e3b1561120457604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc9190612836565b61120457604051633b79c77360e21b81526001600160a01b0382166004820152602401610743565b61075683836119d0565b836daaeb6d7670e522a718067333cd4e3b156112d757336001600160a01b0382160361124557611240858585856119db565b6112e3565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b89190612836565b6112d757604051633b79c77360e21b8152336004820152602401610743565b6112e3858585856119db565b5050505050565b60606112f461250f565b6040518061080001604052806107da8152602001612c296107da9139815261131b83610cb5565b816001602002018190525060405180606001604052806029815260200161340360299139604082015261134d83610e44565b606080830191909152604080519182019052602980825261342c6020830139608082015261137a83611598565b60a08201526040805160608101909152602980825261347e602083013960c08201526113a583610f49565b60e082015260408051606081019091526029808252612c0060208301396101008201526113d18361075b565b6101208201526040805160608101909152602980825261345560208301396101408201526113fe83610acd565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c0890151975160009861146398909101612869565b60408051808303601f190181529082905260e08401516101008501516101208601516101408701516101608801516101808901519597506114a996889690602001612869565b604051602081830303815290604052905060006114f66114c886611a0d565b6114d184611b16565b6040516020016114e29291906128fb565b604051602081830303815290604052611b16565b90508060405160200161150991906129a4565b60408051601f1981840301815291905295945050505050565b61152a6118eb565b6001600160a01b03811661158f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610743565b6109fc81611960565b60606105ce82604051806040016040528060088152602001675448495244524f5760c01b815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610850578382906000526020600020018054611600906127fc565b80601f016020809104026020016040519081016040528092919081815260200182805461162c906127fc565b80156116795780601f1061164e57610100808354040283529160200191611679565b820191906000526020600020905b81548152906001019060200180831161165c57829003601f168201915b5050505050815260200190600101906115e1565b60006001600160e01b031982166380ac58cd60e01b14806116be57506001600160e01b03198216635b5e139f60e01b145b806105ce57506301ffc9a760e01b6001600160e01b03198316146105ce565b6000818152600260205260409020546001600160a01b03166109fc5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610743565b600061174782610c55565b9050806001600160a01b0316836001600160a01b0316036117b45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610743565b336001600160a01b03821614806117d057506117d0813361053b565b6118425760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610743565b6107568383611c80565b606060006118828461185d87611a0d565b60405160200161186e9291906129e9565b604051602081830303815290604052611cee565b90506000838451836118949190612a2e565b815181106118a4576118a4612853565b6020026020010151905080925050509392505050565b6118c43382611d1f565b6118e05760405162461bcd60e51b815260040161074390612a42565b610756838383611d9d565b600b546001600160a01b03163314610e425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610743565b6107568383836040518060200160405280600081525061120e565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6119cc828260405180602001604052806000815250611f44565b5050565b6119cc338383611f77565b6119e53383611d1f565b611a015760405162461bcd60e51b815260040161074390612a42565b61092c84848484612045565b606081600003611a345750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a5e5780611a4881612aa6565b9150611a579050600a83612abf565b9150611a38565b60008167ffffffffffffffff811115611a7957611a796126d7565b6040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b5090505b8415611b0e57611ab8600183612ad3565b9150611ac5600a86612a2e565b611ad0906030612aea565b60f81b818381518110611ae557611ae5612853565b60200101906001600160f81b031916908160001a905350611b07600a86612abf565b9450611aa7565b949350505050565b80516060906000819003611b3a575050604080516020810190915260008152919050565b60006003611b49836002612aea565b611b539190612abf565b611b5e906004612b02565b90506000611b6d826020612aea565b67ffffffffffffffff811115611b8557611b856126d7565b6040519080825280601f01601f191660200182016040528015611baf576020820181803683370190505b50905060006040518060600160405280604081526020016134a7604091399050600181016020830160005b86811015611c3b576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611bda565b506003860660018114611c555760028114611c6657611c72565b613d3d60f01b600119830152611c72565b603d60f81b6000198301525b505050918152949350505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cb582610c55565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081604051602001611d019190612b21565b60408051601f19818403018152919052805160209091012092915050565b600080611d2b83610c55565b9050806001600160a01b0316846001600160a01b03161480611d7257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80611b0e5750836001600160a01b0316611d8b84610666565b6001600160a01b031614949350505050565b826001600160a01b0316611db082610c55565b6001600160a01b031614611e145760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610743565b6001600160a01b038216611e765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610743565b611e81838383612078565b611e8c600082611c80565b6001600160a01b0383166000908152600360205260408120805460019290611eb5908490612ad3565b90915550506001600160a01b0382166000908152600360205260408120805460019290611ee3908490612aea565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611f4e8383612130565b611f5b600084848461227e565b6107565760405162461bcd60e51b815260040161074390612b3d565b816001600160a01b0316836001600160a01b031603611fd85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610743565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612050848484611d9d565b61205c8484848461227e565b61092c5760405162461bcd60e51b815260040161074390612b3d565b6001600160a01b0383166120d3576120ce81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6120f6565b816001600160a01b0316836001600160a01b0316146120f6576120f6838261237f565b6001600160a01b03821661210d576107568161241c565b826001600160a01b0316826001600160a01b0316146107565761075682826124cb565b6001600160a01b0382166121865760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610743565b6000818152600260205260409020546001600160a01b0316156121eb5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610743565b6121f760008383612078565b6001600160a01b0382166000908152600360205260408120805460019290612220908490612aea565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561237457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906122c2903390899088908890600401612b8f565b6020604051808303816000875af19250505080156122fd575060408051601f3d908101601f191682019092526122fa91810190612bcc565b60015b61235a573d80801561232b576040519150601f19603f3d011682016040523d82523d6000602084013e612330565b606091505b5080516000036123525760405162461bcd60e51b815260040161074390612b3d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b0e565b506001949350505050565b6000600161238c84610daa565b6123969190612ad3565b6000838152600760205260409020549091508082146123e9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061242e90600190612ad3565b6000838152600960205260408120546008805493945090928490811061245657612456612853565b90600052602060002001549050806008838154811061247757612477612853565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124af576124af612be9565b6001900381819060005260206000200160009055905550505050565b60006124d683610daa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b604051806101a00160405280600d905b606081526020019060019003908161251f5790505090565b6001600160e01b0319811681146109fc57600080fd5b60006020828403121561255f57600080fd5b813561256a81612537565b9392505050565b60005b8381101561258c578181015183820152602001612574565b8381111561092c5750506000910152565b600081518084526125b5816020860160208601612571565b601f01601f19169290920160200192915050565b60208152600061256a602083018461259d565b6000602082840312156125ee57600080fd5b5035919050565b80356001600160a01b038116811461260c57600080fd5b919050565b6000806040838503121561262457600080fd5b61262d836125f5565b946020939093013593505050565b60008060006060848603121561265057600080fd5b612659846125f5565b9250612667602085016125f5565b9150604084013590509250925092565b60006020828403121561268957600080fd5b61256a826125f5565b80151581146109fc57600080fd5b600080604083850312156126b357600080fd5b6126bc836125f5565b915060208301356126cc81612692565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561270357600080fd5b61270c856125f5565b935061271a602086016125f5565b925060408501359150606085013567ffffffffffffffff8082111561273e57600080fd5b818701915087601f83011261275257600080fd5b813581811115612764576127646126d7565b604051601f8201601f19908116603f0116810190838211818310171561278c5761278c6126d7565b816040528281528a60208487010111156127a557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156127dc57600080fd5b6127e5836125f5565b91506127f3602084016125f5565b90509250929050565b600181811c9082168061281057607f821691505b60208210810361283057634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561284857600080fd5b815161256a81612692565b634e487b7160e01b600052603260045260246000fd5b60008851602061287c8285838e01612571565b89519184019161288f8184848e01612571565b89519201916128a18184848d01612571565b88519201916128b38184848c01612571565b87519201916128c58184848b01612571565b86519201916128d78184848a01612571565b85519201916128e98184848901612571565b919091019a9950505050505050505050565b6e7b226e616d65223a2022415131202360881b8152825160009061292681600f850160208801612571565b7f222c20226465736372697074696f6e223a2022222c2022696d616765223a2022600f918401918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602f8201528351612989816049840160208801612571565b61227d60f01b60499290910191820152604b01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516129dc81601d850160208701612571565b91909101601d0192915050565b600083516129fb818460208801612571565b835190830190612a0f818360208801612571565b01949350505050565b634e487b7160e01b600052601260045260246000fd5b600082612a3d57612a3d612a18565b500690565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600060018201612ab857612ab8612a90565b5060010190565b600082612ace57612ace612a18565b500490565b600082821015612ae557612ae5612a90565b500390565b60008219821115612afd57612afd612a90565b500190565b6000816000190483118215151615612b1c57612b1c612a90565b500290565b60008251612b33818460208701612571565b9190910192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bc29083018461259d565b9695505050505050565b600060208284031215612bde57600080fd5b815161256a81612537565b634e487b7160e01b600052603160045260246000fdfe3c2f746578743e3c7465787420783d2235302220793d223631322220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302037303020373030223e3c7374796c653e2e62617365207b2066696c6c3a20236666663b20666f6e742d66616d696c793a2073616e732d73657269663b20666f6e742d73697a653a20323270783b20666f6e742d7765696768743a20626f6c643b7d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330303532666622202f3e3c67207472616e73666f726d3d227472616e736c61746528302e3030303030302c3730302e30303030303029207363616c6528302e3031373530302c2d302e30313735303029222066696c6c3d222366666622207374726f6b653d226e6f6e65223e203c7061746820643d224d323938303020333731333520632d353931202d3631202d31313031202d323630202d31353530202d363035202d313336202d313035202d333939202d333732202d353037202d353135202d343439202d353937202d363631202d31323336202d373034202d32313138202d3336202d373539203937202d3134393020333732202d3230343020333738202d37353420393536202d313236352031373138202d3135313720363634202d3231392031343936202d32303720323133392033322034382031382038362032372039312032322034202d3520313331202d31363520323831202d333536206c323733202d3334382035393420302063343733203020353933203320353837203133202d342036202d32313120323733202d34353920353932202d32343820333139202d34353420353836202d34353920353932202d342038203237203435203839203130352034313520333936203732322039343320383734203135353320313234203530312031363020313133382039362031373035202d363920363037202d3235302031313239202d3534372031353739202d32323720333434202d35333820363533202d38363320383539202d33323820323037202d37303620333530202d3131303520343138202d323536203433202d363536203536202d3932302032397a206d353038202d313039352063363231202d34382031313230202d3338302031343135202d39343020313335202d32353620323234202d35343820323733202d393032203235202d313738203237202d323139203237202d3532382030202d333036202d32202d333532202d3236202d353235202d3439202d333535202d313337202d363531202d323639202d393033202d3931202d313734202d323835202d343431202d333039202d343237202d352033202d31333520313730202d32393020333730206c2d32383020333635202d353535203020632d3434322030202d353534202d33202d353438202d31322035202d3720323038202d32373620343532202d35393620323434202d33323120343430202d35383720343336202d353932202d35202d34202d3633202d3138202d313239202d3331202d313037202d3231202d313436202d3234202d333630202d3234202d3232332031202d3235302033202d333735203239202d35333620313130202d39333820343230202d3132303220393236202d31323920323437202d32313620353338202d32363520383835202d323520313736202d323720323135202d3236203533352030203331372032203336302032362035333120383020353635203237322031303035203538302031333239203335352033373220383633203535342031343235203531307a222f3e203c7061746820643d224d323233383220333730303320632d3131202d3332202d353435202d31353530202d31313837202d33333733202d363433202d31383233202d31313730202d33333233202d31313733202d33333332202d34202d3137203332202d313820363531202d3138206c363534203020323739203833332032383020383332203132373520332031323736203220323830202d38333220323830202d38333320363536202d3320363536202d32202d323820383220632d3332203933202d323334362036363533202d323335362036363831202d37203136202d3533203137202d373635203137206c2d3735382030202d3230202d35377a206d383834202d3135363520633432202d31323820323437202d37333920343536202d3133353820323038202d36313920333738202d3131323820333738202d313133322030202d35202d343233202d38202d393431202d38202d3537352030202d3933392034202d39333720392032203520323038203632302034353820313336352034353220313334382034353520313335362034383220313335362032362030203239202d3720313034202d3233327a222f3e3c7061746820643d224d3335313233203336353137206c2d383433202d3534312030202d3536342030202d3536342032382031382063313520313020333731203233372037393020353036203436362032393820373733203438382037383820343838206c323420302030202d323739302030202d323739302036313520302036313520302030203333393020302033333930202d3538372030202d353838202d31202d383432202d3534327a222f3e3c2f673e203c7465787420783d2235302220793d223436302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223439382220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223533362220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223635302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2235302220793d223537342220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122085aa5f89caacb908dbeb0b530bf1d7d8ac75788b4feb3edfff3c2b204252539c64736f6c634300080d0033

Deployed Bytecode Sourcemap

58663:10745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52513:224;;;;;;;;;;-1:-1:-1;52513:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;52513:224:0;;;;;;;;38707:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40220:171::-;;;;;;;;;;-1:-1:-1;40220:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;40220:171:0;1528:203:1;67860:175:0;;;;;;;;;;-1:-1:-1;67860:175:0;;;;;:::i;:::-;;:::i;:::-;;62701:133;;;;;;;;;;-1:-1:-1;62701:133:0;;;;;:::i;:::-;;:::i;53153:113::-;;;;;;;;;;-1:-1:-1;53241:10:0;:17;53153:113;;;2319:25:1;;;2307:2;2292:18;53153:113:0;2173:177:1;68043:181:0;;;;;;;;;;-1:-1:-1;68043:181:0;;;;;:::i;:::-;;:::i;52821:256::-;;;;;;;;;;-1:-1:-1;52821:256:0;;;;;:::i;:::-;;:::i;58819:41::-;;;;;;;;;;;;58856:4;58819:41;;67431:119;;;;;;;;;;;;;:::i;5693:143::-;;;;;;;;;;;;5793:42;5693:143;;68232:189;;;;;;;;;;-1:-1:-1;68232:189:0;;;;;:::i;:::-;;:::i;62842:133::-;;;;;;;;;;-1:-1:-1;62842:133:0;;;;;:::i;:::-;;:::i;53343:233::-;;;;;;;;;;-1:-1:-1;53343:233:0;;;;;:::i;:::-;;:::i;38418:222::-;;;;;;;;;;-1:-1:-1;38418:222:0;;;;;:::i;:::-;;:::i;62131:133::-;;;;;;;;;;-1:-1:-1;62131:133:0;;;;;:::i;:::-;;:::i;38149:207::-;;;;;;;;;;-1:-1:-1;38149:207:0;;;;;:::i;:::-;;:::i;15728:103::-;;;;;;;;;;;;;:::i;62272:136::-;;;;;;;;;;-1:-1:-1;62272:136:0;;;;;:::i;:::-;;:::i;15080:87::-;;;;;;;;;;-1:-1:-1;15153:6:0;;-1:-1:-1;;;;;15153:6:0;15080:87;;38876:104;;;;;;;;;;;;;:::i;62557:136::-;;;;;;;;;;-1:-1:-1;62557:136:0;;;;;:::i;:::-;;:::i;58760:40::-;;;;;;;;;;;;;;;;67166:253;;;;;;:::i;:::-;;:::i;67658:194::-;;;;;;;;;;-1:-1:-1;67658:194:0;;;;;:::i;:::-;;:::i;68429:247::-;;;;;;;;;;-1:-1:-1;68429:247:0;;;;;:::i;:::-;;:::i;63341:3817::-;;;;;;;;;;-1:-1:-1;63341:3817:0;;;;;:::i;:::-;;:::i;40689:164::-;;;;;;;;;;-1:-1:-1;40689:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40810:25:0;;;40786:4;40810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40689:164;15986:201;;;;;;;;;;-1:-1:-1;15986:201:0;;;;;:::i;:::-;;:::i;62416:133::-;;;;;;;;;;-1:-1:-1;62416:133:0;;;;;:::i;:::-;;:::i;52513:224::-;52615:4;-1:-1:-1;;;;;;52639:50:0;;-1:-1:-1;;;52639:50:0;;:90;;;52693:36;52717:11;52693:23;:36::i;:::-;52632:97;52513:224;-1:-1:-1;;52513:224:0:o;38707:100::-;38761:13;38794:5;38787:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38707:100;:::o;40220:171::-;40296:7;40316:23;40331:7;40316:14;:23::i;:::-;-1:-1:-1;40359:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40359:24:0;;40220:171::o;67860:175::-;67974:8;5793:42;7687:45;:49;7683:225;;7758:67;;-1:-1:-1;;;7758:67:0;;7809:4;7758:67;;;5698:34:1;-1:-1:-1;;;;;5768:15:1;;5748:18;;;5741:43;5793:42:0;;7758;;5633:18:1;;7758:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7753:144;;7853:28;;-1:-1:-1;;;7853:28:0;;-1:-1:-1;;;;;1692:32:1;;7853:28:0;;;1674:51:1;1647:18;;7853:28:0;;;;;;;;7753:144;67995:32:::1;68009:8;68019:7;67995:13;:32::i;:::-;67860:175:::0;;;:::o;62701:133::-;62757:13;62790:36;62796:7;62790:36;;;;;;;;;;;;;-1:-1:-1;;;62790:36:0;;;62817:8;62790:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;68043:181::-;68162:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;68179:37:::1;68198:4;68204:2;68208:7;68179:18;:37::i;:::-;7281:7:::0;;7218:85;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;5698:34:1;7380:10:0;5748:18:1;;;5741:43;5793:42:0;;7322;;5633:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;1674:51:1;1647:18;;7419:30:0;1528:203:1;7317:148:0;68179:37:::1;68198:4;68204:2;68208:7;68179:18;:37::i;:::-;68043:181:::0;;;;:::o;52821:256::-;52918:7;52954:23;52971:5;52954:16;:23::i;:::-;52946:5;:31;52938:87;;;;-1:-1:-1;;;52938:87:0;;6247:2:1;52938:87:0;;;6229:21:1;6286:2;6266:18;;;6259:30;6325:34;6305:18;;;6298:62;-1:-1:-1;;;6376:18:1;;;6369:41;6427:19;;52938:87:0;6045:407:1;52938:87:0;-1:-1:-1;;;;;;53043:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;52821:256::o;67431:119::-;14966:13;:11;:13::i;:::-;67479:51:::1;::::0;67487:10:::1;::::0;67508:21:::1;67479:51:::0;::::1;;;::::0;::::1;::::0;;;67508:21;67487:10;67479:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;67431:119::o:0;68232:189::-;68355:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;68372:41:::1;68395:4;68401:2;68405:7;68372:22;:41::i;7218:85::-:0;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;5698:34:1;7380:10:0;5748:18:1;;;5741:43;5793:42:0;;7322;;5633:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;1674:51:1;1647:18;;7419:30:0;1528:203:1;7317:148:0;68372:41:::1;68395:4;68401:2;68405:7;68372:22;:41::i;62842:133::-:0;62898:13;62931:36;62937:7;62931:36;;;;;;;;;;;;;-1:-1:-1;;;62931:36:0;;;62958:8;62931:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53343:233;53418:7;53454:30;53241:10;:17;;53153:113;53454:30;53446:5;:38;53438:95;;;;-1:-1:-1;;;53438:95:0;;6659:2:1;53438:95:0;;;6641:21:1;6698:2;6678:18;;;6671:30;6737:34;6717:18;;;6710:62;-1:-1:-1;;;6788:18:1;;;6781:42;6840:19;;53438:95:0;6457:408:1;53438:95:0;53551:10;53562:5;53551:17;;;;;;;;:::i;:::-;;;;;;;;;53544:24;;53343:233;;;:::o;38418:222::-;38490:7;38526:16;;;:7;:16;;;;;;-1:-1:-1;;;;;38526:16:0;;38553:56;;;;-1:-1:-1;;;38553:56:0;;7204:2:1;38553:56:0;;;7186:21:1;7243:2;7223:18;;;7216:30;-1:-1:-1;;;7262:18:1;;;7255:54;7326:18;;38553:56:0;7002:348:1;62131:133:0;62187:13;62220:36;62226:7;62220:36;;;;;;;;;;;;;-1:-1:-1;;;62220:36:0;;;62247:8;62220:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38149:207;38221:7;-1:-1:-1;;;;;38249:19:0;;38241:73;;;;-1:-1:-1;;;38241:73:0;;7557:2:1;38241:73:0;;;7539:21:1;7596:2;7576:18;;;7569:30;7635:34;7615:18;;;7608:62;-1:-1:-1;;;7686:18:1;;;7679:39;7735:19;;38241:73:0;7355:405:1;38241:73:0;-1:-1:-1;;;;;;38332:16:0;;;;;:9;:16;;;;;;;38149:207::o;15728:103::-;14966:13;:11;:13::i;:::-;15793:30:::1;15820:1;15793:18;:30::i;:::-;15728:103::o:0;62272:136::-;62329:13;62362:38;62368:7;62362:38;;;;;;;;;;;;;-1:-1:-1;;;62362:38:0;;;62390:9;62362:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38876:104;38932:13;38965:7;38958:14;;;;;:::i;62557:136::-;62614:13;62647:38;62653:7;62647:38;;;;;;;;;;;;;-1:-1:-1;;;62647:38:0;;;62675:9;62647:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67166:253;18198:1;18794:7;;:19;18786:63;;;;-1:-1:-1;;;18786:63:0;;7967:2:1;18786:63:0;;;7949:21:1;8006:2;7986:18;;;7979:30;8045:33;8025:18;;;8018:61;8096:18;;18786:63:0;7765:355:1;18786:63:0;18198:1;18927:7;:18;67244:11;;;;;:30:::1;;;67270:4;67259:7;:15;;67244:30;67236:59;;;::::0;-1:-1:-1;;;67236:59:0;;8327:2:1;67236:59:0::1;::::0;::::1;8309:21:1::0;8366:2;8346:18;;;8339:30;-1:-1:-1;;;8385:18:1;;;8378:46;8441:18;;67236:59:0::1;8125:340:1::0;67236:59:0::1;67323:9;67314:5;;:18;;67306:62;;;::::0;-1:-1:-1;;;67306:62:0;;8672:2:1;67306:62:0::1;::::0;::::1;8654:21:1::0;8711:2;8691:18;;;8684:30;8750:33;8730:18;;;8723:61;8801:18;;67306:62:0::1;8470:355:1::0;67306:62:0::1;67379:32;13711:10:::0;67403:7:::1;67379:9;:32::i;:::-;-1:-1:-1::0;18154:1:0;19106:7;:22;67166:253::o;67658:194::-;67780:8;5793:42;7687:45;:49;7683:225;;7758:67;;-1:-1:-1;;;7758:67:0;;7809:4;7758:67;;;5698:34:1;-1:-1:-1;;;;;5768:15:1;;5748:18;;;5741:43;5793:42:0;;7758;;5633:18:1;;7758:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7753:144;;7853:28;;-1:-1:-1;;;7853:28:0;;-1:-1:-1;;;;;1692:32:1;;7853:28:0;;;1674:51:1;1647:18;;7853:28:0;1528:203:1;7753:144:0;67801:43:::1;67825:8;67835;67801:23;:43::i;68429:247::-:0;68599:4;5793:42;6941:45;:49;6937:539;;7230:10;-1:-1:-1;;;;;7222:18:0;;;7218:85;;68621:47:::1;68644:4;68650:2;68654:7;68663:4;68621:22;:47::i;:::-;7281:7:::0;;7218:85;7322:69;;-1:-1:-1;;;7322:69:0;;7373:4;7322:69;;;5698:34:1;7380:10:0;5748:18:1;;;5741:43;5793:42:0;;7322;;5633:18:1;;7322:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7317:148;;7419:30;;-1:-1:-1;;;7419:30:0;;7438:10;7419:30;;;1674:51:1;1647:18;;7419:30:0;1528:203:1;7317:148:0;68621:47:::1;68644:4;68650:2;68654:7;68663:4;68621:22;:47::i;:::-;68429:247:::0;;;;;:::o;63341:3817::-;63406:13;63432:23;;:::i;:::-;63466:2047;;;;;;;;;;;;;;;;;;;65537:17;65546:7;65537:8;:17::i;:::-;65526:5;65532:1;65526:8;;;:28;;;;65567:54;;;;;;;;;;;;;;;;;:8;;;:54;65645:18;65655:7;65645:9;:18::i;:::-;65634:8;;;;:29;;;;65676:54;;;;;;;;;;;;;65634:8;65676:54;;;:8;;;:54;65754:17;65763:7;65754:8;:17::i;:::-;65743:8;;;:28;65784:54;;;;;;;;;;;;;;65743:8;65784:54;;;:8;;;:54;65862:18;65872:7;65862:9;:18::i;:::-;65851:8;;;:29;65893:54;;;;;;;;;;;;;;65851:8;65893:54;;;:8;;;:54;65971:17;65980:7;65971:8;:17::i;:::-;65960:8;;;:28;66001:55;;;;;;;;;;;;;;65960:8;66001:55;;;:9;;;:55;66081:17;66090:7;66081:8;:17::i;:::-;66069:9;;;:29;66111:27;;;;;;;;;;;-1:-1:-1;;;66069:9:0;66111:27;;;;;;;:9;;;:27;;;;66222:8;;66232;;;;66242;;;;66252;;;;66262;;;;66272;;;;66282;;;;66205:86;;-1:-1:-1;;66205:86:0;;66282:8;;66205:86;;:::i;:::-;;;;;;;-1:-1:-1;;66205:86:0;;;;;;;66403:8;;;;66430;;;;66457;;;;66484:9;;;;66512;;;;66540;;;;66205:86;;-1:-1:-1;66343:221:0;;66205:86;;66540:9;66403:8;66343:221;;:::i;:::-;;;;;;;;;;;;;66313:262;;66588:18;66609:426;66777:17;66786:7;66777:8;:17::i;:::-;66908:28;66928:6;66908:13;:28::i;:::-;66690:300;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66609:13;:426::i;:::-;66588:447;;67112:4;67062:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;67062:55:0;;;;;;;;;;63341:3817;-1:-1:-1;;;;;63341:3817:0:o;15986:201::-;14966:13;:11;:13::i;:::-;-1:-1:-1;;;;;16075:22:0;::::1;16067:73;;;::::0;-1:-1:-1;;;16067:73:0;;12018:2:1;16067:73:0::1;::::0;::::1;12000:21:1::0;12057:2;12037:18;;;12030:30;12096:34;12076:18;;;12069:62;-1:-1:-1;;;12147:18:1;;;12140:36;12193:19;;16067:73:0::1;11816:402:1::0;16067:73:0::1;16151:28;16170:8;16151:18;:28::i;62416:133::-:0;62472:13;62505:36;62511:7;62505:36;;;;;;;;;;;;;-1:-1:-1;;;62505:36:0;;;62532:8;62505:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37780:305;37882:4;-1:-1:-1;;;;;;37919:40:0;;-1:-1:-1;;;37919:40:0;;:105;;-1:-1:-1;;;;;;;37976:48:0;;-1:-1:-1;;;37976:48:0;37919:105;:158;;;-1:-1:-1;;;;;;;;;;30645:40:0;;;38041:36;30536:157;48195:135;43478:4;43502:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43502:16:0;48269:53;;;;-1:-1:-1;;;48269:53:0;;7204:2:1;48269:53:0;;;7186:21:1;7243:2;7223:18;;;7216:30;-1:-1:-1;;;7262:18:1;;;7255:54;7326:18;;48269:53:0;7002:348:1;39737:417:0;39818:13;39834:23;39849:7;39834:14;:23::i;:::-;39818:39;;39882:5;-1:-1:-1;;;;;39876:11:0;:2;-1:-1:-1;;;;;39876:11:0;;39868:57;;;;-1:-1:-1;;;39868:57:0;;12425:2:1;39868:57:0;;;12407:21:1;12464:2;12444:18;;;12437:30;12503:34;12483:18;;;12476:62;-1:-1:-1;;;12554:18:1;;;12547:31;12595:19;;39868:57:0;12223:397:1;39868:57:0;13711:10;-1:-1:-1;;;;;39960:21:0;;;;:62;;-1:-1:-1;39985:37:0;40002:5;13711:10;40689:164;:::i;39985:37::-;39938:174;;;;-1:-1:-1;;;39938:174:0;;12827:2:1;39938:174:0;;;12809:21:1;12866:2;12846:18;;;12839:30;12905:34;12885:18;;;12878:62;12976:32;12956:18;;;12949:60;13026:19;;39938:174:0;12625:426:1;39938:174:0;40125:21;40134:2;40138:7;40125:8;:21::i;62983:350::-;63126:13;63152:12;63167:62;63198:9;63209:17;63218:7;63209:8;:17::i;:::-;63181:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63167:6;:62::i;:::-;63152:77;;63240:20;63263:11;63282;:18;63275:4;:25;;;;:::i;:::-;63263:38;;;;;;;;:::i;:::-;;;;;;;63240:61;;63319:6;63312:13;;;;62983:350;;;;;:::o;40920:336::-;41115:41;13711:10;41148:7;41115:18;:41::i;:::-;41107:100;;;;-1:-1:-1;;;41107:100:0;;;;;;;:::i;:::-;41220:28;41230:4;41236:2;41240:7;41220:9;:28::i;15245:132::-;15153:6;;-1:-1:-1;;;;;15153:6:0;13711:10;15309:23;15301:68;;;;-1:-1:-1;;;15301:68:0;;14397:2:1;15301:68:0;;;14379:21:1;;;14416:18;;;14409:30;14475:34;14455:18;;;14448:62;14527:18;;15301:68:0;14195:356:1;41327:185:0;41465:39;41482:4;41488:2;41492:7;41465:39;;;;;;;;;;;;:16;:39::i;16347:191::-;16440:6;;;-1:-1:-1;;;;;16457:17:0;;;-1:-1:-1;;;;;;16457:17:0;;;;;;;16490:40;;16440:6;;;16457:17;16440:6;;16490:40;;16421:16;;16490:40;16410:128;16347:191;:::o;44313:110::-;44389:26;44399:2;44403:7;44389:26;;;;;;;;;;;;:9;:26::i;:::-;44313:110;;:::o;40463:155::-;40558:52;13711:10;40591:8;40601;40558:18;:52::i;41583:323::-;41757:41;13711:10;41790:7;41757:18;:41::i;:::-;41749:100;;;;-1:-1:-1;;;41749:100:0;;;;;;;:::i;:::-;41860:38;41874:4;41880:2;41884:7;41893:4;41860:13;:38::i;68684:715::-;68740:13;68953:5;68962:1;68953:10;68949:53;;-1:-1:-1;;68980:10:0;;;;;;;;;;;;-1:-1:-1;;;68980:10:0;;;;;68684:715::o;68949:53::-;69027:5;69012:12;69068:78;69075:9;;69068:78;;69101:8;;;;:::i;:::-;;-1:-1:-1;69124:10:0;;-1:-1:-1;69132:2:0;69124:10;;:::i;:::-;;;69068:78;;;69156:19;69188:6;69178:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69178:17:0;;69156:39;;69206:154;69213:10;;69206:154;;69240:11;69250:1;69240:11;;:::i;:::-;;-1:-1:-1;69309:10:0;69317:2;69309:5;:10;:::i;:::-;69296:24;;:2;:24;:::i;:::-;69283:39;;69266:6;69273;69266:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;69266:56:0;;;;;;;;-1:-1:-1;69337:11:0;69346:2;69337:11;;:::i;:::-;;;69206:154;;;69384:6;68684:715;-1:-1:-1;;;;68684:715:0:o;8839:1607::-;8937:11;;8897:13;;8923:11;8963:8;;;8959:23;;-1:-1:-1;;8973:9:0;;;;;;;;;-1:-1:-1;8973:9:0;;;8839:1607;-1:-1:-1;8839:1607:0:o;8959:23::-;9034:18;9072:1;9061:7;:3;9067:1;9061:7;:::i;:::-;9060:13;;;;:::i;:::-;9055:19;;:1;:19;:::i;:::-;9034:40;-1:-1:-1;9132:19:0;9164:15;9034:40;9177:2;9164:15;:::i;:::-;9154:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9154:26:0;;9132:48;;9193:18;9214:5;;;;;;;;;;;;;;;;;9193:26;;9283:1;9276:5;9272:13;9328:2;9320:6;9316:15;9379:1;9347:777;9402:3;9399:1;9396:10;9347:777;;;9457:1;9500:12;;;;;9494:19;9595:4;9583:2;9579:14;;;;;9561:40;;9555:47;9704:2;9700:14;;;9696:25;;9682:40;;9676:47;9833:1;9829:13;;;9825:24;;9811:39;;9805:46;9953:16;;;;9939:31;;9933:38;9631:1;9627:11;;;9725:4;9672:58;;;9663:68;9756:11;;9801:57;;;9792:67;;;;9884:11;;9929:49;;9920:59;10008:3;10004:13;10037:22;;10107:1;10092:17;;;;9450:9;9347:777;;;9351:44;10156:1;10151:3;10147:11;10177:1;10172:84;;;;10275:1;10270:82;;;;10140:212;;10172:84;-1:-1:-1;;;;;10205:17:0;;10198:43;10172:84;;10270:82;-1:-1:-1;;;;;10303:17:0;;10296:41;10140:212;-1:-1:-1;;;10368:26:0;;;10375:6;8839:1607;-1:-1:-1;;;;8839:1607:0:o;47474:174::-;47549:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;47549:29:0;-1:-1:-1;;;;;47549:29:0;;;;;;;;:24;;47603:23;47549:24;47603:14;:23::i;:::-;-1:-1:-1;;;;;47594:46:0;;;;;;;;;;;47474:174;;:::o;61985:138::-;62045:7;62107:5;62090:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;62090:23:0;;;;;;;;;62080:34;;62090:23;62080:34;;;;;61985:138;-1:-1:-1;;61985:138:0:o;43707:264::-;43800:4;43817:13;43833:23;43848:7;43833:14;:23::i;:::-;43817:39;;43886:5;-1:-1:-1;;;;;43875:16:0;:7;-1:-1:-1;;;;;43875:16:0;;:52;;;-1:-1:-1;;;;;;40810:25:0;;;40786:4;40810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;43895:32;43875:87;;;;43955:7;-1:-1:-1;;;;;43931:31:0;:20;43943:7;43931:11;:20::i;:::-;-1:-1:-1;;;;;43931:31:0;;43867:96;43707:264;-1:-1:-1;;;;43707:264:0:o;46730:625::-;46889:4;-1:-1:-1;;;;;46862:31:0;:23;46877:7;46862:14;:23::i;:::-;-1:-1:-1;;;;;46862:31:0;;46854:81;;;;-1:-1:-1;;;46854:81:0;;15872:2:1;46854:81:0;;;15854:21:1;15911:2;15891:18;;;15884:30;15950:34;15930:18;;;15923:62;-1:-1:-1;;;16001:18:1;;;15994:35;16046:19;;46854:81:0;15670:401:1;46854:81:0;-1:-1:-1;;;;;46954:16:0;;46946:65;;;;-1:-1:-1;;;46946:65:0;;16278:2:1;46946:65:0;;;16260:21:1;16317:2;16297:18;;;16290:30;16356:34;16336:18;;;16329:62;-1:-1:-1;;;16407:18:1;;;16400:34;16451:19;;46946:65:0;16076:400:1;46946:65:0;47024:39;47045:4;47051:2;47055:7;47024:20;:39::i;:::-;47128:29;47145:1;47149:7;47128:8;:29::i;:::-;-1:-1:-1;;;;;47170:15:0;;;;;;:9;:15;;;;;:20;;47189:1;;47170:15;:20;;47189:1;;47170:20;:::i;:::-;;;;-1:-1:-1;;;;;;;47201:13:0;;;;;;:9;:13;;;;;:18;;47218:1;;47201:13;:18;;47218:1;;47201:18;:::i;:::-;;;;-1:-1:-1;;47230:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;47230:21:0;-1:-1:-1;;;;;47230:21:0;;;;;;;;;47269:27;;47230:16;;47269:27;;;;;;;67860:175;;;:::o;44650:319::-;44779:18;44785:2;44789:7;44779:5;:18::i;:::-;44830:53;44861:1;44865:2;44869:7;44878:4;44830:22;:53::i;:::-;44808:153;;;;-1:-1:-1;;;44808:153:0;;;;;;;:::i;47791:315::-;47946:8;-1:-1:-1;;;;;47937:17:0;:5;-1:-1:-1;;;;;47937:17:0;;47929:55;;;;-1:-1:-1;;;47929:55:0;;17102:2:1;47929:55:0;;;17084:21:1;17141:2;17121:18;;;17114:30;17180:27;17160:18;;;17153:55;17225:18;;47929:55:0;16900:349:1;47929:55:0;-1:-1:-1;;;;;47995:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;47995:46:0;;;;;;;;;;48057:41;;540::1;;;48057::0;;513:18:1;48057:41:0;;;;;;;47791:315;;;:::o;42787:313::-;42943:28;42953:4;42959:2;42963:7;42943:9;:28::i;:::-;42990:47;43013:4;43019:2;43023:7;43032:4;42990:22;:47::i;:::-;42982:110;;;;-1:-1:-1;;;42982:110:0;;;;;;;:::i;54189:589::-;-1:-1:-1;;;;;54395:18:0;;54391:187;;54430:40;54462:7;55605:10;:17;;55578:24;;;;:15;:24;;;;;:44;;;55633:24;;;;;;;;;;;;55501:164;54430:40;54391:187;;;54500:2;-1:-1:-1;;;;;54492:10:0;:4;-1:-1:-1;;;;;54492:10:0;;54488:90;;54519:47;54552:4;54558:7;54519:32;:47::i;:::-;-1:-1:-1;;;;;54592:16:0;;54588:183;;54625:45;54662:7;54625:36;:45::i;54588:183::-;54698:4;-1:-1:-1;;;;;54692:10:0;:2;-1:-1:-1;;;;;54692:10:0;;54688:83;;54719:40;54747:2;54751:7;54719:27;:40::i;45305:439::-;-1:-1:-1;;;;;45385:16:0;;45377:61;;;;-1:-1:-1;;;45377:61:0;;17456:2:1;45377:61:0;;;17438:21:1;;;17475:18;;;17468:30;17534:34;17514:18;;;17507:62;17586:18;;45377:61:0;17254:356:1;45377:61:0;43478:4;43502:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43502:16:0;:30;45449:58;;;;-1:-1:-1;;;45449:58:0;;17817:2:1;45449:58:0;;;17799:21:1;17856:2;17836:18;;;17829:30;17895;17875:18;;;17868:58;17943:18;;45449:58:0;17615:352:1;45449:58:0;45520:45;45549:1;45553:2;45557:7;45520:20;:45::i;:::-;-1:-1:-1;;;;;45578:13:0;;;;;;:9;:13;;;;;:18;;45595:1;;45578:13;:18;;45595:1;;45578:18;:::i;:::-;;;;-1:-1:-1;;45607:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;45607:21:0;-1:-1:-1;;;;;45607:21:0;;;;;;;;45646:33;;45607:16;;;45646:33;;45607:16;;45646:33;44313:110;;:::o;48894:853::-;49048:4;-1:-1:-1;;;;;49069:13:0;;20675:19;:23;49065:675;;49105:71;;-1:-1:-1;;;49105:71:0;;-1:-1:-1;;;;;49105:36:0;;;;;:71;;13711:10;;49156:4;;49162:7;;49171:4;;49105:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49105:71:0;;;;;;;;-1:-1:-1;;49105:71:0;;;;;;;;;;;;:::i;:::-;;;49101:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49346:6;:13;49363:1;49346:18;49342:328;;49389:60;;-1:-1:-1;;;49389:60:0;;;;;;;:::i;49342:328::-;49620:6;49614:13;49605:6;49601:2;49597:15;49590:38;49101:584;-1:-1:-1;;;;;;49227:51:0;-1:-1:-1;;;49227:51:0;;-1:-1:-1;49220:58:0;;49065:675;-1:-1:-1;49724:4:0;48894:853;;;;;;:::o;56292:988::-;56558:22;56608:1;56583:22;56600:4;56583:16;:22::i;:::-;:26;;;;:::i;:::-;56620:18;56641:26;;;:17;:26;;;;;;56558:51;;-1:-1:-1;56774:28:0;;;56770:328;;-1:-1:-1;;;;;56841:18:0;;56819:19;56841:18;;;:12;:18;;;;;;;;:34;;;;;;;;;56892:30;;;;;;:44;;;57009:30;;:17;:30;;;;;:43;;;56770:328;-1:-1:-1;57194:26:0;;;;:17;:26;;;;;;;;57187:33;;;-1:-1:-1;;;;;57238:18:0;;;;;:12;:18;;;;;:34;;;;;;;57231:41;56292:988::o;57575:1079::-;57853:10;:17;57828:22;;57853:21;;57873:1;;57853:21;:::i;:::-;57885:18;57906:24;;;:15;:24;;;;;;58279:10;:26;;57828:46;;-1:-1:-1;57906:24:0;;57828:46;;58279:26;;;;;;:::i;:::-;;;;;;;;;58257:48;;58343:11;58318:10;58329;58318:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;58423:28;;;:15;:28;;;;;;;:41;;;58595:24;;;;;58588:31;58630:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;57646:1008;;;57575:1079;:::o;55079:221::-;55164:14;55181:20;55198:2;55181:16;:20::i;:::-;-1:-1:-1;;;;;55212:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;55257:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;55079:221:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2927:186::-;2986:6;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;3078:29;3097:9;3078:29;:::i;3118:118::-;3204:5;3197:13;3190:21;3183:5;3180:32;3170:60;;3226:1;3223;3216:12;3241:315;3306:6;3314;3367:2;3355:9;3346:7;3342:23;3338:32;3335:52;;;3383:1;3380;3373:12;3335:52;3406:29;3425:9;3406:29;:::i;:::-;3396:39;;3485:2;3474:9;3470:18;3457:32;3498:28;3520:5;3498:28;:::i;:::-;3545:5;3535:15;;;3241:315;;;;;:::o;3561:127::-;3622:10;3617:3;3613:20;3610:1;3603:31;3653:4;3650:1;3643:15;3677:4;3674:1;3667:15;3693:1138;3788:6;3796;3804;3812;3865:3;3853:9;3844:7;3840:23;3836:33;3833:53;;;3882:1;3879;3872:12;3833:53;3905:29;3924:9;3905:29;:::i;:::-;3895:39;;3953:38;3987:2;3976:9;3972:18;3953:38;:::i;:::-;3943:48;;4038:2;4027:9;4023:18;4010:32;4000:42;;4093:2;4082:9;4078:18;4065:32;4116:18;4157:2;4149:6;4146:14;4143:34;;;4173:1;4170;4163:12;4143:34;4211:6;4200:9;4196:22;4186:32;;4256:7;4249:4;4245:2;4241:13;4237:27;4227:55;;4278:1;4275;4268:12;4227:55;4314:2;4301:16;4336:2;4332;4329:10;4326:36;;;4342:18;;:::i;:::-;4417:2;4411:9;4385:2;4471:13;;-1:-1:-1;;4467:22:1;;;4491:2;4463:31;4459:40;4447:53;;;4515:18;;;4535:22;;;4512:46;4509:72;;;4561:18;;:::i;:::-;4601:10;4597:2;4590:22;4636:2;4628:6;4621:18;4676:7;4671:2;4666;4662;4658:11;4654:20;4651:33;4648:53;;;4697:1;4694;4687:12;4648:53;4753:2;4748;4744;4740:11;4735:2;4727:6;4723:15;4710:46;4798:1;4793:2;4788;4780:6;4776:15;4772:24;4765:35;4819:6;4809:16;;;;;;;3693:1138;;;;;;;:::o;4836:260::-;4904:6;4912;4965:2;4953:9;4944:7;4940:23;4936:32;4933:52;;;4981:1;4978;4971:12;4933:52;5004:29;5023:9;5004:29;:::i;:::-;4994:39;;5052:38;5086:2;5075:9;5071:18;5052:38;:::i;:::-;5042:48;;4836:260;;;;;:::o;5101:380::-;5180:1;5176:12;;;;5223;;;5244:61;;5298:4;5290:6;5286:17;5276:27;;5244:61;5351:2;5343:6;5340:14;5320:18;5317:38;5314:161;;5397:10;5392:3;5388:20;5385:1;5378:31;5432:4;5429:1;5422:15;5460:4;5457:1;5450:15;5314:161;;5101:380;;;:::o;5795:245::-;5862:6;5915:2;5903:9;5894:7;5890:23;5886:32;5883:52;;;5931:1;5928;5921:12;5883:52;5963:9;5957:16;5982:28;6004:5;5982:28;:::i;6870:127::-;6931:10;6926:3;6922:20;6919:1;6912:31;6962:4;6959:1;6952:15;6986:4;6983:1;6976:15;8830:1449;9249:3;9287:6;9281:13;9313:4;9326:51;9370:6;9365:3;9360:2;9352:6;9348:15;9326:51;:::i;:::-;9440:13;;9399:16;;;;9462:55;9440:13;9399:16;9484:15;;;9462:55;:::i;:::-;9584:13;;9539:20;;;9606:55;9584:13;9539:20;9628:15;;;9606:55;:::i;:::-;9728:13;;9683:20;;;9750:55;9728:13;9683:20;9772:15;;;9750:55;:::i;:::-;9872:13;;9827:20;;;9894:55;9872:13;9827:20;9916:15;;;9894:55;:::i;:::-;10016:13;;9971:20;;;10038:55;10016:13;9971:20;10060:15;;;10038:55;:::i;:::-;10160:13;;10115:20;;;10182:55;10160:13;10115:20;10204:15;;;10182:55;:::i;:::-;10253:20;;;;;8830:1449;-1:-1:-1;;;;;;;;;;8830:1449:1:o;10284:1074::-;-1:-1:-1;;;10784:55:1;;10862:13;;10766:3;;10884:62;10862:13;10934:2;10925:12;;10918:4;10906:17;;10884:62;:::i;:::-;11010:66;11005:2;10965:16;;;10997:11;;;10990:87;11106:28;11101:2;11093:11;;11086:49;11160:13;;11182:63;11160:13;11231:2;11223:11;;11216:4;11204:17;;11182:63;:::i;:::-;-1:-1:-1;;;11305:2:1;11264:17;;;;11297:11;;;11290:35;11349:2;11341:11;;10284:1074;-1:-1:-1;;;;10284:1074:1:o;11363:448::-;11625:31;11620:3;11613:44;11595:3;11686:6;11680:13;11702:62;11757:6;11752:2;11747:3;11743:12;11736:4;11728:6;11724:17;11702:62;:::i;:::-;11784:16;;;;11802:2;11780:25;;11363:448;-1:-1:-1;;11363:448:1:o;13056:470::-;13235:3;13273:6;13267:13;13289:53;13335:6;13330:3;13323:4;13315:6;13311:17;13289:53;:::i;:::-;13405:13;;13364:16;;;;13427:57;13405:13;13364:16;13461:4;13449:17;;13427:57;:::i;:::-;13500:20;;13056:470;-1:-1:-1;;;;13056:470:1:o;13531:127::-;13592:10;13587:3;13583:20;13580:1;13573:31;13623:4;13620:1;13613:15;13647:4;13644:1;13637:15;13663:112;13695:1;13721;13711:35;;13726:18;;:::i;:::-;-1:-1:-1;13760:9:1;;13663:112::o;13780:410::-;13982:2;13964:21;;;14021:2;14001:18;;;13994:30;14060:34;14055:2;14040:18;;14033:62;-1:-1:-1;;;14126:2:1;14111:18;;14104:44;14180:3;14165:19;;13780:410::o;14556:127::-;14617:10;14612:3;14608:20;14605:1;14598:31;14648:4;14645:1;14638:15;14672:4;14669:1;14662:15;14688:135;14727:3;14748:17;;;14745:43;;14768:18;;:::i;:::-;-1:-1:-1;14815:1:1;14804:13;;14688:135::o;14828:120::-;14868:1;14894;14884:35;;14899:18;;:::i;:::-;-1:-1:-1;14933:9:1;;14828:120::o;14953:125::-;14993:4;15021:1;15018;15015:8;15012:34;;;15026:18;;:::i;:::-;-1:-1:-1;15063:9:1;;14953:125::o;15083:128::-;15123:3;15154:1;15150:6;15147:1;15144:13;15141:39;;;15160:18;;:::i;:::-;-1:-1:-1;15196:9:1;;15083:128::o;15216:168::-;15256:7;15322:1;15318;15314:6;15310:14;15307:1;15304:21;15299:1;15292:9;15285:17;15281:45;15278:71;;;15329:18;;:::i;:::-;-1:-1:-1;15369:9:1;;15216:168::o;15389:276::-;15520:3;15558:6;15552:13;15574:53;15620:6;15615:3;15608:4;15600:6;15596:17;15574:53;:::i;:::-;15643:16;;;;;15389:276;-1:-1:-1;;15389:276:1:o;16481:414::-;16683:2;16665:21;;;16722:2;16702:18;;;16695:30;16761:34;16756:2;16741:18;;16734:62;-1:-1:-1;;;16827:2:1;16812:18;;16805:48;16885:3;16870:19;;16481:414::o;17972:489::-;-1:-1:-1;;;;;18241:15:1;;;18223:34;;18293:15;;18288:2;18273:18;;18266:43;18340:2;18325:18;;18318:34;;;18388:3;18383:2;18368:18;;18361:31;;;18166:4;;18409:46;;18435:19;;18427:6;18409:46;:::i;:::-;18401:54;17972:489;-1:-1:-1;;;;;;17972:489:1:o;18466:249::-;18535:6;18588:2;18576:9;18567:7;18563:23;18559:32;18556:52;;;18604:1;18601;18594:12;18556:52;18636:9;18630:16;18655:30;18679:5;18655:30;:::i;18720:127::-;18781:10;18776:3;18772:20;18769:1;18762:31;18812:4;18809:1;18802:15;18836:4;18833:1;18826:15

Swarm Source

ipfs://85aa5f89caacb908dbeb0b530bf1d7d8ac75788b4feb3edfff3c2b204252539c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.