ETH Price: $3,065.89 (+2.87%)
Gas: 1 Gwei

Token

Mirascapes (MIRA)
 

Overview

Max Total Supply

2,605 MIRA

Holders

1,402

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MIRA
0x832Cf0Afcb378336c8AF9D9904B28C9D65857e38
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:
mirascapes

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-15
*/

// File: IERC2981Royalties.sol


pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}
// File: 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: 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.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry 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: RevokableOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  RevokableOperatorFilterer
 * @notice This contract is meant to allow contracts to permanently opt out of the OperatorFilterRegistry. The Registry
 *         itself has an "unregister" function, but if the contract is ownable, the owner can re-register at any point.
 *         As implemented, this abstract contract allows the contract owner to toggle the
 *         isOperatorFilterRegistryRevoked flag in order to permanently bypass the OperatorFilterRegistry checks.
 */
abstract contract RevokableOperatorFilterer is OperatorFilterer {
    error OnlyOwner();
    error AlreadyRevoked();

    bool private _isOperatorFilterRegistryRevoked;

    modifier onlyAllowedOperator(address from) override {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (!_isOperatorFilterRegistryRevoked && 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) override {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (!_isOperatorFilterRegistryRevoked && address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }

    /**
     * @notice Disable the isOperatorFilterRegistryRevoked flag. OnlyOwner.
     */
    function revokeOperatorFilterRegistry() external {
        if (msg.sender != owner()) {
            revert OnlyOwner();
        }
        if (_isOperatorFilterRegistryRevoked) {
            revert AlreadyRevoked();
        }
        _isOperatorFilterRegistryRevoked = true;
    }

    function isOperatorFilterRegistryRevoked() public view returns (bool) {
        return _isOperatorFilterRegistryRevoked;
    }

    /**
     * @dev assume the contract has an owner, but leave specific Ownable implementation up to inheriting contract
     */
    function owner() public view virtual returns (address);
}
// File: RevokableDefaultOperatorFilterer.sol


pragma solidity ^0.8.13;



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

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
// 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);
    }
}

// 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: ERC2981Base.sol


pragma solidity ^0.8.0;



/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(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: TinyERC721.sol


pragma solidity ^0.8.0;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error TokenDataQueryForNonexistentToken();
error OwnerQueryForNonexistentToken();
error OperatorQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract TinyERC721 is Context, ERC165, IERC721, IERC721Metadata {
  using Address for address;
  using Strings for uint256;

  struct TokenData {
    address owner;
    bytes12 aux;
  }

  uint256 private immutable _maxBatchSize;

  mapping(uint256 => TokenData) private _tokens;
  uint256 private _mintCounter;

  string private _name;
  string private _symbol;

  mapping(uint256 => address) private _tokenApprovals;
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    _name = name_;
    _symbol = symbol_;
    _maxBatchSize = maxBatchSize_;
  }

  function totalSupply() public view virtual returns (uint256) {
    return _mintCounter;
  }

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

  function name() public view virtual override returns (string memory) {
    return _name;
  }

  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

  function balanceOf(address owner) public view virtual override returns (uint256) {
    if (owner == address(0)) revert BalanceQueryForZeroAddress();

    uint256 total = totalSupply();
    uint256 count;
    address lastOwner;
    for (uint256 i; i < total; ++i) {
      address tokenOwner = _tokens[i].owner;
      if (tokenOwner != address(0)) lastOwner = tokenOwner;
      if (lastOwner == owner) ++count;
    }

    return count;
  }

  function _tokenData(uint256 tokenId) internal view returns (TokenData storage) {
    if (!_exists(tokenId)) revert TokenDataQueryForNonexistentToken();

    TokenData storage token = _tokens[tokenId];
    uint256 currentIndex = tokenId;
    while (token.owner == address(0)) {
      unchecked {
        --currentIndex;
      }
      token = _tokens[currentIndex];
    }

    return token;
  }

  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
    return _tokenData(tokenId).owner;
  }

  function approve(address to, uint256 tokenId) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    address owner = token.owner;
    if (to == owner) revert ApprovalToCurrentOwner();

    if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
      revert ApprovalCallerNotOwnerNorApproved();
    }

    _approve(to, tokenId, token);
  }

  function getApproved(uint256 tokenId) public view virtual override returns (address) {
    if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

    return _tokenApprovals[tokenId];
  }

  function setApprovalForAll(address operator, bool approved) public virtual override {
    if (operator == _msgSender()) revert ApproveToCaller();

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

  function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
    return _operatorApprovals[owner][operator];
  }

  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    if (!_isApprovedOrOwner(_msgSender(), tokenId, token)) revert TransferCallerNotOwnerNorApproved();

    _transfer(from, to, tokenId, token);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    safeTransferFrom(from, to, tokenId, '');
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    TokenData memory token = _tokenData(tokenId);
    if (!_isApprovedOrOwner(_msgSender(), tokenId, token)) revert TransferCallerNotOwnerNorApproved();

    _safeTransfer(from, to, tokenId, token, _data);
  }

  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    TokenData memory token,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId, token);

    if (to.isContract() && !_checkOnERC721Received(from, to, tokenId, _data))
      revert TransferToNonERC721ReceiverImplementer();
  }

  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return tokenId < _mintCounter;
  }

  function _isApprovedOrOwner(
    address spender,
    uint256 tokenId,
    TokenData memory token
  ) internal view virtual returns (bool) {
    address owner = token.owner;
    return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
  }

  function _safeMint(address to, uint256 quantity) internal virtual {
    _safeMint(to, quantity, '');
  }

  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal virtual {
    uint256 startTokenId = _mintCounter;
    _mint(to, quantity);

    if (to.isContract()) {
      unchecked {
        for (uint256 i; i < quantity; ++i) {
          if (!_checkOnERC721Received(address(0), to, startTokenId + i, _data))
            revert TransferToNonERC721ReceiverImplementer();
        }
      }
    }
  }

  function _mint(address to, uint256 quantity) internal virtual {
    if (to == address(0)) revert MintToZeroAddress();
    if (quantity == 0) revert MintZeroQuantity();

    uint256 startTokenId = _mintCounter;
    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
      for (uint256 i; i < quantity; ++i) {
        if (_maxBatchSize == 0 ? i == 0 : i % _maxBatchSize == 0) {
          TokenData storage token = _tokens[startTokenId + i];
          token.owner = to;
          token.aux = _calculateAux(address(0), to, startTokenId + i, 0);
        }

        emit Transfer(address(0), to, startTokenId + i);
      }
      _mintCounter += quantity;
    }

    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  function _transfer(
    address from,
    address to,
    uint256 tokenId,
    TokenData memory token
  ) internal virtual {
    if (token.owner != from) revert TransferFromIncorrectOwner();
    if (to == address(0)) revert TransferToZeroAddress();

    _beforeTokenTransfers(from, to, tokenId, 1);

    _approve(address(0), tokenId, token);

    unchecked {
      uint256 nextTokenId = tokenId + 1;
      if (_exists(nextTokenId)) {
        TokenData storage nextToken = _tokens[nextTokenId];
        if (nextToken.owner == address(0)) {
          nextToken.owner = token.owner;
          nextToken.aux = token.aux;
        }
      }
    }

    TokenData storage newToken = _tokens[tokenId];
    newToken.owner = to;
    newToken.aux = _calculateAux(from, to, tokenId, token.aux);

    emit Transfer(from, to, tokenId);

    _afterTokenTransfers(from, to, tokenId, 1);
  }

  function _calculateAux(
    address from,
    address to,
    uint256 tokenId,
    bytes12 current
  ) internal view virtual returns (bytes12) {}

  function _approve(
    address to,
    uint256 tokenId,
    TokenData memory token
  ) internal virtual {
    _tokenApprovals[tokenId] = to;
    emit Approval(token.owner, to, tokenId);
  }

  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    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 TransferToNonERC721ReceiverImplementer();
      } else {
        assembly {
          revert(add(32, reason), mload(reason))
        }
      }
    }
  }

  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// File: mirascapes.sol

/*
         ,:.                       ':.                                                                                                                
        'OWd.                     ;0Wo                                                                                                ':'             
        :XMWd.                   ,0MMO.                                                   .dOd:.                                    ,xXWK;            
       .dWMMWd.                 ,0MMMX;                                                    ,kWWXx;                                .oXMMWk'            
       .OMMMMWd.               ,0MMMMWo                                                     .oXMMNk;                             ,kWMMXo.             
       ;XMMMMMWd.             ,0MMMMMMk.                                                      ;ONMMNk,                         .oXMMW0;  ,l'          
       oWWNNMMMWd.           ,0MXKNMMMK,                                                       .;OWMMXd'                      :0WMMNx.  'OWd.         
      .OMXloNMMMWd.         ,0WXc;0MMMNl                                                         .oXMMWKl.                  'xNMMMXl.  .xWMk.         
      ;KM0'.lNMMMNd.       'OWXc .kMMMMx. ..'''''.....                                     ;dd,    'dXMMWk,               .lKWMMW0;   .xWMMO.         
      lWMx. .lNMMMWd.     'OMXc   oWMMM0;c00000KKKXXK0Okxd:.        .c:.      .:c.        :XMMXo.    'dXMMXl.            ;OWMMWXd.   .dWMMM0'         
     .kMWo   .oNMMMNd.   'OWXc  ..cXMMMX:.'......';coOXWMMO.        .lKk'    .x0c.       .xWMMMW0;     ,xNMNx.         .dNMMWKo'    .oNMMMM0'         
     ,KMX:    .oNMMMNd. 'OWXc .:Odc0MMMWo             .c0Wk.          ,O0;..;Ok,         '0MMMMMMK;      :OWWk'       ,OWMMXo.    .:OWMMMMM0'         
     lNM0'     .oNMMMNd:OWXc.'kNM0cxMMMMO.              .kd.           .dK000d.          ;KMMMMNK0:       .oXWO'     cKMMNk,     :0WMMNXWMM0'         
    .xMMx.      .oNMMMWWWXc.,0WMMXcoWMMMK;               ',             cKWWK:           ;XMMMXc..          lNW0;   lXMMKc.     ;KMMMK:'kWMO.         
    ,0MWl        .lXMMMMXc .OMMMM0,;XMMMNl                            .l0d::x0l.         ,KMMWx.    :d;.    .lXWXl.cXMWk'      ;0WMMNo. lWMO.         
    lNMX:          cXMMXc  lNMMMMx..OMMMMO.                          'k0:   .lKx.        '0MMNc     oWNO;     ,OWNKXWKc.     .lXMMMNd.  oWMO.         
 .'c0WWNd,'.        :KKc  .xMMMMMx.'OWWWWNkc,'.                     'xx'      ;kx'       '0MMX;     ;KMMNd.    'xK0Ox,      'xNMMW0:   .xMM0'         
 .,,,,,,,,'.         ..   .kMMMMMx..',;;;;::;;.  .,;clllllll:,.     ..         ..        '0MMX;      lNMMWx.     ..        :0WMMXo.    '0MM0'         
                          .xMMMMM0'               ..:KMMMMWx'.                           .OMMX;      .lNMMNd.            .dNMMMK:      ;XMMK,         
                           cNMMMMNo                 .xMMMMN:                             .OMMK;        cXMMW0:          ;OWMMW0,       ;XMMK,         
                           .kWMMMMX:                .xMMMMX:                             .kMM0'         :KMMMNd.      .dNMMMWO'        'OMM0'         
                            'kWMMMMXl.              .xMMMMX:                             .xMWd.          ,OWMMWk.    ;0WMMWXo.         .kMM0'         
                             .oXMMMMWk;.            .xMMMMX:                              oWX;            'OWMMWk.  cXMMMXo'           .OMMO.         
                               'o0WMMMNOl,.         .xMMMMX:                              ;Kk.             .dNMMWOlxXMMMK:             '0MMk.         
                                 .;oOXWMMNKkdlc:;;;cdXMMWNO,                               '.               .cKMMMMMMMNk,              .kMWd.         
                                     .,:ldxkO00000OOkxdl:,.                                                   ,x0kooOk:.                cXXc          
                                              ...                                                               .                        ..                
*/

// Contract authored by August Rosedale (@augustfr)
// https://miragegallery.ai

// TinyERC721 used (https://github.com/tajigen/tiny-erc721)

pragma solidity ^0.8.17;







contract mirascapes is TinyERC721, RevokableDefaultOperatorFilterer, Ownable, ERC2981Base {
    using Strings for uint256;

    uint256 public maxSupply = 2605;

    string private baseURI = "ipfs://bafybeibfdxxdkgntmzzwr72u6p5ugcdqnogbmblw6l3mj4isgwjdqbs7ee/";

    bool public metadataFrozen;

    RoyaltyInfo private _royalties;    

    constructor(string memory name, string memory symbol, address royaltyReceiver) TinyERC721(name, symbol, 0) {
        _royalties = RoyaltyInfo(royaltyReceiver, uint24(750));
    }

    function updateRoyalties(address recipient, uint256 value) public onlyOwner {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }

    function airdrop(address[] memory addresses, uint256 numberOfTokens) public onlyOwner {
        uint256 totalToMint = addresses.length * numberOfTokens;
        require(totalSupply() + totalToMint <= maxSupply, "Would exceed max supply");
        for(uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], numberOfTokens, '');
        }
    }

    function freezeMetadata() public onlyOwner {
        require(!metadataFrozen, "Already frozen");
        metadataFrozen = true;
    }

    function tokenURI(uint256 tokenID) public override view returns (string memory) {
        if (!_exists(tokenID)) revert URIQueryForNonexistentToken();
            return string.concat(baseURI,Strings.toString(tokenID));
    }

    function updateURI(string memory _baseTokenURI) external onlyOwner {
        require(!metadataFrozen, "Metadata is frozen");
        baseURI = _baseTokenURI;
    }

    function royaltyInfo(uint256, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC2981Base, TinyERC721) returns (bool) { 
        return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId) || interfaceId == type(IERC2981Royalties).interfaceId;
    }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

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

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

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

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

    function owner() public view virtual override (Ownable, RevokableOperatorFilterer) returns (address) {
        return Ownable.owner();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyRevoked","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenDataQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperatorFilterRegistryRevoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeOperatorFilterRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610a2d600755610120604052604360a0818152906200243760c03960089062000029908262000332565b503480156200003757600080fd5b506040516200247a3803806200247a8339810160408190526200005a91620004ad565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184846000600262000083848262000332565b50600362000092838262000332565b5060805250506daaeb6d7670e522a718067333cd4e3b15620001dd5780156200012b57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200010c57600080fd5b505af115801562000121573d6000803e3d6000fd5b50505050620001dd565b6001600160a01b038216156200017c5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000f1565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001c357600080fd5b505af1158015620001d8573d6000803e3d6000fd5b505050505b50620001eb90503362000233565b604080518082019091526001600160a01b03919091168082526102ee602090920191909152600a80546001600160b81b03191690911761017760a11b179055506200053a9050565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002b857607f821691505b602082108103620002d957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032d57600081815260208120601f850160051c81016020861015620003085750805b601f850160051c820191505b81811015620003295782815560010162000314565b5050505b505050565b81516001600160401b038111156200034e576200034e6200028d565b62000366816200035f8454620002a3565b84620002df565b602080601f8311600181146200039e5760008415620003855750858301515b600019600386901b1c1916600185901b17855562000329565b600085815260208120601f198616915b82811015620003cf57888601518255948401946001909101908401620003ae565b5085821015620003ee5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f8301126200041057600080fd5b81516001600160401b03808211156200042d576200042d6200028d565b604051601f8301601f19908116603f011681019082821181831017156200045857620004586200028d565b816040528381526020925086838588010111156200047557600080fd5b600091505b838210156200049957858201830151818301840152908201906200047a565b600093810190920192909252949350505050565b600080600060608486031215620004c357600080fd5b83516001600160401b0380821115620004db57600080fd5b620004e987838801620003fe565b945060208601519150808211156200050057600080fd5b506200050f86828701620003fe565b604086015190935090506001600160a01b03811681146200052f57600080fd5b809150509250925092565b608051611eda6200055d600039600081816115df01526116050152611eda6000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638da5cb5b116100de578063c87b56dd11610097578063e985e9c511610071578063e985e9c514610351578063ecba222a14610364578063f2fde38b1461036f578063fb3cc6c21461038257600080fd5b8063c87b56dd1461032d578063d111515d14610340578063d5abeb011461034857600080fd5b80638da5cb5b146102c357806395d89b41146102d9578063a22cb465146102e1578063b88d4fde146102f4578063c204642c14610307578063c30f4a5a1461031a57600080fd5b80632a55205a1161014b5780636352211e116101255780636352211e146102825780636c2f5acd1461029557806370a08231146102a8578063715018a6146102bb57600080fd5b80632a55205a1461023557806342842e0e146102675780635ef9432a1461027a57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb57806318160ddd1461021057806323b872dd14610222575b600080fd5b6101a66101a13660046117b0565b61038f565b60405190151581526020015b60405180910390f35b6101c36103f0565b6040516101b29190611824565b6101e36101de366004611837565b610482565b6040516001600160a01b0390911681526020016101b2565b61020e61020936600461186c565b6104c8565b005b6001545b6040519081526020016101b2565b61020e610230366004611896565b6105a8565b6102486102433660046118d2565b610693565b604080516001600160a01b0390931683526020830191909152016101b2565b61020e610275366004611896565b6106e8565b61020e6107c8565b6101e3610290366004611837565b61083d565b61020e6102a336600461186c565b610880565b6102146102b63660046118f4565b610924565b61020e6109ca565b60065461010090046001600160a01b03166101e3565b6101c36109de565b61020e6102ef36600461191d565b6109ed565b61020e6103023660046119f3565b610ac3565b61020e610315366004611a6f565b610bb1565b61020e610328366004611b22565b610c80565b6101c361033b366004611837565b610ce0565b61020e610d3c565b61021460075481565b6101a661035f366004611b6b565b610d97565b60065460ff166101a6565b61020e61037d3660046118f4565b610dc5565b6009546101a69060ff1681565b60006001600160e01b031982166380ac58cd60e01b14806103c057506001600160e01b03198216635b5e139f60e01b145b806103cf57506103cf82610e3e565b806103ea57506001600160e01b0319821663152a902d60e11b145b92915050565b6060600280546103ff90611b9e565b80601f016020809104026020016040519081016040528092919081815260200182805461042b90611b9e565b80156104785780601f1061044d57610100808354040283529160200191610478565b820191906000526020600020905b81548152906001019060200180831161045b57829003601f168201915b5050505050905090565b600061048f826001541190565b6104ac576040516333d1c03960e21b815260040160405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600654829060ff161580156104eb57506daaeb6d7670e522a718067333cd4e3b15155b1561059957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c9190611bd8565b61059957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6105a38383610e63565b505050565b600654839060ff161580156105cb57506daaeb6d7670e522a718067333cd4e3b15155b1561068257336001600160a01b038216036105f0576105eb848484610f11565b61068d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190611bd8565b61068257604051633b79c77360e21b8152336004820152602401610590565b61068d848484610f11565b50505050565b60408051808201909152600a546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906106d49086611c0b565b6106de9190611c38565b9150509250929050565b600654839060ff1615801561070b57506daaeb6d7670e522a718067333cd4e3b15155b156107bd57336001600160a01b0382160361072b576105eb848484610f83565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e9190611bd8565b6107bd57604051633b79c77360e21b8152336004820152602401610590565b61068d848484610f83565b60065461010090046001600160a01b03166001600160a01b0316336001600160a01b03161461080a57604051635fc483c560e01b815260040160405180910390fd5b60065460ff161561082e5760405163905e710760e01b815260040160405180910390fd5b6006805460ff19166001179055565b600061084a826001541190565b61086757604051636f96cda160e11b815260040160405180910390fd5b61087082610f9e565b546001600160a01b031692915050565b610888611007565b6127108111156108da5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f20686967680000000000006044820152606401610590565b604080518082019091526001600160a01b0390921680835262ffffff9091166020909201829052600a8054600160a01b9093026001600160b81b0319909316909117919091179055565b60006001600160a01b03821661094d576040516323d3ad8160e21b815260040160405180910390fd5b600061095860015490565b905060008060005b838110156109c0576000818152602081905260409020546001600160a01b0316801561098a578092505b866001600160a01b0316836001600160a01b0316036109af576109ac84611c4c565b93505b506109b981611c4c565b9050610960565b5090949350505050565b6109d2611007565b6109dc6000611067565b565b6060600380546103ff90611b9e565b600654829060ff16158015610a1057506daaeb6d7670e522a718067333cd4e3b15155b15610ab957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611bd8565b610ab957604051633b79c77360e21b81526001600160a01b0382166004820152602401610590565b6105a383836110c1565b600654849060ff16158015610ae657506daaeb6d7670e522a718067333cd4e3b15155b15610b9e57336001600160a01b03821603610b0c57610b0785858585611156565b610baa565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190611bd8565b610b9e57604051633b79c77360e21b8152336004820152602401610590565b610baa85858585611156565b5050505050565b610bb9611007565b6000818351610bc89190611c0b565b905060075481610bd760015490565b610be19190611c65565b1115610c2f5760405162461bcd60e51b815260206004820152601760248201527f576f756c6420657863656564206d617820737570706c790000000000000000006044820152606401610590565b60005b835181101561068d57610c6e848281518110610c5057610c50611c78565b602002602001015184604051806020016040528060008152506111c9565b80610c7881611c4c565b915050610c32565b610c88611007565b60095460ff1615610cd05760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b6044820152606401610590565b6008610cdc8282611cdc565b5050565b6060610ced826001541190565b610d0a57604051630a14c4b560e41b815260040160405180910390fd5b6008610d1583611225565b604051602001610d26929190611d9c565b6040516020818303038152906040529050919050565b610d44611007565b60095460ff1615610d885760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c90333937bd32b760911b6044820152606401610590565b6009805460ff19166001179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610dcd611007565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610590565b610e3b81611067565b50565b60006001600160e01b0319821663152a902d60e11b14806103ea57506103ea8261132e565b6000610e6e82610f9e565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b0319166020840152919250908416819003610ec85760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ee85750610ee68133610d97565b155b15610f06576040516367d9dca160e11b815260040160405180910390fd5b61068d84848461137e565b6000610f1c82610f9e565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610f5a3383836113df565b610f7757604051632ce44b5f60e11b815260040160405180910390fd5b61068d84848484611430565b6105a383838360405180602001604052806000815250610ac3565b6000610fab826001541190565b610fc8576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b0316611000576000190160008181526020819052604090209150610fd8565b5092915050565b6006546001600160a01b036101009091041633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610590565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b038316036110ea5760405163b06307db60e01b815260040160405180910390fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600061116183610f9e565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b0319166020820152905061119f3384836113df565b6111bc57604051632ce44b5f60e11b815260040160405180910390fd5b610baa858585848661153c565b6001546111d68484611588565b6001600160a01b0384163b1561068d5760005b83811015610baa57611200600086838501866116af565b61121d576040516368d2bf6b60e11b815260040160405180910390fd5b6001016111e9565b60608160000361124c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611276578061126081611c4c565b915061126f9050600a83611c38565b9150611250565b60008167ffffffffffffffff81111561129157611291611954565b6040519080825280601f01601f1916602001820160405280156112bb576020820181803683370190505b5090505b8415611326576112d0600183611e23565b91506112dd600a86611e36565b6112e8906030611c65565b60f81b8183815181106112fd576112fd611c78565b60200101906001600160f81b031916908160001a90535061131f600a86611c38565b94506112bf565b949350505050565b60006001600160e01b031982166380ac58cd60e01b148061135f57506001600160e01b03198216635b5e139f60e01b145b806103ea57506301ffc9a760e01b6001600160e01b03198316146103ea565b60008281526004602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b80516000906001600160a01b03858116908216148061140357506114038186610d97565b806114275750846001600160a01b031661141c85610482565b6001600160a01b0316145b95945050505050565b836001600160a01b031681600001516001600160a01b0316146114655760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03831661148c57604051633a954ecd60e21b815260040160405180910390fd5b6114986000838361137e565b600182016114a7816001541190565b156114ea57600081815260208190526040902080546001600160a01b03166114e8578251602084015160a01c600160a01b026001600160a01b039091161781555b505b506000828152602081905260408082206001600160a01b0386811680835592519193869392918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4610baa565b61154885858585611430565b6001600160a01b0384163b1515801561156a5750611568858585846116af565b155b15610baa576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b0382166115ae57604051622e076360e81b815260040160405180910390fd5b806000036115cf5760405163b562e8dd60e01b815260040160405180910390fd5b60015460005b828110156116a1577f000000000000000000000000000000000000000000000000000000000000000015611639577f0000000000000000000000000000000000000000000000000000000000000000818161163257611632611c22565b061561163c565b80155b1561165f5781810160009081526020819052604090206001600160a01b03851690555b604051828201906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016115d5565b506001805483019055505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906116e4903390899088908890600401611e4a565b6020604051808303816000875af192505050801561171f575060408051601f3d908101601f1916820190925261171c91810190611e87565b60015b61177d573d80801561174d576040519150601f19603f3d011682016040523d82523d6000602084013e611752565b606091505b508051600003611775576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610e3b57600080fd5b6000602082840312156117c257600080fd5b81356117cd8161179a565b9392505050565b60005b838110156117ef5781810151838201526020016117d7565b50506000910152565b600081518084526118108160208601602086016117d4565b601f01601f19169290920160200192915050565b6020815260006117cd60208301846117f8565b60006020828403121561184957600080fd5b5035919050565b80356001600160a01b038116811461186757600080fd5b919050565b6000806040838503121561187f57600080fd5b61188883611850565b946020939093013593505050565b6000806000606084860312156118ab57600080fd5b6118b484611850565b92506118c260208501611850565b9150604084013590509250925092565b600080604083850312156118e557600080fd5b50508035926020909101359150565b60006020828403121561190657600080fd5b6117cd82611850565b8015158114610e3b57600080fd5b6000806040838503121561193057600080fd5b61193983611850565b915060208301356119498161190f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561199357611993611954565b604052919050565b600067ffffffffffffffff8311156119b5576119b5611954565b6119c8601f8401601f191660200161196a565b90508281528383830111156119dc57600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215611a0957600080fd5b611a1285611850565b9350611a2060208601611850565b925060408501359150606085013567ffffffffffffffff811115611a4357600080fd5b8501601f81018713611a5457600080fd5b611a638782356020840161199b565b91505092959194509250565b60008060408385031215611a8257600080fd5b823567ffffffffffffffff80821115611a9a57600080fd5b818501915085601f830112611aae57600080fd5b8135602082821115611ac257611ac2611954565b8160051b9250611ad381840161196a565b8281529284018101928181019089851115611aed57600080fd5b948201945b84861015611b1257611b0386611850565b82529482019490820190611af2565b9997909101359750505050505050565b600060208284031215611b3457600080fd5b813567ffffffffffffffff811115611b4b57600080fd5b8201601f81018413611b5c57600080fd5b6113268482356020840161199b565b60008060408385031215611b7e57600080fd5b611b8783611850565b9150611b9560208401611850565b90509250929050565b600181811c90821680611bb257607f821691505b602082108103611bd257634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611bea57600080fd5b81516117cd8161190f565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103ea576103ea611bf5565b634e487b7160e01b600052601260045260246000fd5b600082611c4757611c47611c22565b500490565b600060018201611c5e57611c5e611bf5565b5060010190565b808201808211156103ea576103ea611bf5565b634e487b7160e01b600052603260045260246000fd5b601f8211156105a357600081815260208120601f850160051c81016020861015611cb55750805b601f850160051c820191505b81811015611cd457828155600101611cc1565b505050505050565b815167ffffffffffffffff811115611cf657611cf6611954565b611d0a81611d048454611b9e565b84611c8e565b602080601f831160018114611d3f5760008415611d275750858301515b600019600386901b1c1916600185901b178555611cd4565b600085815260208120601f198616915b82811015611d6e57888601518255948401946001909101908401611d4f565b5085821015611d8c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454611daa81611b9e565b60018281168015611dc25760018114611dd757611e06565b60ff1984168752821515830287019450611e06565b8860005260208060002060005b85811015611dfd5781548a820152908401908201611de4565b50505082870194505b505050508351611e1a8183602088016117d4565b01949350505050565b818103818111156103ea576103ea611bf5565b600082611e4557611e45611c22565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e7d908301846117f8565b9695505050505050565b600060208284031215611e9957600080fd5b81516117cd8161179a56fea264697066735822122088fc4a80a369d01a95e8fd883ca19fd17a434887056ab1fe17e19dee5352a4b864736f6c63430008110033697066733a2f2f626166796265696266647878646b676e746d7a7a777237327536703575676364716e6f67626d626c77366c336d6a34697367776a647162733765652f000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000396d1d45847befd45e07bb489ac47f63687cbf33000000000000000000000000000000000000000000000000000000000000000a4d6972617363617065730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49524100000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80638da5cb5b116100de578063c87b56dd11610097578063e985e9c511610071578063e985e9c514610351578063ecba222a14610364578063f2fde38b1461036f578063fb3cc6c21461038257600080fd5b8063c87b56dd1461032d578063d111515d14610340578063d5abeb011461034857600080fd5b80638da5cb5b146102c357806395d89b41146102d9578063a22cb465146102e1578063b88d4fde146102f4578063c204642c14610307578063c30f4a5a1461031a57600080fd5b80632a55205a1161014b5780636352211e116101255780636352211e146102825780636c2f5acd1461029557806370a08231146102a8578063715018a6146102bb57600080fd5b80632a55205a1461023557806342842e0e146102675780635ef9432a1461027a57600080fd5b806301ffc9a71461019357806306fdde03146101bb578063081812fc146101d0578063095ea7b3146101fb57806318160ddd1461021057806323b872dd14610222575b600080fd5b6101a66101a13660046117b0565b61038f565b60405190151581526020015b60405180910390f35b6101c36103f0565b6040516101b29190611824565b6101e36101de366004611837565b610482565b6040516001600160a01b0390911681526020016101b2565b61020e61020936600461186c565b6104c8565b005b6001545b6040519081526020016101b2565b61020e610230366004611896565b6105a8565b6102486102433660046118d2565b610693565b604080516001600160a01b0390931683526020830191909152016101b2565b61020e610275366004611896565b6106e8565b61020e6107c8565b6101e3610290366004611837565b61083d565b61020e6102a336600461186c565b610880565b6102146102b63660046118f4565b610924565b61020e6109ca565b60065461010090046001600160a01b03166101e3565b6101c36109de565b61020e6102ef36600461191d565b6109ed565b61020e6103023660046119f3565b610ac3565b61020e610315366004611a6f565b610bb1565b61020e610328366004611b22565b610c80565b6101c361033b366004611837565b610ce0565b61020e610d3c565b61021460075481565b6101a661035f366004611b6b565b610d97565b60065460ff166101a6565b61020e61037d3660046118f4565b610dc5565b6009546101a69060ff1681565b60006001600160e01b031982166380ac58cd60e01b14806103c057506001600160e01b03198216635b5e139f60e01b145b806103cf57506103cf82610e3e565b806103ea57506001600160e01b0319821663152a902d60e11b145b92915050565b6060600280546103ff90611b9e565b80601f016020809104026020016040519081016040528092919081815260200182805461042b90611b9e565b80156104785780601f1061044d57610100808354040283529160200191610478565b820191906000526020600020905b81548152906001019060200180831161045b57829003601f168201915b5050505050905090565b600061048f826001541190565b6104ac576040516333d1c03960e21b815260040160405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600654829060ff161580156104eb57506daaeb6d7670e522a718067333cd4e3b15155b1561059957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c9190611bd8565b61059957604051633b79c77360e21b81526001600160a01b03821660048201526024015b60405180910390fd5b6105a38383610e63565b505050565b600654839060ff161580156105cb57506daaeb6d7670e522a718067333cd4e3b15155b1561068257336001600160a01b038216036105f0576105eb848484610f11565b61068d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106639190611bd8565b61068257604051633b79c77360e21b8152336004820152602401610590565b61068d848484610f11565b50505050565b60408051808201909152600a546001600160a01b038116808352600160a01b90910462ffffff16602083018190529091600091612710906106d49086611c0b565b6106de9190611c38565b9150509250929050565b600654839060ff1615801561070b57506daaeb6d7670e522a718067333cd4e3b15155b156107bd57336001600160a01b0382160361072b576105eb848484610f83565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561077a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079e9190611bd8565b6107bd57604051633b79c77360e21b8152336004820152602401610590565b61068d848484610f83565b60065461010090046001600160a01b03166001600160a01b0316336001600160a01b03161461080a57604051635fc483c560e01b815260040160405180910390fd5b60065460ff161561082e5760405163905e710760e01b815260040160405180910390fd5b6006805460ff19166001179055565b600061084a826001541190565b61086757604051636f96cda160e11b815260040160405180910390fd5b61087082610f9e565b546001600160a01b031692915050565b610888611007565b6127108111156108da5760405162461bcd60e51b815260206004820152601a60248201527f45524332393831526f79616c746965733a20546f6f20686967680000000000006044820152606401610590565b604080518082019091526001600160a01b0390921680835262ffffff9091166020909201829052600a8054600160a01b9093026001600160b81b0319909316909117919091179055565b60006001600160a01b03821661094d576040516323d3ad8160e21b815260040160405180910390fd5b600061095860015490565b905060008060005b838110156109c0576000818152602081905260409020546001600160a01b0316801561098a578092505b866001600160a01b0316836001600160a01b0316036109af576109ac84611c4c565b93505b506109b981611c4c565b9050610960565b5090949350505050565b6109d2611007565b6109dc6000611067565b565b6060600380546103ff90611b9e565b600654829060ff16158015610a1057506daaeb6d7670e522a718067333cd4e3b15155b15610ab957604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a919190611bd8565b610ab957604051633b79c77360e21b81526001600160a01b0382166004820152602401610590565b6105a383836110c1565b600654849060ff16158015610ae657506daaeb6d7670e522a718067333cd4e3b15155b15610b9e57336001600160a01b03821603610b0c57610b0785858585611156565b610baa565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f9190611bd8565b610b9e57604051633b79c77360e21b8152336004820152602401610590565b610baa85858585611156565b5050505050565b610bb9611007565b6000818351610bc89190611c0b565b905060075481610bd760015490565b610be19190611c65565b1115610c2f5760405162461bcd60e51b815260206004820152601760248201527f576f756c6420657863656564206d617820737570706c790000000000000000006044820152606401610590565b60005b835181101561068d57610c6e848281518110610c5057610c50611c78565b602002602001015184604051806020016040528060008152506111c9565b80610c7881611c4c565b915050610c32565b610c88611007565b60095460ff1615610cd05760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b6044820152606401610590565b6008610cdc8282611cdc565b5050565b6060610ced826001541190565b610d0a57604051630a14c4b560e41b815260040160405180910390fd5b6008610d1583611225565b604051602001610d26929190611d9c565b6040516020818303038152906040529050919050565b610d44611007565b60095460ff1615610d885760405162461bcd60e51b815260206004820152600e60248201526d20b63932b0b23c90333937bd32b760911b6044820152606401610590565b6009805460ff19166001179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610dcd611007565b6001600160a01b038116610e325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610590565b610e3b81611067565b50565b60006001600160e01b0319821663152a902d60e11b14806103ea57506103ea8261132e565b6000610e6e82610f9e565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b0319166020840152919250908416819003610ec85760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ee85750610ee68133610d97565b155b15610f06576040516367d9dca160e11b815260040160405180910390fd5b61068d84848461137e565b6000610f1c82610f9e565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610f5a3383836113df565b610f7757604051632ce44b5f60e11b815260040160405180910390fd5b61068d84848484611430565b6105a383838360405180602001604052806000815250610ac3565b6000610fab826001541190565b610fc8576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b0316611000576000190160008181526020819052604090209150610fd8565b5092915050565b6006546001600160a01b036101009091041633146109dc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610590565b600680546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b336001600160a01b038316036110ea5760405163b06307db60e01b815260040160405180910390fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600061116183610f9e565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b0319166020820152905061119f3384836113df565b6111bc57604051632ce44b5f60e11b815260040160405180910390fd5b610baa858585848661153c565b6001546111d68484611588565b6001600160a01b0384163b1561068d5760005b83811015610baa57611200600086838501866116af565b61121d576040516368d2bf6b60e11b815260040160405180910390fd5b6001016111e9565b60608160000361124c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611276578061126081611c4c565b915061126f9050600a83611c38565b9150611250565b60008167ffffffffffffffff81111561129157611291611954565b6040519080825280601f01601f1916602001820160405280156112bb576020820181803683370190505b5090505b8415611326576112d0600183611e23565b91506112dd600a86611e36565b6112e8906030611c65565b60f81b8183815181106112fd576112fd611c78565b60200101906001600160f81b031916908160001a90535061131f600a86611c38565b94506112bf565b949350505050565b60006001600160e01b031982166380ac58cd60e01b148061135f57506001600160e01b03198216635b5e139f60e01b145b806103ea57506301ffc9a760e01b6001600160e01b03198316146103ea565b60008281526004602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b80516000906001600160a01b03858116908216148061140357506114038186610d97565b806114275750846001600160a01b031661141c85610482565b6001600160a01b0316145b95945050505050565b836001600160a01b031681600001516001600160a01b0316146114655760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03831661148c57604051633a954ecd60e21b815260040160405180910390fd5b6114986000838361137e565b600182016114a7816001541190565b156114ea57600081815260208190526040902080546001600160a01b03166114e8578251602084015160a01c600160a01b026001600160a01b039091161781555b505b506000828152602081905260408082206001600160a01b0386811680835592519193869392918916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4610baa565b61154885858585611430565b6001600160a01b0384163b1515801561156a5750611568858585846116af565b155b15610baa576040516368d2bf6b60e11b815260040160405180910390fd5b6001600160a01b0382166115ae57604051622e076360e81b815260040160405180910390fd5b806000036115cf5760405163b562e8dd60e01b815260040160405180910390fd5b60015460005b828110156116a1577f000000000000000000000000000000000000000000000000000000000000000015611639577f0000000000000000000000000000000000000000000000000000000000000000818161163257611632611c22565b061561163c565b80155b1561165f5781810160009081526020819052604090206001600160a01b03851690555b604051828201906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001016115d5565b506001805483019055505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906116e4903390899088908890600401611e4a565b6020604051808303816000875af192505050801561171f575060408051601f3d908101601f1916820190925261171c91810190611e87565b60015b61177d573d80801561174d576040519150601f19603f3d011682016040523d82523d6000602084013e611752565b606091505b508051600003611775576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6001600160e01b031981168114610e3b57600080fd5b6000602082840312156117c257600080fd5b81356117cd8161179a565b9392505050565b60005b838110156117ef5781810151838201526020016117d7565b50506000910152565b600081518084526118108160208601602086016117d4565b601f01601f19169290920160200192915050565b6020815260006117cd60208301846117f8565b60006020828403121561184957600080fd5b5035919050565b80356001600160a01b038116811461186757600080fd5b919050565b6000806040838503121561187f57600080fd5b61188883611850565b946020939093013593505050565b6000806000606084860312156118ab57600080fd5b6118b484611850565b92506118c260208501611850565b9150604084013590509250925092565b600080604083850312156118e557600080fd5b50508035926020909101359150565b60006020828403121561190657600080fd5b6117cd82611850565b8015158114610e3b57600080fd5b6000806040838503121561193057600080fd5b61193983611850565b915060208301356119498161190f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561199357611993611954565b604052919050565b600067ffffffffffffffff8311156119b5576119b5611954565b6119c8601f8401601f191660200161196a565b90508281528383830111156119dc57600080fd5b828260208301376000602084830101529392505050565b60008060008060808587031215611a0957600080fd5b611a1285611850565b9350611a2060208601611850565b925060408501359150606085013567ffffffffffffffff811115611a4357600080fd5b8501601f81018713611a5457600080fd5b611a638782356020840161199b565b91505092959194509250565b60008060408385031215611a8257600080fd5b823567ffffffffffffffff80821115611a9a57600080fd5b818501915085601f830112611aae57600080fd5b8135602082821115611ac257611ac2611954565b8160051b9250611ad381840161196a565b8281529284018101928181019089851115611aed57600080fd5b948201945b84861015611b1257611b0386611850565b82529482019490820190611af2565b9997909101359750505050505050565b600060208284031215611b3457600080fd5b813567ffffffffffffffff811115611b4b57600080fd5b8201601f81018413611b5c57600080fd5b6113268482356020840161199b565b60008060408385031215611b7e57600080fd5b611b8783611850565b9150611b9560208401611850565b90509250929050565b600181811c90821680611bb257607f821691505b602082108103611bd257634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611bea57600080fd5b81516117cd8161190f565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176103ea576103ea611bf5565b634e487b7160e01b600052601260045260246000fd5b600082611c4757611c47611c22565b500490565b600060018201611c5e57611c5e611bf5565b5060010190565b808201808211156103ea576103ea611bf5565b634e487b7160e01b600052603260045260246000fd5b601f8211156105a357600081815260208120601f850160051c81016020861015611cb55750805b601f850160051c820191505b81811015611cd457828155600101611cc1565b505050505050565b815167ffffffffffffffff811115611cf657611cf6611954565b611d0a81611d048454611b9e565b84611c8e565b602080601f831160018114611d3f5760008415611d275750858301515b600019600386901b1c1916600185901b178555611cd4565b600085815260208120601f198616915b82811015611d6e57888601518255948401946001909101908401611d4f565b5085821015611d8c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808454611daa81611b9e565b60018281168015611dc25760018114611dd757611e06565b60ff1984168752821515830287019450611e06565b8860005260208060002060005b85811015611dfd5781548a820152908401908201611de4565b50505082870194505b505050508351611e1a8183602088016117d4565b01949350505050565b818103818111156103ea576103ea611bf5565b600082611e4557611e45611c22565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e7d908301846117f8565b9695505050505050565b600060208284031215611e9957600080fd5b81516117cd8161179a56fea264697066735822122088fc4a80a369d01a95e8fd883ca19fd17a434887056ab1fe17e19dee5352a4b864736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000396d1d45847befd45e07bb489ac47f63687cbf33000000000000000000000000000000000000000000000000000000000000000a4d6972617363617065730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d49524100000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Mirascapes
Arg [1] : symbol (string): MIRA
Arg [2] : royaltyReceiver (address): 0x396D1d45847bEfd45E07bb489ac47f63687cbF33

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000396d1d45847befd45e07bb489ac47f63687cbf33
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 4d69726173636170657300000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4d49524100000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46589:3374:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48569:338;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;48569:338:0;;;;;;;;34451:94;;;:::i;:::-;;;;;;;:::i;36520:202::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;36520:202:0;1533:203:1;49099:157:0;;;;;;:::i;:::-;;:::i;:::-;;34065:93;34140:12;;34065:93;;;2324:25:1;;;2312:2;2297:18;34065:93:0;2178:177:1;49264:163:0;;;;;;:::i;:::-;;:::i;48281:280::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3138:32:1;;;3120:51;;3202:2;3187:18;;3180:34;;;;3093:18;48281:280:0;2946:274:1;49435:171:0;;;;;;:::i;:::-;;:::i;7650:287::-;;;:::i;35925:194::-;;;;;;:::i;:::-;;:::i;47129:209::-;;;;;;:::i;:::-;;:::i;35058:450::-;;;;;;:::i;:::-;;:::i;14056:103::-;;;:::i;49818:142::-;13481:6;;;;;-1:-1:-1;;;;;13481:6:0;49818:142;;34551:98;;;:::i;48915:176::-;;;;;;:::i;:::-;;:::i;49614:196::-;;;;;;:::i;:::-;;:::i;47346:373::-;;;;;;:::i;:::-;;:::i;48107:166::-;;;;;;:::i;:::-;;:::i;47871:228::-;;;;;;:::i;:::-;;:::i;47727:136::-;;;:::i;46720:31::-;;;;;;37007:158;;;;;;:::i;:::-;;:::i;7945:128::-;8033:32;;;;7945:128;;14314:201;;;;;;:::i;:::-;;:::i;46863:26::-;;;;;;;;;48569:338;48679:4;-1:-1:-1;;;;;;48704:40:0;;-1:-1:-1;;;48704:40:0;;:92;;-1:-1:-1;;;;;;;48748:48:0;;-1:-1:-1;;;48748:48:0;48704:92;:141;;;;48809:36;48833:11;48809:23;:36::i;:::-;48704:195;;;-1:-1:-1;;;;;;;48849:50:0;;-1:-1:-1;;;48849:50:0;48704:195;48697:202;48569:338;-1:-1:-1;;48569:338:0:o;34451:94::-;34505:13;34534:5;34527:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34451:94;:::o;36520:202::-;36596:7;36617:16;36625:7;38465:12;;-1:-1:-1;38455:22:0;38370:113;36617:16;36612:64;;36642:34;;-1:-1:-1;;;36642:34:0;;;;;;;;;;;36612:64;-1:-1:-1;36692:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36692:24:0;;36520:202::o;49099:157::-;7271:32;;49195:8;;7271:32;;7270:33;:86;;;;-1:-1:-1;3424:42:0;7307:45;:49;;7270:86;7266:262;;;7378:67;;-1:-1:-1;;;7378:67:0;;7429:4;7378:67;;;7697:34:1;-1:-1:-1;;;;;7767:15:1;;7747:18;;;7740:43;3424:42:0;;7378;;7632:18:1;;7378:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7373:144;;7473:28;;-1:-1:-1;;;7473:28:0;;-1:-1:-1;;;;;1697:32:1;;7473:28:0;;;1679:51:1;1652:18;;7473:28:0;;;;;;;;7373:144;49216:32:::1;49230:8;49240:7;49216:13;:32::i;:::-;49099:157:::0;;;:::o;49264:163::-;6487:32;;49365:4;;6487:32;;6486:33;:86;;;;-1:-1:-1;3424:42:0;6523:45;:49;;6486:86;6482:576;;;6812:10;-1:-1:-1;;;;;6804:18:0;;;6800:85;;49382:37:::1;49401:4;49407:2;49411:7;49382:18;:37::i;:::-;6863:7:::0;;6800:85;6904:69;;-1:-1:-1;;;6904:69:0;;6955:4;6904:69;;;7697:34:1;6962:10:0;7747:18:1;;;7740:43;3424:42:0;;6904;;7632:18:1;;6904:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6899:148;;7001:30;;-1:-1:-1;;;7001:30:0;;7020:10;7001:30;;;1679:51:1;1652:18;;7001:30:0;1533:203:1;6899:148:0;49382:37:::1;49401:4;49407:2;49411:7;49382:18;:37::i;:::-;49264:163:::0;;;;:::o;48281:280::-;48410:41;;;;;;;;;48441:10;48410:41;-1:-1:-1;;;;;48410:41:0;;;;;-1:-1:-1;;;48410:41:0;;;;;;;;;;;;;-1:-1:-1;;48548:5:0;;48520:24;;:5;:24;:::i;:::-;48519:34;;;;:::i;:::-;48503:50;;48399:162;48281:280;;;;;:::o;49435:171::-;6487:32;;49540:4;;6487:32;;6486:33;:86;;;;-1:-1:-1;3424:42:0;6523:45;:49;;6486:86;6482:576;;;6812:10;-1:-1:-1;;;;;6804:18:0;;;6800:85;;49557:41:::1;49580:4;49586:2;49590:7;49557:22;:41::i;6800:85::-:0;6904:69;;-1:-1:-1;;;6904:69:0;;6955:4;6904:69;;;7697:34:1;6962:10:0;7747:18:1;;;7740:43;3424:42:0;;6904;;7632:18:1;;6904:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6899:148;;7001:30;;-1:-1:-1;;;7001:30:0;;7020:10;7001:30;;;1679:51:1;1652:18;;7001:30:0;1533:203:1;6899:148:0;49557:41:::1;49580:4;49586:2;49590:7;49557:22;:41::i;7650:287::-:0;13481:6;;;;;-1:-1:-1;;;;;13481:6:0;-1:-1:-1;;;;;7714:21:0;:10;-1:-1:-1;;;;;7714:21:0;;7710:72;;7759:11;;-1:-1:-1;;;7759:11:0;;;;;;;;;;;7710:72;7796:32;;;;7792:88;;;7852:16;;-1:-1:-1;;;7852:16:0;;;;;;;;;;;7792:88;7890:32;:39;;-1:-1:-1;;7890:39:0;7925:4;7890:39;;;7650:287::o;35925:194::-;35997:7;36018:16;36026:7;38465:12;;-1:-1:-1;38455:22:0;38370:113;36018:16;36013:61;;36043:31;;-1:-1:-1;;;36043:31:0;;;;;;;;;;;36013:61;36088:19;36099:7;36088:10;:19::i;:::-;:25;-1:-1:-1;;;;;36088:25:0;;35925:194;-1:-1:-1;;35925:194:0:o;47129:209::-;13294:13;:11;:13::i;:::-;47233:5:::1;47224;:14;;47216:53;;;::::0;-1:-1:-1;;;47216:53:0;;8808:2:1;47216:53:0::1;::::0;::::1;8790:21:1::0;8847:2;8827:18;;;8820:30;8886:28;8866:18;;;8859:56;8932:18;;47216:53:0::1;8606:350:1::0;47216:53:0::1;47293:37;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;47293:37:0;;::::1;::::0;;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;47280:10:::1;:50:::0;;-1:-1:-1;;;47280:50:0;;::::1;-1:-1:-1::0;;;;;;47280:50:0;;;;;;;;;::::1;::::0;;47129:209::o;35058:450::-;35130:7;-1:-1:-1;;;;;35150:19:0;;35146:60;;35178:28;;-1:-1:-1;;;35178:28:0;;;;;;;;;;;35146:60;35215:13;35231;34140:12;;;34065:93;35231:13;35215:29;;35251:13;35271:17;35300:9;35295:187;35315:5;35311:1;:9;35295:187;;;35336:18;35357:10;;;;;;;;;;:16;-1:-1:-1;;;;;35357:16:0;35386:24;;35382:52;;35424:10;35412:22;;35382:52;35460:5;-1:-1:-1;;;;;35447:18:0;:9;-1:-1:-1;;;;;35447:18:0;;35443:31;;35467:7;;;:::i;:::-;;;35443:31;-1:-1:-1;35322:3:0;;;:::i;:::-;;;35295:187;;;-1:-1:-1;35497:5:0;;35058:450;-1:-1:-1;;;;35058:450:0:o;14056:103::-;13294:13;:11;:13::i;:::-;14121:30:::1;14148:1;14121:18;:30::i;:::-;14056:103::o:0;34551:98::-;34607:13;34636:7;34629:14;;;;;:::i;48915:176::-;7271:32;;49019:8;;7271:32;;7270:33;:86;;;;-1:-1:-1;3424:42:0;7307:45;:49;;7270:86;7266:262;;;7378:67;;-1:-1:-1;;;7378:67:0;;7429:4;7378:67;;;7697:34:1;-1:-1:-1;;;;;7767:15:1;;7747:18;;;7740:43;3424:42:0;;7378;;7632:18:1;;7378:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7373:144;;7473:28;;-1:-1:-1;;;7473:28:0;;-1:-1:-1;;;;;1697:32:1;;7473:28:0;;;1679:51:1;1652:18;;7473:28:0;1533:203:1;7373:144:0;49040:43:::1;49064:8;49074;49040:23;:43::i;49614:196::-:0;6487:32;;49738:4;;6487:32;;6486:33;:86;;;;-1:-1:-1;3424:42:0;6523:45;:49;;6486:86;6482:576;;;6812:10;-1:-1:-1;;;;;6804:18:0;;;6800:85;;49755:47:::1;49778:4;49784:2;49788:7;49797:4;49755:22;:47::i;:::-;6863:7:::0;;6800:85;6904:69;;-1:-1:-1;;;6904:69:0;;6955:4;6904:69;;;7697:34:1;6962:10:0;7747:18:1;;;7740:43;3424:42:0;;6904;;7632:18:1;;6904:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6899:148;;7001:30;;-1:-1:-1;;;7001:30:0;;7020:10;7001:30;;;1679:51:1;1652:18;;7001:30:0;1533:203:1;6899:148:0;49755:47:::1;49778:4;49784:2;49788:7;49797:4;49755:22;:47::i;:::-;49614:196:::0;;;;;:::o;47346:373::-;13294:13;:11;:13::i;:::-;47443:19:::1;47484:14;47465:9;:16;:33;;;;:::i;:::-;47443:55;;47548:9;;47533:11;47517:13;34140:12:::0;;;34065:93;47517:13:::1;:27;;;;:::i;:::-;:40;;47509:76;;;::::0;-1:-1:-1;;;47509:76:0;;9433:2:1;47509:76:0::1;::::0;::::1;9415:21:1::0;9472:2;9452:18;;;9445:30;9511:25;9491:18;;;9484:53;9554:18;;47509:76:0::1;9231:347:1::0;47509:76:0::1;47600:9;47596:116;47619:9;:16;47615:1;:20;47596:116;;;47657:43;47667:9;47677:1;47667:12;;;;;;;;:::i;:::-;;;;;;;47681:14;47657:43;;;;;;;;;;;::::0;:9:::1;:43::i;:::-;47637:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47596:116;;48107:166:::0;13294:13;:11;:13::i;:::-;48194:14:::1;::::0;::::1;;48193:15;48185:46;;;::::0;-1:-1:-1;;;48185:46:0;;9917:2:1;48185:46:0::1;::::0;::::1;9899:21:1::0;9956:2;9936:18;;;9929:30;-1:-1:-1;;;9975:18:1;;;9968:48;10033:18;;48185:46:0::1;9715:342:1::0;48185:46:0::1;48242:7;:23;48252:13:::0;48242:7;:23:::1;:::i;:::-;;48107:166:::0;:::o;47871:228::-;47936:13;47967:16;47975:7;38465:12;;-1:-1:-1;38455:22:0;38370:113;47967:16;47962:59;;47992:29;;-1:-1:-1;;;47992:29:0;;;;;;;;;;;47962:59;48057:7;48065:25;48082:7;48065:16;:25::i;:::-;48043:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48036:55;;47871:228;;;:::o;47727:136::-;13294:13;:11;:13::i;:::-;47790:14:::1;::::0;::::1;;47789:15;47781:42;;;::::0;-1:-1:-1;;;47781:42:0;;13493:2:1;47781:42:0::1;::::0;::::1;13475:21:1::0;13532:2;13512:18;;;13505:30;-1:-1:-1;;;13551:18:1;;;13544:44;13605:18;;47781:42:0::1;13291:338:1::0;47781:42:0::1;47834:14;:21:::0;;-1:-1:-1;;47834:21:0::1;47851:4;47834:21;::::0;;47727:136::o;37007:158::-;-1:-1:-1;;;;;37124:25:0;;;37104:4;37124:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37007:158::o;14314:201::-;13294:13;:11;:13::i;:::-;-1:-1:-1;;;;;14403:22:0;::::1;14395:73;;;::::0;-1:-1:-1;;;14395:73:0;;13836:2:1;14395:73:0::1;::::0;::::1;13818:21:1::0;13875:2;13855:18;;;13848:30;13914:34;13894:18;;;13887:62;-1:-1:-1;;;13965:18:1;;;13958:36;14011:19;;14395:73:0::1;13634:402:1::0;14395:73:0::1;14479:28;14498:8;14479:18;:28::i;:::-;14314:201:::0;:::o;26744:283::-;26874:4;-1:-1:-1;;;;;;26916:50:0;;-1:-1:-1;;;26916:50:0;;:103;;;26983:36;27007:11;26983:23;:36::i;36125:389::-;36202:22;36227:19;36238:7;36227:10;:19::i;:::-;36202:44;;;;;;;;;;;-1:-1:-1;;;;;36202:44:0;;;;;;-1:-1:-1;;;36202:44:0;;;;;-1:-1:-1;;;;;;36202:44:0;;;;;;;-1:-1:-1;36202:44:0;36291:11;;;;;36287:48;;36311:24;;-1:-1:-1;;;36311:24:0;;;;;;;;;;;36287:48;12039:10;-1:-1:-1;;;;;36348:21:0;;;;;;:63;;-1:-1:-1;36374:37:0;36391:5;12039:10;37007:158;:::i;36374:37::-;36373:38;36348:63;36344:128;;;36429:35;;-1:-1:-1;;;36429:35:0;;;;;;;;;;;36344:128;36480:28;36489:2;36493:7;36502:5;36480:8;:28::i;37171:314::-;37287:22;37312:19;37323:7;37312:10;:19::i;:::-;37287:44;;;;;;;;;;;-1:-1:-1;;;;;37287:44:0;;;;-1:-1:-1;;;37287:44:0;;;;-1:-1:-1;;;;;;37287:44:0;;;;;;-1:-1:-1;37343:48:0;12039:10;37376:7;37385:5;37343:18;:48::i;:::-;37338:97;;37400:35;;-1:-1:-1;;;37400:35:0;;;;;;;;;;;37338:97;37444:35;37454:4;37460:2;37464:7;37473:5;37444:9;:35::i;37491:165::-;37611:39;37628:4;37634:2;37638:7;37611:39;;;;;;;;;;;;:16;:39::i;35514:405::-;35574:17;35605:16;35613:7;38465:12;;-1:-1:-1;38455:22:0;38370:113;35605:16;35600:65;;35630:35;;-1:-1:-1;;;35630:35:0;;;;;;;;;;;35600:65;35674:23;35700:16;;;;;;;;;;35708:7;35760:133;35767:11;;-1:-1:-1;;;;;35767:11:0;35760:133;;-1:-1:-1;;35824:14:0;35864:7;:21;;;;;;;;;;;-1:-1:-1;35760:133:0;;;-1:-1:-1;35908:5:0;35514:405;-1:-1:-1;;35514:405:0:o;13573:132::-;13481:6;;-1:-1:-1;;;;;13481:6:0;;;;;12039:10;13637:23;13629:68;;;;-1:-1:-1;;;13629:68:0;;14243:2:1;13629:68:0;;;14225:21:1;;;14262:18;;;14255:30;14321:34;14301:18;;;14294:62;14373:18;;13629:68:0;14041:356:1;14675:191:0;14768:6;;;-1:-1:-1;;;;;14785:17:0;;;14768:6;14785:17;;;-1:-1:-1;;;;;;14785:17:0;;;;;;14818:40;;14768:6;;;;;;;;14818:40;;14749:16;;14818:40;14738:128;14675:191;:::o;36728:273::-;12039:10;-1:-1:-1;;;;;36823:24:0;;;36819:54;;36856:17;;-1:-1:-1;;;36856:17:0;;;;;;;;;;;36819:54;12039:10;36882:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;36882:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;36882:53:0;;;;;;;;;;36947:48;;540:41:1;;;36882:42:0;;12039:10;36947:48;;513:18:1;36947:48:0;;;;;;;36728:273;;:::o;37662:354::-;37807:22;37832:19;37843:7;37832:10;:19::i;:::-;37807:44;;;;;;;;;;;-1:-1:-1;;;;;37807:44:0;;;;-1:-1:-1;;;37807:44:0;;;;-1:-1:-1;;;;;;37807:44:0;;;;;;-1:-1:-1;37863:48:0;12039:10;37896:7;37905:5;37863:18;:48::i;:::-;37858:97;;37920:35;;-1:-1:-1;;;37920:35:0;;;;;;;;;;;37858:97;37964:46;37978:4;37984:2;37988:7;37997:5;38004;37964:13;:46::i;38893:445::-;39029:12;;39048:19;39054:2;39058:8;39048:5;:19::i;:::-;-1:-1:-1;;;;;39080:13:0;;16401:19;:23;39076:257;;39132:9;39127:190;39147:8;39143:1;:12;39127:190;;;39180:63;39211:1;39215:2;39234:1;39219:12;:16;39237:5;39180:22;:63::i;:::-;39175:130;;39265:40;;-1:-1:-1;;;39265:40:0;;;;;;;;;;;39175:130;39157:3;;39127:190;;9213:723;9269:13;9490:5;9499:1;9490:10;9486:53;;-1:-1:-1;;9517:10:0;;;;;;;;;;;;-1:-1:-1;;;9517:10:0;;;;;9213:723::o;9486:53::-;9564:5;9549:12;9605:78;9612:9;;9605:78;;9638:8;;;;:::i;:::-;;-1:-1:-1;9661:10:0;;-1:-1:-1;9669:2:0;9661:10;;:::i;:::-;;;9605:78;;;9693:19;9725:6;9715:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9715:17:0;;9693:39;;9743:154;9750:10;;9743:154;;9777:11;9787:1;9777:11;;:::i;:::-;;-1:-1:-1;9846:10:0;9854:2;9846:5;:10;:::i;:::-;9833:24;;:2;:24;:::i;:::-;9820:39;;9803:6;9810;9803:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;9803:56:0;;;;;;;;-1:-1:-1;9874:11:0;9883:2;9874:11;;:::i;:::-;;;9743:154;;;9921:6;9213:723;-1:-1:-1;;;;9213:723:0:o;34164:281::-;34266:4;-1:-1:-1;;;;;;34293:40:0;;-1:-1:-1;;;34293:40:0;;:99;;-1:-1:-1;;;;;;;34344:48:0;;-1:-1:-1;;;34344:48:0;34293:99;:146;;;-1:-1:-1;;;;;;;;;;26371:40:0;;;34403:36;26262:157;41191:196;41306:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41306:29:0;-1:-1:-1;;;;;41306:29:0;;;;;;;;;41356:11;;41347:34;;41306:24;;:29;;41347:34;;;;;;41306:24;41347:34;41191:196;;;:::o;38489:286::-;38655:11;;38626:4;;-1:-1:-1;;;;;38681:16:0;;;;;;;;:52;;;38701:32;38718:5;38725:7;38701:16;:32::i;:::-;38681:87;;;;38761:7;-1:-1:-1;;;;;38737:31:0;:20;38749:7;38737:11;:20::i;:::-;-1:-1:-1;;;;;38737:31:0;;38681:87;38673:96;38489:286;-1:-1:-1;;;;;38489:286:0:o;40125:904::-;40279:4;-1:-1:-1;;;;;40264:19:0;:5;:11;;;-1:-1:-1;;;;;40264:19:0;;40260:60;;40292:28;;-1:-1:-1;;;40292:28:0;;;;;;;;;;;40260:60;-1:-1:-1;;;;;40331:16:0;;40327:52;;40356:23;;-1:-1:-1;;;40356:23:0;;;;;;;;;;;40327:52;40440:36;40457:1;40461:7;40470:5;40440:8;:36::i;:::-;40536:1;40526:11;;40550:20;40526:11;38465:12;;-1:-1:-1;38455:22:0;38370:113;40550:20;40546:234;;;40583:27;40613:20;;;;;;;;;;40648:15;;-1:-1:-1;;;;;40648:15:0;40644:127;;40710:11;;40750:9;;;;40734:25;;-1:-1:-1;;;40734:25:0;-1:-1:-1;;;;;40692:29:0;;;40734:25;;;40644:127;40572:208;40546:234;-1:-1:-1;40795:26:0;40824:16;;;;;;;;;;;-1:-1:-1;;;;;40847:19:0;;;40873:58;;;40945:27;;40824:16;;;;40847:19;40945:27;;;;;;40795:26;40945:27;40981:42;49264:163;38022:342;38186:35;38196:4;38202:2;38206:7;38215:5;38186:9;:35::i;:::-;-1:-1:-1;;;;;38234:13:0;;16401:19;:23;;38234:68;;;;;38254:48;38277:4;38283:2;38287:7;38296:5;38254:22;:48::i;:::-;38253:49;38234:68;38230:128;;;38318:40;;-1:-1:-1;;;38318:40:0;;;;;;;;;;;39344:775;-1:-1:-1;;;;;39417:16:0;;39413:48;;39442:19;;-1:-1:-1;;;39442:19:0;;;;;;;;;;;39413:48;39472:8;39484:1;39472:13;39468:44;;39494:18;;-1:-1:-1;;;39494:18:0;;;;;;;;;;;39468:44;39544:12;;39657:9;39652:353;39672:8;39668:1;:12;39652:353;;;39702:13;:18;:52;;39736:13;39732:1;:17;;;;;:::i;:::-;;:22;39702:52;;;39723:6;;39702:52;39698:238;;;39803:16;;;39769:23;39795:25;;;;;;;;;;-1:-1:-1;;;;;39833:16:0;;39862:62;;39698:238;39953:42;;39978:16;;;;-1:-1:-1;;;;;39953:42:0;;;39970:1;;39953:42;;39970:1;;39953:42;39682:3;;39652:353;;;-1:-1:-1;40013:12:0;:24;;;;;;49099:157;;;:::o;41393:565::-;41547:72;;-1:-1:-1;;;41547:72:0;;41530:4;;-1:-1:-1;;;;;41547:36:0;;;;;:72;;12039:10;;41598:4;;41604:7;;41613:5;;41547:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41547:72:0;;;;;;;;-1:-1:-1;;41547:72:0;;;;;;;;;;;;:::i;:::-;;;41543:410;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41761:6;:13;41778:1;41761:18;41757:189;;41799:40;;-1:-1:-1;;;41799:40:0;;;;;;;;;;;41757:189;41918:6;41912:13;41903:6;41899:2;41895:15;41888:38;41543:410;-1:-1:-1;;;;;;41660:51:0;-1:-1:-1;;;41660:51:0;;-1:-1:-1;41393:565:0;;;;;;:::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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:248::-;2761:6;2769;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;-1:-1:-1;;2861:23:1;;;2931:2;2916:18;;;2903:32;;-1:-1:-1;2693:248:1:o;3225:186::-;3284:6;3337:2;3325:9;3316:7;3312:23;3308:32;3305:52;;;3353:1;3350;3343:12;3305:52;3376:29;3395:9;3376:29;:::i;3416:118::-;3502:5;3495:13;3488:21;3481:5;3478:32;3468:60;;3524:1;3521;3514:12;3539:315;3604:6;3612;3665:2;3653:9;3644:7;3640:23;3636:32;3633:52;;;3681:1;3678;3671:12;3633:52;3704:29;3723:9;3704:29;:::i;:::-;3694:39;;3783:2;3772:9;3768:18;3755:32;3796:28;3818:5;3796:28;:::i;:::-;3843:5;3833:15;;;3539:315;;;;;:::o;3859:127::-;3920:10;3915:3;3911:20;3908:1;3901:31;3951:4;3948:1;3941:15;3975:4;3972:1;3965:15;3991:275;4062:2;4056:9;4127:2;4108:13;;-1:-1:-1;;4104:27:1;4092:40;;4162:18;4147:34;;4183:22;;;4144:62;4141:88;;;4209:18;;:::i;:::-;4245:2;4238:22;3991:275;;-1:-1:-1;3991:275:1:o;4271:406::-;4335:5;4369:18;4361:6;4358:30;4355:56;;;4391:18;;:::i;:::-;4429:57;4474:2;4453:15;;-1:-1:-1;;4449:29:1;4480:4;4445:40;4429:57;:::i;:::-;4420:66;;4509:6;4502:5;4495:21;4549:3;4540:6;4535:3;4531:16;4528:25;4525:45;;;4566:1;4563;4556:12;4525:45;4615:6;4610:3;4603:4;4596:5;4592:16;4579:43;4669:1;4662:4;4653:6;4646:5;4642:18;4638:29;4631:40;4271:406;;;;;:::o;4682:666::-;4777:6;4785;4793;4801;4854:3;4842:9;4833:7;4829:23;4825:33;4822:53;;;4871:1;4868;4861:12;4822:53;4894:29;4913:9;4894:29;:::i;:::-;4884:39;;4942:38;4976:2;4965:9;4961:18;4942:38;:::i;:::-;4932:48;;5027:2;5016:9;5012:18;4999:32;4989:42;;5082:2;5071:9;5067:18;5054:32;5109:18;5101:6;5098:30;5095:50;;;5141:1;5138;5131:12;5095:50;5164:22;;5217:4;5209:13;;5205:27;-1:-1:-1;5195:55:1;;5246:1;5243;5236:12;5195:55;5269:73;5334:7;5329:2;5316:16;5311:2;5307;5303:11;5269:73;:::i;:::-;5259:83;;;4682:666;;;;;;;:::o;5353:1022::-;5446:6;5454;5507:2;5495:9;5486:7;5482:23;5478:32;5475:52;;;5523:1;5520;5513:12;5475:52;5563:9;5550:23;5592:18;5633:2;5625:6;5622:14;5619:34;;;5649:1;5646;5639:12;5619:34;5687:6;5676:9;5672:22;5662:32;;5732:7;5725:4;5721:2;5717:13;5713:27;5703:55;;5754:1;5751;5744:12;5703:55;5790:2;5777:16;5812:4;5835:2;5831;5828:10;5825:36;;;5841:18;;:::i;:::-;5887:2;5884:1;5880:10;5870:20;;5910:28;5934:2;5930;5926:11;5910:28;:::i;:::-;5972:15;;;6042:11;;;6038:20;;;6003:12;;;;6070:19;;;6067:39;;;6102:1;6099;6092:12;6067:39;6126:11;;;;6146:148;6162:6;6157:3;6154:15;6146:148;;;6228:23;6247:3;6228:23;:::i;:::-;6216:36;;6179:12;;;;6272;;;;6146:148;;;6313:5;6350:18;;;;6337:32;;-1:-1:-1;;;;;;;5353:1022:1:o;6380:450::-;6449:6;6502:2;6490:9;6481:7;6477:23;6473:32;6470:52;;;6518:1;6515;6508:12;6470:52;6558:9;6545:23;6591:18;6583:6;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:22;;6699:4;6691:13;;6687:27;-1:-1:-1;6677:55:1;;6728:1;6725;6718:12;6677:55;6751:73;6816:7;6811:2;6798:16;6793:2;6789;6785:11;6751:73;:::i;6835:260::-;6903:6;6911;6964:2;6952:9;6943:7;6939:23;6935:32;6932:52;;;6980:1;6977;6970:12;6932:52;7003:29;7022:9;7003:29;:::i;:::-;6993:39;;7051:38;7085:2;7074:9;7070:18;7051:38;:::i;:::-;7041:48;;6835:260;;;;;:::o;7100:380::-;7179:1;7175:12;;;;7222;;;7243:61;;7297:4;7289:6;7285:17;7275:27;;7243:61;7350:2;7342:6;7339:14;7319:18;7316:38;7313:161;;7396:10;7391:3;7387:20;7384:1;7377:31;7431:4;7428:1;7421:15;7459:4;7456:1;7449:15;7313:161;;7100:380;;;:::o;7794:245::-;7861:6;7914:2;7902:9;7893:7;7889:23;7885:32;7882:52;;;7930:1;7927;7920:12;7882:52;7962:9;7956:16;7981:28;8003:5;7981:28;:::i;8044:127::-;8105:10;8100:3;8096:20;8093:1;8086:31;8136:4;8133:1;8126:15;8160:4;8157:1;8150:15;8176:168;8249:9;;;8280;;8297:15;;;8291:22;;8277:37;8267:71;;8318:18;;:::i;8349:127::-;8410:10;8405:3;8401:20;8398:1;8391:31;8441:4;8438:1;8431:15;8465:4;8462:1;8455:15;8481:120;8521:1;8547;8537:35;;8552:18;;:::i;:::-;-1:-1:-1;8586:9:1;;8481:120::o;8961:135::-;9000:3;9021:17;;;9018:43;;9041:18;;:::i;:::-;-1:-1:-1;9088:1:1;9077:13;;8961:135::o;9101:125::-;9166:9;;;9187:10;;;9184:36;;;9200:18;;:::i;9583:127::-;9644:10;9639:3;9635:20;9632:1;9625:31;9675:4;9672:1;9665:15;9699:4;9696:1;9689:15;10188:545;10290:2;10285:3;10282:11;10279:448;;;10326:1;10351:5;10347:2;10340:17;10396:4;10392:2;10382:19;10466:2;10454:10;10450:19;10447:1;10443:27;10437:4;10433:38;10502:4;10490:10;10487:20;10484:47;;;-1:-1:-1;10525:4:1;10484:47;10580:2;10575:3;10571:12;10568:1;10564:20;10558:4;10554:31;10544:41;;10635:82;10653:2;10646:5;10643:13;10635:82;;;10698:17;;;10679:1;10668:13;10635:82;;;10639:3;;;10188:545;;;:::o;10909:1352::-;11035:3;11029:10;11062:18;11054:6;11051:30;11048:56;;;11084:18;;:::i;:::-;11113:97;11203:6;11163:38;11195:4;11189:11;11163:38;:::i;:::-;11157:4;11113:97;:::i;:::-;11265:4;;11329:2;11318:14;;11346:1;11341:663;;;;12048:1;12065:6;12062:89;;;-1:-1:-1;12117:19:1;;;12111:26;12062:89;-1:-1:-1;;10866:1:1;10862:11;;;10858:24;10854:29;10844:40;10890:1;10886:11;;;10841:57;12164:81;;11311:944;;11341:663;10135:1;10128:14;;;10172:4;10159:18;;-1:-1:-1;;11377:20:1;;;11495:236;11509:7;11506:1;11503:14;11495:236;;;11598:19;;;11592:26;11577:42;;11690:27;;;;11658:1;11646:14;;;;11525:19;;11495:236;;;11499:3;11759:6;11750:7;11747:19;11744:201;;;11820:19;;;11814:26;-1:-1:-1;;11903:1:1;11899:14;;;11915:3;11895:24;11891:37;11887:42;11872:58;11857:74;;11744:201;-1:-1:-1;;;;;11991:1:1;11975:14;;;11971:22;11958:36;;-1:-1:-1;10909:1352:1:o;12266:1020::-;12442:3;12471:1;12504:6;12498:13;12534:36;12560:9;12534:36;:::i;:::-;12589:1;12606:18;;;12633:133;;;;12780:1;12775:356;;;;12599:532;;12633:133;-1:-1:-1;;12666:24:1;;12654:37;;12739:14;;12732:22;12720:35;;12711:45;;;-1:-1:-1;12633:133:1;;12775:356;12806:6;12803:1;12796:17;12836:4;12881:2;12878:1;12868:16;12906:1;12920:165;12934:6;12931:1;12928:13;12920:165;;;13012:14;;12999:11;;;12992:35;13055:16;;;;12949:10;;12920:165;;;12924:3;;;13114:6;13109:3;13105:16;13098:23;;12599:532;;;;;13162:6;13156:13;13178:68;13237:8;13232:3;13225:4;13217:6;13213:17;13178:68;:::i;:::-;13262:18;;12266:1020;-1:-1:-1;;;;12266:1020:1:o;14402:128::-;14469:9;;;14490:11;;;14487:37;;;14504:18;;:::i;14535:112::-;14567:1;14593;14583:35;;14598:18;;:::i;:::-;-1:-1:-1;14632:9:1;;14535:112::o;14652:489::-;-1:-1:-1;;;;;14921:15:1;;;14903:34;;14973:15;;14968:2;14953:18;;14946:43;15020:2;15005:18;;14998:34;;;15068:3;15063:2;15048:18;;15041:31;;;14846:4;;15089:46;;15115:19;;15107:6;15089:46;:::i;:::-;15081:54;14652:489;-1:-1:-1;;;;;;14652:489:1:o;15146:249::-;15215:6;15268:2;15256:9;15247:7;15243:23;15239:32;15236:52;;;15284:1;15281;15274:12;15236:52;15316:9;15310:16;15335:30;15359:5;15335:30;:::i

Swarm Source

ipfs://88fc4a80a369d01a95e8fd883ca19fd17a434887056ab1fe17e19dee5352a4b8
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.