ETH Price: $3,131.11 (-7.46%)

Token

Lofi Originals 3D (LO3D)
 

Overview

Max Total Supply

5,555 LO3D

Holders

3,094

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 LO3D
0x6184F751Ed287BD1F784d03192524ad158B22822
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:
LofiOriginals3D

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: lo3d/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: lo3d/OperatorFilterer.sol


pragma solidity ^0.8.13;


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

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

// File: lo3d/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


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

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

// File: lo3d/LofiOriginals3D.sol



pragma solidity ^0.8.13;

// File: contracts/Ownable.sol

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == msg.sender, "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() external virtual onlyOwner {
        _setOwner(address(0));
    }

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

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

// File: Strings.sol

/**
 * Source: Openzeppelin
 */

/**
 * @dev String operations.
 */
library Strings {

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

// File: Address.sol

/**
 * Source: Openzeppelin
 */

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// File: IERC721Receiver.sol

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: IERC165.sol

// https://eips.ethereum.org/EIPS/eip-165


interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: IERC2981.sol


/**
 * Source: Openzeppelin
 */


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev 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 salePrice - 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 `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: ERC165.sol


/**
 * Source: Openzeppelin
 */


/**
 * @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: IERC721.sol

// https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/


/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 is IERC165 {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: IERC721Metadata.sol


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

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

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

// File: ERC721.sol

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension
 * Made for efficiancy!
 */
contract ERC721 is ERC165, IERC721, IERC721Metadata, DefaultOperatorFilterer, Ownable {

    using Address for address;
    using Strings for uint256;

    uint16 public totalSupply;

    address public proxyRegistryAddress;

    string public baseURI;

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

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

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

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


    constructor(address _openseaProxyRegistry, string memory _baseURI) {
        proxyRegistryAddress = _openseaProxyRegistry;
        baseURI = _baseURI;
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() external pure override returns (string memory) {
        return "Lofi Originals 3D";
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() external pure override returns (string memory) {
        return "LO3D";
    }

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

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) external override onlyAllowedOperatorApproval(to)  {
        address owner = _owners[tokenId];
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) external override onlyAllowedOperatorApproval(operator)  {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return _operatorApprovals[owner][operator];
    }

    function setOpenseaProxyRegistry(address addr) external onlyOwner {
        proxyRegistryAddress = addr;
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override onlyAllowedOperatorApproval(from)  {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override onlyAllowedOperator(from){
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override onlyAllowedOperator(from) {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
       _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = _owners[tokenId];
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
    
        unchecked {
            _balances[from]--;
            _balances[to]++;
        }

        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}


// File: LofiOriginals3D.sol


contract LofiOriginals3D is Ownable, IERC2981, ERC721 {

    uint private EIP2981RoyaltyPercent;

    constructor(
        uint _royalty,
        address _openseaProxyRegistry,
        string memory _tempBaseURI
    ) ERC721(_openseaProxyRegistry, _tempBaseURI) {
        EIP2981RoyaltyPercent = _royalty;
    }

    function batchMintFromReserve(uint[] memory amount, address[] memory to) external onlyOwner {
        uint length = amount.length;
        require(length == to.length, "array length missmatch");

        uint tokenId = totalSupply;
        uint total;

        uint cAmount;
        address cTo;

        for (uint i; i < length;) {

            assembly {
                cAmount := mload(add(add(amount, 0x20), mul(i, 0x20)))
                cTo := mload(add(add(to, 0x20), mul(i, 0x20)))
            }

            for (uint f; f < cAmount;) {
                
                unchecked {
                    ++tokenId;
                    ++f;
                }

                _owners[tokenId] = cTo;
                emit Transfer(address(0), cTo, tokenId);
            }

            unchecked {
                _balances[cTo] += cAmount;
                total += cAmount;
                ++i;
            }
        }

        unchecked { totalSupply += uint16(total); }
    }

    /**
     * @notice returns royalty info for EIP2981 supporting marketplaces
     * @dev 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 salePrice - 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 `salePrice`
     */
    function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Royality querry for non-existant token!");
        return(owner(), salePrice * EIP2981RoyaltyPercent / 10000);
    }

    /**
     * @notice sets the royalty percentage for EIP2981 supporting marketplaces
     * @dev percentage is in bassis points (parts per 10,000).
            Example: 5% = 500, 0.5% = 50
     * @param amount - percent amount
     */
    function setRoyaltyPercent(uint256 amount) external onlyOwner {
        EIP2981RoyaltyPercent = amount;
    }

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

    function tokensOfOwner(address owner) external view returns(uint[] memory) {
        uint[] memory tokens = new uint[](_balances[owner]);
        uint y = totalSupply + 1;
        uint x;

        for (uint i = 1; i < y;) {
            if (ownerOf(i) == owner) {
                tokens[x] = i;
                unchecked{ ++x; }
            }
            unchecked{ ++i; }
        }

        return tokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_royalty","type":"uint256"},{"internalType":"address","name":"_openseaProxyRegistry","type":"address"},{"internalType":"string","name":"_tempBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"amount","type":"uint256[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"batchMintFromReserve","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","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":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOpenseaProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRoyaltyPercent","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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"}]

60806040523480156200001157600080fd5b5060405162002e3738038062002e378339810160408190526200003491620002ee565b8181733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b1562000192578015620000e057604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000c157600080fd5b505af1158015620000d6573d6000803e3d6000fd5b5050505062000192565b6001600160a01b03821615620001315760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000a6565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200017857600080fd5b505af11580156200018d573d6000803e3d6000fd5b505050505b50620001a0905033620001e2565b600180546001600160a01b0319166001600160a01b0384161790558051620001d090600290602084019062000232565b50505060079290925550620004349050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200024090620003f8565b90600052602060002090601f016020900481019282620002645760008555620002af565b82601f106200027f57805160ff1916838001178555620002af565b82800160010185558215620002af579182015b82811115620002af57825182559160200191906001019062000292565b50620002bd929150620002c1565b5090565b5b80821115620002bd5760008155600101620002c2565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200030457600080fd5b8351602080860151919450906001600160a01b03811681146200032657600080fd5b60408601519093506001600160401b03808211156200034457600080fd5b818701915087601f8301126200035957600080fd5b8151818111156200036e576200036e620002d8565b604051601f8201601f19908116603f01168101908382118183101715620003995762000399620002d8565b816040528281528a86848701011115620003b257600080fd5b600093505b82841015620003d65784840186015181850187015292850192620003b7565b82841115620003e85760008684830101525b8096505050505050509250925092565b600181811c908216806200040d57607f821691505b6020821081036200042e57634e487b7160e01b600052602260045260246000fd5b50919050565b6129f380620004446000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c8063715018a6116100ee578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610423578063cd7c032614610436578063e985e9c514610449578063f2fde38b1461045c57600080fd5b8063a22cb465146103ea578063b88d4fde146103fd578063bd2f52441461041057600080fd5b806395d89b41116100c857806395d89b411461038b578063984f3913146103c45780639a4fc640146103d757600080fd5b8063715018a6146103525780638462151c1461035a5780638da5cb5b1461037a57600080fd5b80632a55205a1161015b57806355f804b31161013557806355f804b3146103035780636352211e146103165780636c0360eb1461032957806370a082311461033157600080fd5b80632a55205a146102a957806341f43434146102db57806342842e0e146102f057600080fd5b8063095ea7b31161018c578063095ea7b31461024857806318160ddd1461025d57806323b872dd1461029657600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc1461021d575b600080fd5b6101c66101c13660046120e5565b61046f565b60405190151581526020015b60405180910390f35b60408051808201909152601181527f4c6f6669204f726967696e616c7320334400000000000000000000000000000060208201525b6040516101d2919061217f565b61023061022b366004612192565b6104cb565b6040516001600160a01b0390911681526020016101d2565b61025b6102563660046121c0565b610576565b005b6000546102839074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101d2565b61025b6102a43660046121ec565b610792565b6102bc6102b736600461222d565b610905565b604080516001600160a01b0390931683526020830191909152016101d2565b6102306daaeb6d7670e522a718067333cd4e81565b61025b6102fe3660046121ec565b6109c3565b61025b610311366004612343565b610ae8565b610230610324366004612192565b610b68565b610210610bf3565b61034461033f36600461238c565b610c81565b6040519081526020016101d2565b61025b610d1b565b61036d61036836600461238c565b610d90565b6040516101d291906123a9565b6000546001600160a01b0316610230565b60408051808201909152600481527f4c4f3344000000000000000000000000000000000000000000000000000000006020820152610210565b61025b6103d2366004612485565b610e8a565b61025b6103e5366004612192565b61109d565b61025b6103f836600461254c565b61110b565b61025b61040b366004612585565b611207565b61025b61041e36600461238c565b61140d565b610210610431366004612192565b6114b0565b600154610230906001600160a01b031681565b6101c6610457366004612605565b61156f565b61025b61046a36600461238c565b611646565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806104c557506104c582611737565b92915050565b6000818152600360205260408120546001600160a01b031661055a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610662576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190612633565b610662576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b6000828152600360205260409020546001600160a01b039081169084168190036106f45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610551565b336001600160a01b03821614806107105750610710813361156f565b6107825760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610551565b61078c848461181a565b50505050565b826daaeb6d7670e522a718067333cd4e3b1561087e576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083d9190612633565b61087e576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b61088833836118a0565b6108fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b61078c848484611985565b60008281526003602052604081205481906001600160a01b03166109915760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610551565b6000546001600160a01b0316612710600754856109ae919061267f565b6109b891906126eb565b915091509250929050565b826daaeb6d7670e522a718067333cd4e3b15610acd57336001600160a01b03821603610a0957610a0484848460405180602001604052806000815250611207565b61078c565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190612633565b610acd576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610551565b61078c84848460405180602001604052806000815250611207565b33610afb6000546001600160a01b031690565b6001600160a01b031614610b515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b8051610b6490600290602084019061201e565b5050565b6000818152600360205260408120546001600160a01b0316806104c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610551565b60028054610c00906126ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2c906126ff565b8015610c795780601f10610c4e57610100808354040283529160200191610c79565b820191906000526020600020905b815481529060010190602001808311610c5c57829003601f168201915b505050505081565b60006001600160a01b038216610cff5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610551565b506001600160a01b031660009081526004602052604090205490565b33610d2e6000546001600160a01b031690565b6001600160a01b031614610d845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b610d8e6000611b4d565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115610dc557610dc561224f565b604051908082528060200260200182016040528015610dee578160200160208202803683370190505b506000805491925090610e1e9074010000000000000000000000000000000000000000900461ffff166001612752565b61ffff169050600060015b82811015610e8057856001600160a01b0316610e4482610b68565b6001600160a01b031603610e785780848381518110610e6557610e65612778565b6020026020010181815250508160010191505b600101610e29565b5091949350505050565b33610e9d6000546001600160a01b031690565b6001600160a01b031614610ef35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b815181518114610f455760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d61746368000000000000000000006044820152606401610551565b6000805474010000000000000000000000000000000000000000900461ffff16908080805b858110156110405760208102602089010151925060208102602088010151915060005b8381101561101557600195860160008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519298939093019288929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f8d565b506001600160a01b038216600090815260046020526040902080548401905592820192600101610f6a565b50506000805461ffff740100000000000000000000000000000000000000008083048216909501169093027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909316929092179091555050505050565b336110b06000546001600160a01b031690565b6001600160a01b0316146111065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b600755565b816daaeb6d7670e522a718067333cd4e3b156111f7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612633565b6111f7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b611202338484611bb5565b505050565b836daaeb6d7670e522a718067333cd4e3b1561137e57336001600160a01b038216036112ba5761123733846118a0565b6112a95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b6112b585858585611ca1565b611406565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611322573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113469190612633565b61137e576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610551565b61138833846118a0565b6113fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b61140685858585611ca1565b5050505050565b336114206000546001600160a01b031690565b6001600160a01b0316146114765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b031661153d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610551565b600261154883611d2a565b6040516020016115599291906127c3565b6040516020818303038152906040529050919050565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe91906128cc565b6001600160a01b0316036116165760019150506104c5565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336116596000546001600160a01b031690565b6001600160a01b0316146116af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b6001600160a01b03811661172b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610551565b61173481611b4d565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806117ca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104c557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104c5565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061186782610b68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b031661192a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610551565b6000828152600360205260409020546001600160a01b0390811690841681148061196d5750836001600160a01b0316611962846104cb565b6001600160a01b0316145b8061197d575061197d818561156f565b949350505050565b6000818152600360205260409020546001600160a01b03848116911614611a145760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610551565b6001600160a01b038216611a8f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610551565b611a9a60008261181a565b6001600160a01b03808416600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600390915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031603611c165760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610551565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cac848484611985565b611cb884848484611e5f565b61078c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610551565b606081600003611d6d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611d975780611d81816128e9565b9150611d909050600a836126eb565b9150611d71565b60008167ffffffffffffffff811115611db257611db261224f565b6040519080825280601f01601f191660200182016040528015611ddc576020820181803683370190505b5090505b841561197d57611df1600183612921565b9150611dfe600a86612938565b611e0990603061294c565b60f81b818381518110611e1e57611e1e612778565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611e58600a866126eb565b9450611de0565b60006001600160a01b0384163b15612013576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611ebc903390899088908890600401612964565b6020604051808303816000875af1925050508015611f15575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f12918101906129a0565b60015b611fc8573d808015611f43576040519150601f19603f3d011682016040523d82523d6000602084013e611f48565b606091505b508051600003611fc05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610551565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061197d565b506001949350505050565b82805461202a906126ff565b90600052602060002090601f01602090048101928261204c5760008555612092565b82601f1061206557805160ff1916838001178555612092565b82800160010185558215612092579182015b82811115612092578251825591602001919060010190612077565b5061209e9291506120a2565b5090565b5b8082111561209e57600081556001016120a3565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461173457600080fd5b6000602082840312156120f757600080fd5b8135612102816120b7565b9392505050565b60005b8381101561212457818101518382015260200161210c565b8381111561078c5750506000910152565b6000815180845261214d816020860160208601612109565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121026020830184612135565b6000602082840312156121a457600080fd5b5035919050565b6001600160a01b038116811461173457600080fd5b600080604083850312156121d357600080fd5b82356121de816121ab565b946020939093013593505050565b60008060006060848603121561220157600080fd5b833561220c816121ab565b9250602084013561221c816121ab565b929592945050506040919091013590565b6000806040838503121561224057600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122c5576122c561224f565b604052919050565b600067ffffffffffffffff8311156122e7576122e761224f565b61231860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161227e565b905082815283838301111561232c57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561235557600080fd5b813567ffffffffffffffff81111561236c57600080fd5b8201601f8101841361237d57600080fd5b61197d848235602084016122cd565b60006020828403121561239e57600080fd5b8135612102816121ab565b6020808252825182820181905260009190848201906040850190845b818110156123e1578351835292840192918401916001016123c5565b50909695505050505050565b600067ffffffffffffffff8211156124075761240761224f565b5060051b60200190565b600082601f83011261242257600080fd5b81356020612437612432836123ed565b61227e565b82815260059290921b8401810191818101908684111561245657600080fd5b8286015b8481101561247a57803561246d816121ab565b835291830191830161245a565b509695505050505050565b6000806040838503121561249857600080fd5b823567ffffffffffffffff808211156124b057600080fd5b818501915085601f8301126124c457600080fd5b813560206124d4612432836123ed565b82815260059290921b840181019181810190898411156124f357600080fd5b948201945b83861015612511578535825294820194908201906124f8565b9650508601359250508082111561252757600080fd5b5061253485828601612411565b9150509250929050565b801515811461173457600080fd5b6000806040838503121561255f57600080fd5b823561256a816121ab565b9150602083013561257a8161253e565b809150509250929050565b6000806000806080858703121561259b57600080fd5b84356125a6816121ab565b935060208501356125b6816121ab565b925060408501359150606085013567ffffffffffffffff8111156125d957600080fd5b8501601f810187136125ea57600080fd5b6125f9878235602084016122cd565b91505092959194509250565b6000806040838503121561261857600080fd5b8235612623816121ab565b9150602083013561257a816121ab565b60006020828403121561264557600080fd5b81516121028161253e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126b7576126b7612650565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826126fa576126fa6126bc565b500490565b600181811c9082168061271357607f821691505b60208210810361274c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681851680830382111561276f5761276f612650565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081516127b9818560208601612109565b9290920192915050565b600080845481600182811c9150808316806127df57607f831692505b60208084108203612817577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561282b576001811461285a57612887565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612887565b60008b81526020902060005b8681101561287f5781548b820152908501908301612866565b505084890196505b5050505050506128c361289a82866127a7565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b6000602082840312156128de57600080fd5b8151612102816121ab565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361291a5761291a612650565b5060010190565b60008282101561293357612933612650565b500390565b600082612947576129476126bc565b500690565b6000821982111561295f5761295f612650565b500190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526129966080830184612135565b9695505050505050565b6000602082840312156129b257600080fd5b8151612102816120b756fea26469706673582212209836e7437ec8dc2b421e59c6be69baf47ff7ed506c66c1f123ea781256a9058464736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000028a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6c6f33642e6d7970696e6174612e636c6f75642f697066732f516d616348514a357444464b6639436a7073767475774c4e5532486645313975716f5478665a46476966677034672f00000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c8063715018a6116100ee578063a22cb46511610097578063c87b56dd11610071578063c87b56dd14610423578063cd7c032614610436578063e985e9c514610449578063f2fde38b1461045c57600080fd5b8063a22cb465146103ea578063b88d4fde146103fd578063bd2f52441461041057600080fd5b806395d89b41116100c857806395d89b411461038b578063984f3913146103c45780639a4fc640146103d757600080fd5b8063715018a6146103525780638462151c1461035a5780638da5cb5b1461037a57600080fd5b80632a55205a1161015b57806355f804b31161013557806355f804b3146103035780636352211e146103165780636c0360eb1461032957806370a082311461033157600080fd5b80632a55205a146102a957806341f43434146102db57806342842e0e146102f057600080fd5b8063095ea7b31161018c578063095ea7b31461024857806318160ddd1461025d57806323b872dd1461029657600080fd5b806301ffc9a7146101b357806306fdde03146101db578063081812fc1461021d575b600080fd5b6101c66101c13660046120e5565b61046f565b60405190151581526020015b60405180910390f35b60408051808201909152601181527f4c6f6669204f726967696e616c7320334400000000000000000000000000000060208201525b6040516101d2919061217f565b61023061022b366004612192565b6104cb565b6040516001600160a01b0390911681526020016101d2565b61025b6102563660046121c0565b610576565b005b6000546102839074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff90911681526020016101d2565b61025b6102a43660046121ec565b610792565b6102bc6102b736600461222d565b610905565b604080516001600160a01b0390931683526020830191909152016101d2565b6102306daaeb6d7670e522a718067333cd4e81565b61025b6102fe3660046121ec565b6109c3565b61025b610311366004612343565b610ae8565b610230610324366004612192565b610b68565b610210610bf3565b61034461033f36600461238c565b610c81565b6040519081526020016101d2565b61025b610d1b565b61036d61036836600461238c565b610d90565b6040516101d291906123a9565b6000546001600160a01b0316610230565b60408051808201909152600481527f4c4f3344000000000000000000000000000000000000000000000000000000006020820152610210565b61025b6103d2366004612485565b610e8a565b61025b6103e5366004612192565b61109d565b61025b6103f836600461254c565b61110b565b61025b61040b366004612585565b611207565b61025b61041e36600461238c565b61140d565b610210610431366004612192565b6114b0565b600154610230906001600160a01b031681565b6101c6610457366004612605565b61156f565b61025b61046a36600461238c565b611646565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a0000000000000000000000000000000000000000000000000000000014806104c557506104c582611737565b92915050565b6000818152600360205260408120546001600160a01b031661055a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b816daaeb6d7670e522a718067333cd4e3b15610662576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190612633565b610662576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b6000828152600360205260409020546001600160a01b039081169084168190036106f45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610551565b336001600160a01b03821614806107105750610710813361156f565b6107825760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610551565b61078c848461181a565b50505050565b826daaeb6d7670e522a718067333cd4e3b1561087e576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610819573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083d9190612633565b61087e576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b61088833836118a0565b6108fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b61078c848484611985565b60008281526003602052604081205481906001600160a01b03166109915760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e21000000000000000000000000000000000000000000000000006064820152608401610551565b6000546001600160a01b0316612710600754856109ae919061267f565b6109b891906126eb565b915091509250929050565b826daaeb6d7670e522a718067333cd4e3b15610acd57336001600160a01b03821603610a0957610a0484848460405180602001604052806000815250611207565b61078c565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a959190612633565b610acd576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610551565b61078c84848460405180602001604052806000815250611207565b33610afb6000546001600160a01b031690565b6001600160a01b031614610b515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b8051610b6490600290602084019061201e565b5050565b6000818152600360205260408120546001600160a01b0316806104c55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610551565b60028054610c00906126ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2c906126ff565b8015610c795780601f10610c4e57610100808354040283529160200191610c79565b820191906000526020600020905b815481529060010190602001808311610c5c57829003601f168201915b505050505081565b60006001600160a01b038216610cff5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610551565b506001600160a01b031660009081526004602052604090205490565b33610d2e6000546001600160a01b031690565b6001600160a01b031614610d845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b610d8e6000611b4d565b565b6001600160a01b0381166000908152600460205260408120546060919067ffffffffffffffff811115610dc557610dc561224f565b604051908082528060200260200182016040528015610dee578160200160208202803683370190505b506000805491925090610e1e9074010000000000000000000000000000000000000000900461ffff166001612752565b61ffff169050600060015b82811015610e8057856001600160a01b0316610e4482610b68565b6001600160a01b031603610e785780848381518110610e6557610e65612778565b6020026020010181815250508160010191505b600101610e29565b5091949350505050565b33610e9d6000546001600160a01b031690565b6001600160a01b031614610ef35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b815181518114610f455760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e677468206d6973736d61746368000000000000000000006044820152606401610551565b6000805474010000000000000000000000000000000000000000900461ffff16908080805b858110156110405760208102602089010151925060208102602088010151915060005b8381101561101557600195860160008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881690811790915590519298939093019288929091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4610f8d565b506001600160a01b038216600090815260046020526040902080548401905592820192600101610f6a565b50506000805461ffff740100000000000000000000000000000000000000008083048216909501169093027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff909316929092179091555050505050565b336110b06000546001600160a01b031690565b6001600160a01b0316146111065760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b600755565b816daaeb6d7670e522a718067333cd4e3b156111f7576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612633565b6111f7576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610551565b611202338484611bb5565b505050565b836daaeb6d7670e522a718067333cd4e3b1561137e57336001600160a01b038216036112ba5761123733846118a0565b6112a95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b6112b585858585611ca1565b611406565b6040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611322573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113469190612633565b61137e576040517fede71dcc000000000000000000000000000000000000000000000000000000008152336004820152602401610551565b61138833846118a0565b6113fa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610551565b61140685858585611ca1565b5050505050565b336114206000546001600160a01b031690565b6001600160a01b0316146114765760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b031661153d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610551565b600261154883611d2a565b6040516020016115599291906127c3565b6040516020818303038152906040529050919050565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa1580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe91906128cc565b6001600160a01b0316036116165760019150506104c5565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b336116596000546001600160a01b031690565b6001600160a01b0316146116af5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610551565b6001600160a01b03811661172b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610551565b61173481611b4d565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806117ca57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104c557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146104c5565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061186782610b68565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b031661192a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610551565b6000828152600360205260409020546001600160a01b0390811690841681148061196d5750836001600160a01b0316611962846104cb565b6001600160a01b0316145b8061197d575061197d818561156f565b949350505050565b6000818152600360205260409020546001600160a01b03848116911614611a145760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610551565b6001600160a01b038216611a8f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610551565b611a9a60008261181a565b6001600160a01b03808416600081815260046020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905593861680835284832080546001019055858352600390915283822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016821790559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031603611c165760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610551565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611cac848484611985565b611cb884848484611e5f565b61078c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610551565b606081600003611d6d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611d975780611d81816128e9565b9150611d909050600a836126eb565b9150611d71565b60008167ffffffffffffffff811115611db257611db261224f565b6040519080825280601f01601f191660200182016040528015611ddc576020820181803683370190505b5090505b841561197d57611df1600183612921565b9150611dfe600a86612938565b611e0990603061294c565b60f81b818381518110611e1e57611e1e612778565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611e58600a866126eb565b9450611de0565b60006001600160a01b0384163b15612013576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290611ebc903390899088908890600401612964565b6020604051808303816000875af1925050508015611f15575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f12918101906129a0565b60015b611fc8573d808015611f43576040519150601f19603f3d011682016040523d82523d6000602084013e611f48565b606091505b508051600003611fc05760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610551565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061197d565b506001949350505050565b82805461202a906126ff565b90600052602060002090601f01602090048101928261204c5760008555612092565b82601f1061206557805160ff1916838001178555612092565b82800160010185558215612092579182015b82811115612092578251825591602001919060010190612077565b5061209e9291506120a2565b5090565b5b8082111561209e57600081556001016120a3565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461173457600080fd5b6000602082840312156120f757600080fd5b8135612102816120b7565b9392505050565b60005b8381101561212457818101518382015260200161210c565b8381111561078c5750506000910152565b6000815180845261214d816020860160208601612109565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121026020830184612135565b6000602082840312156121a457600080fd5b5035919050565b6001600160a01b038116811461173457600080fd5b600080604083850312156121d357600080fd5b82356121de816121ab565b946020939093013593505050565b60008060006060848603121561220157600080fd5b833561220c816121ab565b9250602084013561221c816121ab565b929592945050506040919091013590565b6000806040838503121561224057600080fd5b50508035926020909101359150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122c5576122c561224f565b604052919050565b600067ffffffffffffffff8311156122e7576122e761224f565b61231860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161227e565b905082815283838301111561232c57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561235557600080fd5b813567ffffffffffffffff81111561236c57600080fd5b8201601f8101841361237d57600080fd5b61197d848235602084016122cd565b60006020828403121561239e57600080fd5b8135612102816121ab565b6020808252825182820181905260009190848201906040850190845b818110156123e1578351835292840192918401916001016123c5565b50909695505050505050565b600067ffffffffffffffff8211156124075761240761224f565b5060051b60200190565b600082601f83011261242257600080fd5b81356020612437612432836123ed565b61227e565b82815260059290921b8401810191818101908684111561245657600080fd5b8286015b8481101561247a57803561246d816121ab565b835291830191830161245a565b509695505050505050565b6000806040838503121561249857600080fd5b823567ffffffffffffffff808211156124b057600080fd5b818501915085601f8301126124c457600080fd5b813560206124d4612432836123ed565b82815260059290921b840181019181810190898411156124f357600080fd5b948201945b83861015612511578535825294820194908201906124f8565b9650508601359250508082111561252757600080fd5b5061253485828601612411565b9150509250929050565b801515811461173457600080fd5b6000806040838503121561255f57600080fd5b823561256a816121ab565b9150602083013561257a8161253e565b809150509250929050565b6000806000806080858703121561259b57600080fd5b84356125a6816121ab565b935060208501356125b6816121ab565b925060408501359150606085013567ffffffffffffffff8111156125d957600080fd5b8501601f810187136125ea57600080fd5b6125f9878235602084016122cd565b91505092959194509250565b6000806040838503121561261857600080fd5b8235612623816121ab565b9150602083013561257a816121ab565b60006020828403121561264557600080fd5b81516121028161253e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156126b7576126b7612650565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826126fa576126fa6126bc565b500490565b600181811c9082168061271357607f821691505b60208210810361274c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600061ffff80831681851680830382111561276f5761276f612650565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081516127b9818560208601612109565b9290920192915050565b600080845481600182811c9150808316806127df57607f831692505b60208084108203612817577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561282b576001811461285a57612887565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612887565b60008b81526020902060005b8681101561287f5781548b820152908501908301612866565b505084890196505b5050505050506128c361289a82866127a7565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b6000602082840312156128de57600080fd5b8151612102816121ab565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361291a5761291a612650565b5060010190565b60008282101561293357612933612650565b500390565b600082612947576129476126bc565b500690565b6000821982111561295f5761295f612650565b500190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526129966080830184612135565b9695505050505050565b6000602082840312156129b257600080fd5b8151612102816120b756fea26469706673582212209836e7437ec8dc2b421e59c6be69baf47ff7ed506c66c1f123ea781256a9058464736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000028a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f6c6f33642e6d7970696e6174612e636c6f75642f697066732f516d616348514a357444464b6639436a7073767475774c4e5532486645313975716f5478665a46476966677034672f00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _royalty (uint256): 650
Arg [1] : _openseaProxyRegistry (address): 0x0000000000000000000000000000000000000000
Arg [2] : _tempBaseURI (string): https://lo3d.mypinata.cloud/ipfs/QmacHQJ5tDFKf9CjpsvtuwLNU2HfE19uqoTxfZFGifgp4g/

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000028a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [4] : 68747470733a2f2f6c6f33642e6d7970696e6174612e636c6f75642f69706673
Arg [5] : 2f516d616348514a357444464b6639436a7073767475774c4e55324866453139
Arg [6] : 75716f5478665a46476966677034672f00000000000000000000000000000000


Deployed Bytecode Sourcemap

30438:3233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32994:241;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;32994:241:0;;;;;;;;21743:108;21817:26;;;;;;;;;;;;;;;;;21743:108;;;;;;;:::i;23000:213::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1819:55:1;;;1801:74;;1789:2;1774:18;23000:213:0;1655:226:1;22507:427:0;;;;;;:::i;:::-;;:::i;:::-;;20032:25;;;;;;;;;;;;;;;2539:6:1;2527:19;;;2509:38;;2497:2;2482:18;20032:25:0;2365:188:1;24129:366:0;;;;;;:::i;:::-;;:::i;32281:279::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3464:55:1;;;3446:74;;3551:2;3536:18;;3529:34;;;;3419:18;32281:279:0;3272:297:1;2912:143:0;;3012:42;2912:143;;24566:204;;;;;;:::i;:::-;;:::i;22355:90::-;;;;;;:::i;:::-;;:::i;21445:231::-;;;;;;:::i;:::-;;:::i;20110:21::-;;;:::i;21181:202::-;;;;;;:::i;:::-;;:::i;:::-;;;5689:25:1;;;5677:2;5662:18;21181:202:0;5543:177:1;7300:96:0;;;:::i;33243:425::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6651:87::-;6697:7;6724:6;-1:-1:-1;;;;;6724:6:0;6651:87;;21920:97;21996:13;;;;;;;;;;;;;;;;;21920:97;;30767:1019;;;;;;:::i;:::-;;:::i;32811:111::-;;;;;;:::i;:::-;;:::i;23285:186::-;;;;;;:::i;:::-;;:::i;24841:343::-;;;;;;:::i;:::-;;:::i;23950:112::-;;;;;;:::i;:::-;;:::i;22088:259::-;;;;;;:::i;:::-;;:::i;20066:35::-;;;;;-1:-1:-1;;;;;20066:35:0;;;23542:400;;;;;;:::i;:::-;;:::i;7551:194::-;;;;;;:::i;:::-;;:::i;32994:241::-;33096:4;33133:41;;;33148:26;33133:41;;:94;;;33191:36;33215:11;33191:23;:36::i;:::-;33113:114;32994:241;-1:-1:-1;;32994:241:0:o;23000:213::-;23068:7;26714:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26714:16:0;23088:73;;;;-1:-1:-1;;;23088:73:0;;10342:2:1;23088:73:0;;;10324:21:1;10381:2;10361:18;;;10354:30;10420:34;10400:18;;;10393:62;10491:14;10471:18;;;10464:42;10523:19;;23088:73:0;;;;;;;;;-1:-1:-1;23181:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23181:24:0;;23000:213::o;22507:427::-;22599:2;3012:42;4906:45;:49;4902:225;;4977:67;;;;;5028:4;4977:67;;;10788:34:1;-1:-1:-1;;;;;10858:15:1;;10838:18;;;10831:43;3012:42:0;;4977;;10700:18:1;;4977:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4972:144;;5072:28;;;;;-1:-1:-1;;;;;1819:55:1;;5072:28:0;;;1801:74:1;1774:18;;5072:28:0;1655:226:1;4972:144:0;22615:13:::1;22631:16:::0;;;:7:::1;:16;::::0;;;;;-1:-1:-1;;;;;22631:16:0;;::::1;::::0;22666:11;::::1;::::0;;;22658:57:::1;;;::::0;-1:-1:-1;;;22658:57:0;;11337:2:1;22658:57:0::1;::::0;::::1;11319:21:1::0;11376:2;11356:18;;;11349:30;11415:34;11395:18;;;11388:62;11486:3;11466:18;;;11459:31;11507:19;;22658:57:0::1;11135:397:1::0;22658:57:0::1;22750:10;-1:-1:-1::0;;;;;22750:19:0;::::1;;::::0;:58:::1;;;22773:35;22790:5;22797:10;22773:16;:35::i;:::-;22728:164;;;::::0;-1:-1:-1;;;22728:164:0;;11739:2:1;22728:164:0::1;::::0;::::1;11721:21:1::0;11778:2;11758:18;;;11751:30;11817:34;11797:18;;;11790:62;11888:26;11868:18;;;11861:54;11932:19;;22728:164:0::1;11537:420:1::0;22728:164:0::1;22905:21;22914:2;22918:7;22905:8;:21::i;:::-;22604:330;22507:427:::0;;;:::o;24129:366::-;24274:4;3012:42;4906:45;:49;4902:225;;4977:67;;;;;5028:4;4977:67;;;10788:34:1;-1:-1:-1;;;;;10858:15:1;;10838:18;;;10831:43;3012:42:0;;4977;;10700:18:1;;4977:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4972:144;;5072:28;;;;;-1:-1:-1;;;;;1819:55:1;;5072:28:0;;;1801:74:1;1774:18;;5072:28:0;1655:226:1;4972:144:0;24353:39:::1;24372:10;24384:7;24353:18;:39::i;:::-;24345:101;;;::::0;-1:-1:-1;;;24345:101:0;;12164:2:1;24345:101:0::1;::::0;::::1;12146:21:1::0;12203:2;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12313:19;12293:18;;;12286:47;12350:19;;24345:101:0::1;11962:413:1::0;24345:101:0::1;24459:28;24469:4;24475:2;24479:7;24459:9;:28::i;32281:279::-:0;32363:16;26714;;;:7;:16;;;;;;32363;;-1:-1:-1;;;;;26714:16:0;32415:68;;;;-1:-1:-1;;;32415:68:0;;12582:2:1;32415:68:0;;;12564:21:1;12621:2;12601:18;;;12594:30;12660:34;12640:18;;;12633:62;12731:9;12711:18;;;12704:37;12758:19;;32415:68:0;12380:403:1;32415:68:0;6697:7;6724:6;-1:-1:-1;;;;;6724:6:0;32546:5;32522:21;;32510:9;:33;;;;:::i;:::-;:41;;;;:::i;:::-;32494:58;;;;32281:279;;;;;:::o;24566:204::-;24707:4;3012:42;4160:45;:49;4156:539;;4449:10;-1:-1:-1;;;;;4441:18:0;;;4437:85;;24723:39:::1;24740:4;24746:2;24750:7;24723:39;;;;;;;;;;;::::0;:16:::1;:39::i;:::-;4500:7:::0;;4437:85;4541:69;;;;;4592:4;4541:69;;;10788:34:1;4599:10:0;10838:18:1;;;10831:43;3012:42:0;;4541;;10700:18:1;;4541:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4536:148;;4638:30;;;;;4657:10;4638:30;;;1801:74:1;1774:18;;4638:30:0;1655:226:1;4536:148:0;24723:39:::1;24740:4;24746:2;24750:7;24723:39;;;;;;;;;;;::::0;:16:::1;:39::i;22355:90::-:0;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;22424:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;22355:90:::0;:::o;21445:231::-;21509:7;21545:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21545:16:0;;21572:73;;;;-1:-1:-1;;;21572:73:0;;14087:2:1;21572:73:0;;;14069:21:1;14126:2;14106:18;;;14099:30;14165:34;14145:18;;;14138:62;14236:11;14216:18;;;14209:39;14265:19;;21572:73:0;13885:405:1;20110:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21181:202::-;21247:7;-1:-1:-1;;;;;21275:19:0;;21267:74;;;;-1:-1:-1;;;21267:74:0;;14939:2:1;21267:74:0;;;14921:21:1;14978:2;14958:18;;;14951:30;15017:34;14997:18;;;14990:62;15088:12;15068:18;;;15061:40;15118:19;;21267:74:0;14737:406:1;21267:74:0;-1:-1:-1;;;;;;21359:16:0;;;;;:9;:16;;;;;;;21181:202::o;7300:96::-;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;7367:21:::1;7385:1;7367:9;:21::i;:::-;7300:96::o:0;33243:425::-;-1:-1:-1;;;;;33363:16:0;;33329:20;33363:16;;;:9;:16;;;;;;33303:13;;33329:20;33352:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33352:28:0;-1:-1:-1;33391:6:0;33400:11;;33329:51;;-1:-1:-1;33391:6:0;33400:15;;:11;;;;;33414:1;33400:15;:::i;:::-;33391:24;;;-1:-1:-1;33426:6:0;33459:1;33445:190;33466:1;33462;:5;33445:190;;;33503:5;-1:-1:-1;;;;;33489:19:0;:10;33497:1;33489:7;:10::i;:::-;-1:-1:-1;;;;;33489:19:0;;33485:108;;33541:1;33529:6;33536:1;33529:9;;;;;;;;:::i;:::-;;;;;;:13;;;;;33572:3;;;;;33485:108;33618:3;;33445:190;;;-1:-1:-1;33654:6:0;;33243:425;-1:-1:-1;;;;33243:425:0:o;30767:1019::-;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;30884:13;;30926:9;;30916:19;::::1;30908:54;;;::::0;-1:-1:-1;;;30908:54:0;;15768:2:1;30908:54:0::1;::::0;::::1;15750:21:1::0;15807:2;15787:18;;;15780:30;15846:24;15826:18;;;15819:52;15888:18;;30908:54:0::1;15566:346:1::0;30908:54:0::1;30975:12;30990:11:::0;;;;::::1;;;::::0;30975:12;;;31082:642:::1;31099:6;31095:1;:10;31082:642;;;31200:4;31197:1;31193:12;31186:4;31178:6;31174:17;31170:36;31164:43;31153:54;;31264:4;31261:1;31257:12;31250:4;31246:2;31242:13;31238:32;31232:39;31225:46;;31307:6;31302:268;31319:7;31315:1;:11;31302:268;;;31399:9;::::0;;::::1;31474:16;::::0;;;:7:::1;:16;::::0;;;;;:22;;;::::1;-1:-1:-1::0;;;;;31474:22:0;::::1;::::0;;::::1;::::0;;;31520:34;;31399:9;;31431:3;;;::::1;::::0;31399:9;;31474:22;;:16;31520:34:::1;::::0;31474:16;;31520:34:::1;31302:268;;;-1:-1:-1::0;;;;;;31615:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;:25;;;::::1;::::0;;31659:16;;::::1;::::0;-1:-1:-1;31694:3:0::1;31082:642;;;-1:-1:-1::0;;31748:11:0::1;:28:::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;;;30767:1019:0:o;32811:111::-;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;32884:21:::1;:30:::0;32811:111::o;23285:186::-;23391:8;3012:42;4906:45;:49;4902:225;;4977:67;;;;;5028:4;4977:67;;;10788:34:1;-1:-1:-1;;;;;10858:15:1;;10838:18;;;10831:43;3012:42:0;;4977;;10700:18:1;;4977:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4972:144;;5072:28;;;;;-1:-1:-1;;;;;1819:55:1;;5072:28:0;;;1801:74:1;1774:18;;5072:28:0;1655:226:1;4972:144:0;23413:50:::1;23432:10;23444:8;23454;23413:18;:50::i;:::-;23285:186:::0;;;:::o;24841:343::-;25009:4;3012:42;4160:45;:49;4156:539;;4449:10;-1:-1:-1;;;;;4441:18:0;;;4437:85;;25034:39:::1;25053:10;25065:7;25034:18;:39::i;:::-;25026:101;;;::::0;-1:-1:-1;;;25026:101:0;;12164:2:1;25026:101:0::1;::::0;::::1;12146:21:1::0;12203:2;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12313:19;12293:18;;;12286:47;12350:19;;25026:101:0::1;11962:413:1::0;25026:101:0::1;25137:39;25151:4;25157:2;25161:7;25170:5;25137:13;:39::i;:::-;4500:7:::0;;4437:85;4541:69;;;;;4592:4;4541:69;;;10788:34:1;4599:10:0;10838:18:1;;;10831:43;3012:42:0;;4541;;10700:18:1;;4541:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4536:148;;4638:30;;;;;4657:10;4638:30;;;1801:74:1;1774:18;;4638:30:0;1655:226:1;4536:148:0;25034:39:::1;25053:10;25065:7;25034:18;:39::i;:::-;25026:101;;;::::0;-1:-1:-1;;;25026:101:0;;12164:2:1;25026:101:0::1;::::0;::::1;12146:21:1::0;12203:2;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12313:19;12293:18;;;12286:47;12350:19;;25026:101:0::1;11962:413:1::0;25026:101:0::1;25137:39;25151:4;25157:2;25161:7;25170:5;25137:13;:39::i;:::-;24841:343:::0;;;;;:::o;23950:112::-;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;24027:20:::1;:27:::0;;;::::1;-1:-1:-1::0;;;;;24027:27:0;;;::::1;::::0;;;::::1;::::0;;23950:112::o;22088:259::-;26690:4;26714:16;;;:7;:16;;;;;;22155:13;;-1:-1:-1;;;;;26714:16:0;22181:76;;;;-1:-1:-1;;;22181:76:0;;16119:2:1;22181:76:0;;;16101:21:1;16158:2;16138:18;;;16131:30;16197:34;16177:18;;;16170:62;16268:17;16248:18;;;16241:45;16303:19;;22181:76:0;15917:411:1;22181:76:0;22301:7;22310:18;:7;:16;:18::i;:::-;22284:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22270:69;;22088:259;;;:::o;23542:400::-;23755:20;;23799:28;;;;;-1:-1:-1;;;;;1819:55:1;;;23799:28:0;;;1801:74:1;23631:4:0;;23755:20;;;23791:49;;;;23755:20;;23799:21;;1774:18:1;;23799:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23791:49:0;;23787:93;;23864:4;23857:11;;;;;23787:93;-1:-1:-1;;;;;;;23899:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23542:400::o;7551:194::-;6882:10;6871:7;6697;6724:6;-1:-1:-1;;;;;6724:6:0;;6651:87;6871:7;-1:-1:-1;;;;;6871:21:0;;6863:66;;;;-1:-1:-1;;;6863:66:0;;13726:2:1;6863:66:0;;;13708:21:1;;;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;13856:18;;6863:66:0;13524:356:1;6863:66:0;-1:-1:-1;;;;;7642:22:0;::::1;7634:73;;;::::0;-1:-1:-1;;;7634:73:0;;18675:2:1;7634:73:0::1;::::0;::::1;18657:21:1::0;18714:2;18694:18;;;18687:30;18753:34;18733:18;;;18726:62;18824:8;18804:18;;;18797:36;18850:19;;7634:73:0::1;18473:402:1::0;7634:73:0::1;7718:19;7728:8;7718:9;:19::i;:::-;7551:194:::0;:::o;20812:305::-;20914:4;20951:40;;;20966:25;20951:40;;:105;;-1:-1:-1;21008:48:0;;;21023:33;21008:48;20951:105;:158;;;-1:-1:-1;13094:25:0;13079:40;;;;21073:36;12970:157;28270:174;28345:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;28345:29:0;;;;;;;;:24;;28399:23;28345:24;28399:14;:23::i;:::-;-1:-1:-1;;;;;28390:46:0;;;;;;;;;;;28270:174;;:::o;26919:341::-;27012:4;26714:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26714:16:0;27029:73;;;;-1:-1:-1;;;27029:73:0;;19082:2:1;27029:73:0;;;19064:21:1;19121:2;19101:18;;;19094:30;19160:34;19140:18;;;19133:62;19231:14;19211:18;;;19204:42;19263:19;;27029:73:0;18880:408:1;27029:73:0;27113:13;27129:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27129:16:0;;;;27164;;;;;:51;;;27208:7;-1:-1:-1;;;;;27184:31:0;:20;27196:7;27184:11;:20::i;:::-;-1:-1:-1;;;;;27184:31:0;;27164:51;:87;;;;27219:32;27236:5;27243:7;27219:16;:32::i;:::-;27156:96;26919:341;-1:-1:-1;;;;26919:341:0:o;27597:555::-;27729:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;27729:24:0;;;:16;;:24;27721:74;;;;-1:-1:-1;;;27721:74:0;;19495:2:1;27721:74:0;;;19477:21:1;19534:2;19514:18;;;19507:30;19573:34;19553:18;;;19546:62;19644:7;19624:18;;;19617:35;19669:19;;27721:74:0;19293:401:1;27721:74:0;-1:-1:-1;;;;;27814:16:0;;27806:65;;;;-1:-1:-1;;;27806:65:0;;19901:2:1;27806:65:0;;;19883:21:1;19940:2;19920:18;;;19913:30;19979:34;19959:18;;;19952:62;20050:6;20030:18;;;20023:34;20074:19;;27806:65:0;19699:400:1;27806:65:0;27936:29;27953:1;27957:7;27936:8;:29::i;:::-;-1:-1:-1;;;;;28007:15:0;;;;;;;:9;:15;;;;;;;;:17;;;;;;28039:13;;;;;;;;;:15;;28007:17;28039:15;;;28078:16;;;:7;:16;;;;;;:21;;;;;;;;28117:27;;28086:7;;28039:13;28007:15;28117:27;;;27597:555;;;:::o;7753:173::-;7809:16;7828:6;;-1:-1:-1;;;;;7845:17:0;;;;;;;;;;7878:40;;7828:6;;;;;;;7878:40;;7809:16;7878:40;7798:128;7753:173;:::o;28586:315::-;28741:8;-1:-1:-1;;;;;28732:17:0;:5;-1:-1:-1;;;;;28732:17:0;;28724:55;;;;-1:-1:-1;;;28724:55:0;;20306:2:1;28724:55:0;;;20288:21:1;20345:2;20325:18;;;20318:30;20384:27;20364:18;;;20357:55;20429:18;;28724:55:0;20104:349:1;28724:55:0;-1:-1:-1;;;;;28790:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;28852:41;;586::1;;;28852::0;;559:18:1;28852:41:0;;;;;;;28586:315;;;:::o;26066:::-;26223:28;26233:4;26239:2;26243:7;26223:9;:28::i;:::-;26270:48;26293:4;26299:2;26303:7;26312:5;26270:22;:48::i;:::-;26262:111;;;;-1:-1:-1;;;26262:111:0;;20660:2:1;26262:111:0;;;20642:21:1;20699:2;20679:18;;;20672:30;20738:34;20718:18;;;20711:62;20809:20;20789:18;;;20782:48;20847:19;;26262:111:0;20458:414:1;8155:723:0;8211:13;8432:5;8441:1;8432:10;8428:53;;-1:-1:-1;;8459:10:0;;;;;;;;;;;;;;;;;;8155:723::o;8428:53::-;8506:5;8491:12;8547:78;8554:9;;8547:78;;8580:8;;;;:::i;:::-;;-1:-1:-1;8603:10:0;;-1:-1:-1;8611:2:0;8603:10;;:::i;:::-;;;8547:78;;;8635:19;8667:6;8657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8657:17:0;;8635:39;;8685:154;8692:10;;8685:154;;8719:11;8729:1;8719:11;;:::i;:::-;;-1:-1:-1;8788:10:0;8796:2;8788:5;:10;:::i;:::-;8775:24;;:2;:24;:::i;:::-;8762:39;;8745:6;8752;8745:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;8816:11:0;8825:2;8816:11;;:::i;:::-;;;8685:154;;29466:798;29622:4;-1:-1:-1;;;;;29643:13:0;;9950:20;9998:8;29639:618;;29679:70;;;;;-1:-1:-1;;;;;29679:36:0;;;;;:70;;29716:10;;29728:4;;29734:7;;29743:5;;29679:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29679:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29675:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29919:6;:13;29936:1;29919:18;29915:272;;29962:60;;-1:-1:-1;;;29962:60:0;;20660:2:1;29962:60:0;;;20642:21:1;20699:2;20679:18;;;20672:30;20738:34;20718:18;;;20711:62;20809:20;20789:18;;;20782:48;20847:19;;29962:60:0;20458:414:1;29915:272:0;30137:6;30131:13;30122:6;30118:2;30114:15;30107:38;29675:527;29800:51;;29810:41;29800:51;;-1:-1:-1;29793:58:0;;29639:618;-1:-1:-1;30241:4:0;29466:798;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:258::-;710:1;720:113;734:6;731:1;728:13;720:113;;;810:11;;;804:18;791:11;;;784:39;756:2;749:10;720:113;;;851:6;848:1;845:13;842:48;;;-1:-1:-1;;886:1:1;868:16;;861:27;638:258::o;901:328::-;954:3;992:5;986:12;1019:6;1014:3;1007:19;1035:63;1091:6;1084:4;1079:3;1075:14;1068:4;1061:5;1057:16;1035:63;:::i;:::-;1143:2;1131:15;1148:66;1127:88;1118:98;;;;1218:4;1114:109;;901:328;-1:-1:-1;;901:328:1:o;1234:231::-;1383:2;1372:9;1365:21;1346:4;1403:56;1455:2;1444:9;1440:18;1432:6;1403:56;:::i;1470:180::-;1529:6;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;-1:-1:-1;1621:23:1;;1470:180;-1:-1:-1;1470:180:1:o;1886:154::-;-1:-1:-1;;;;;1965:5:1;1961:54;1954:5;1951:65;1941:93;;2030:1;2027;2020:12;2045:315;2113:6;2121;2174:2;2162:9;2153:7;2149:23;2145:32;2142:52;;;2190:1;2187;2180:12;2142:52;2229:9;2216:23;2248:31;2273:5;2248:31;:::i;:::-;2298:5;2350:2;2335:18;;;;2322:32;;-1:-1:-1;;;2045:315:1:o;2558:456::-;2635:6;2643;2651;2704:2;2692:9;2683:7;2679:23;2675:32;2672:52;;;2720:1;2717;2710:12;2672:52;2759:9;2746:23;2778:31;2803:5;2778:31;:::i;:::-;2828:5;-1:-1:-1;2885:2:1;2870:18;;2857:32;2898:33;2857:32;2898:33;:::i;:::-;2558:456;;2950:7;;-1:-1:-1;;;3004:2:1;2989:18;;;;2976:32;;2558:456::o;3019:248::-;3087:6;3095;3148:2;3136:9;3127:7;3123:23;3119:32;3116:52;;;3164:1;3161;3154:12;3116:52;-1:-1:-1;;3187:23:1;;;3257:2;3242:18;;;3229:32;;-1:-1:-1;3019:248:1:o;3836:184::-;3888:77;3885:1;3878:88;3985:4;3982:1;3975:15;4009:4;4006:1;3999:15;4025:334;4096:2;4090:9;4152:2;4142:13;;4157:66;4138:86;4126:99;;4255:18;4240:34;;4276:22;;;4237:62;4234:88;;;4302:18;;:::i;:::-;4338:2;4331:22;4025:334;;-1:-1:-1;4025:334:1:o;4364:466::-;4429:5;4463:18;4455:6;4452:30;4449:56;;;4485:18;;:::i;:::-;4523:116;4633:4;4564:66;4559:2;4551:6;4547:15;4543:88;4539:99;4523:116;:::i;:::-;4514:125;;4662:6;4655:5;4648:21;4702:3;4693:6;4688:3;4684:16;4681:25;4678:45;;;4719:1;4716;4709:12;4678:45;4768:6;4763:3;4756:4;4749:5;4745:16;4732:43;4822:1;4815:4;4806:6;4799:5;4795:18;4791:29;4784:40;4364:466;;;;;:::o;4835:451::-;4904:6;4957:2;4945:9;4936:7;4932:23;4928:32;4925:52;;;4973:1;4970;4963:12;4925:52;5013:9;5000:23;5046:18;5038:6;5035:30;5032:50;;;5078:1;5075;5068:12;5032:50;5101:22;;5154:4;5146:13;;5142:27;-1:-1:-1;5132:55:1;;5183:1;5180;5173:12;5132:55;5206:74;5272:7;5267:2;5254:16;5249:2;5245;5241:11;5206:74;:::i;5291:247::-;5350:6;5403:2;5391:9;5382:7;5378:23;5374:32;5371:52;;;5419:1;5416;5409:12;5371:52;5458:9;5445:23;5477:31;5502:5;5477:31;:::i;5725:632::-;5896:2;5948:21;;;6018:13;;5921:18;;;6040:22;;;5867:4;;5896:2;6119:15;;;;6093:2;6078:18;;;5867:4;6162:169;6176:6;6173:1;6170:13;6162:169;;;6237:13;;6225:26;;6306:15;;;;6271:12;;;;6198:1;6191:9;6162:169;;;-1:-1:-1;6348:3:1;;5725:632;-1:-1:-1;;;;;;5725:632:1:o;6362:183::-;6422:4;6455:18;6447:6;6444:30;6441:56;;;6477:18;;:::i;:::-;-1:-1:-1;6522:1:1;6518:14;6534:4;6514:25;;6362:183::o;6550:737::-;6604:5;6657:3;6650:4;6642:6;6638:17;6634:27;6624:55;;6675:1;6672;6665:12;6624:55;6711:6;6698:20;6737:4;6761:60;6777:43;6817:2;6777:43;:::i;:::-;6761:60;:::i;:::-;6855:15;;;6941:1;6937:10;;;;6925:23;;6921:32;;;6886:12;;;;6965:15;;;6962:35;;;6993:1;6990;6983:12;6962:35;7029:2;7021:6;7017:15;7041:217;7057:6;7052:3;7049:15;7041:217;;;7137:3;7124:17;7154:31;7179:5;7154:31;:::i;:::-;7198:18;;7236:12;;;;7074;;7041:217;;;-1:-1:-1;7276:5:1;6550:737;-1:-1:-1;;;;;;6550:737:1:o;7292:1140::-;7410:6;7418;7471:2;7459:9;7450:7;7446:23;7442:32;7439:52;;;7487:1;7484;7477:12;7439:52;7527:9;7514:23;7556:18;7597:2;7589:6;7586:14;7583:34;;;7613:1;7610;7603:12;7583:34;7651:6;7640:9;7636:22;7626:32;;7696:7;7689:4;7685:2;7681:13;7677:27;7667:55;;7718:1;7715;7708:12;7667:55;7754:2;7741:16;7776:4;7800:60;7816:43;7856:2;7816:43;:::i;7800:60::-;7894:15;;;7976:1;7972:10;;;;7964:19;;7960:28;;;7925:12;;;;8000:19;;;7997:39;;;8032:1;8029;8022:12;7997:39;8056:11;;;;8076:142;8092:6;8087:3;8084:15;8076:142;;;8158:17;;8146:30;;8109:12;;;;8196;;;;8076:142;;;8237:5;-1:-1:-1;;8280:18:1;;8267:32;;-1:-1:-1;;8311:16:1;;;8308:36;;;8340:1;8337;8330:12;8308:36;;8363:63;8418:7;8407:8;8396:9;8392:24;8363:63;:::i;:::-;8353:73;;;7292:1140;;;;;:::o;8437:118::-;8523:5;8516:13;8509:21;8502:5;8499:32;8489:60;;8545:1;8542;8535:12;8560:382;8625:6;8633;8686:2;8674:9;8665:7;8661:23;8657:32;8654:52;;;8702:1;8699;8692:12;8654:52;8741:9;8728:23;8760:31;8785:5;8760:31;:::i;:::-;8810:5;-1:-1:-1;8867:2:1;8852:18;;8839:32;8880:30;8839:32;8880:30;:::i;:::-;8929:7;8919:17;;;8560:382;;;;;:::o;8947:795::-;9042:6;9050;9058;9066;9119:3;9107:9;9098:7;9094:23;9090:33;9087:53;;;9136:1;9133;9126:12;9087:53;9175:9;9162:23;9194:31;9219:5;9194:31;:::i;:::-;9244:5;-1:-1:-1;9301:2:1;9286:18;;9273:32;9314:33;9273:32;9314:33;:::i;:::-;9366:7;-1:-1:-1;9420:2:1;9405:18;;9392:32;;-1:-1:-1;9475:2:1;9460:18;;9447:32;9502:18;9491:30;;9488:50;;;9534:1;9531;9524:12;9488:50;9557:22;;9610:4;9602:13;;9598:27;-1:-1:-1;9588:55:1;;9639:1;9636;9629:12;9588:55;9662:74;9728:7;9723:2;9710:16;9705:2;9701;9697:11;9662:74;:::i;:::-;9652:84;;;8947:795;;;;;;;:::o;9747:388::-;9815:6;9823;9876:2;9864:9;9855:7;9851:23;9847:32;9844:52;;;9892:1;9889;9882:12;9844:52;9931:9;9918:23;9950:31;9975:5;9950:31;:::i;:::-;10000:5;-1:-1:-1;10057:2:1;10042:18;;10029:32;10070:33;10029:32;10070:33;:::i;10885:245::-;10952:6;11005:2;10993:9;10984:7;10980:23;10976:32;10973:52;;;11021:1;11018;11011:12;10973:52;11053:9;11047:16;11072:28;11094:5;11072:28;:::i;12788:184::-;12840:77;12837:1;12830:88;12937:4;12934:1;12927:15;12961:4;12958:1;12951:15;12977:228;13017:7;13143:1;13075:66;13071:74;13068:1;13065:81;13060:1;13053:9;13046:17;13042:105;13039:131;;;13150:18;;:::i;:::-;-1:-1:-1;13190:9:1;;12977:228::o;13210:184::-;13262:77;13259:1;13252:88;13359:4;13356:1;13349:15;13383:4;13380:1;13373:15;13399:120;13439:1;13465;13455:35;;13470:18;;:::i;:::-;-1:-1:-1;13504:9:1;;13399:120::o;14295:437::-;14374:1;14370:12;;;;14417;;;14438:61;;14492:4;14484:6;14480:17;14470:27;;14438:61;14545:2;14537:6;14534:14;14514:18;14511:38;14508:218;;14582:77;14579:1;14572:88;14683:4;14680:1;14673:15;14711:4;14708:1;14701:15;14508:218;;14295:437;;;:::o;15148:224::-;15187:3;15215:6;15248:2;15245:1;15241:10;15278:2;15275:1;15271:10;15309:3;15305:2;15301:12;15296:3;15293:21;15290:47;;;15317:18;;:::i;:::-;15353:13;;15148:224;-1:-1:-1;;;;15148:224:1:o;15377:184::-;15429:77;15426:1;15419:88;15526:4;15523:1;15516:15;15550:4;15547:1;15540:15;16459:185;16501:3;16539:5;16533:12;16554:52;16599:6;16594:3;16587:4;16580:5;16576:16;16554:52;:::i;:::-;16622:16;;;;;16459:185;-1:-1:-1;;16459:185:1:o;16767:1416::-;17044:3;17073:1;17106:6;17100:13;17136:3;17158:1;17186:9;17182:2;17178:18;17168:28;;17246:2;17235:9;17231:18;17268;17258:61;;17312:4;17304:6;17300:17;17290:27;;17258:61;17338:2;17386;17378:6;17375:14;17355:18;17352:38;17349:222;;17425:77;17420:3;17413:90;17526:4;17523:1;17516:15;17556:4;17551:3;17544:17;17349:222;17587:18;17614:162;;;;17790:1;17785:320;;;;17580:525;;17614:162;17662:66;17651:9;17647:82;17642:3;17635:95;17759:6;17754:3;17750:16;17743:23;;17614:162;;17785:320;16406:1;16399:14;;;16443:4;16430:18;;17880:1;17894:165;17908:6;17905:1;17902:13;17894:165;;;17986:14;;17973:11;;;17966:35;18029:16;;;;17923:10;;17894:165;;;17898:3;;18088:6;18083:3;18079:16;18072:23;;17580:525;;;;;;;18121:56;18146:30;18172:3;18164:6;18146:30;:::i;:::-;16721:7;16709:20;;16754:1;16745:11;;16649:113;18121:56;18114:63;16767:1416;-1:-1:-1;;;;;16767:1416:1:o;18188:280::-;18287:6;18340:2;18328:9;18319:7;18315:23;18311:32;18308:52;;;18356:1;18353;18346:12;18308:52;18388:9;18382:16;18407:31;18432:5;18407:31;:::i;20877:195::-;20916:3;20947:66;20940:5;20937:77;20934:103;;21017:18;;:::i;:::-;-1:-1:-1;21064:1:1;21053:13;;20877:195::o;21077:125::-;21117:4;21145:1;21142;21139:8;21136:34;;;21150:18;;:::i;:::-;-1:-1:-1;21187:9:1;;21077:125::o;21207:112::-;21239:1;21265;21255:35;;21270:18;;:::i;:::-;-1:-1:-1;21304:9:1;;21207:112::o;21324:128::-;21364:3;21395:1;21391:6;21388:1;21385:13;21382:39;;;21401:18;;:::i;:::-;-1:-1:-1;21437:9:1;;21324:128::o;21457:523::-;21651:4;-1:-1:-1;;;;;21761:2:1;21753:6;21749:15;21738:9;21731:34;21813:2;21805:6;21801:15;21796:2;21785:9;21781:18;21774:43;;21853:6;21848:2;21837:9;21833:18;21826:34;21896:3;21891:2;21880:9;21876:18;21869:31;21917:57;21969:3;21958:9;21954:19;21946:6;21917:57;:::i;:::-;21909:65;21457:523;-1:-1:-1;;;;;;21457:523:1:o;21985:249::-;22054:6;22107:2;22095:9;22086:7;22082:23;22078:32;22075:52;;;22123:1;22120;22113:12;22075:52;22155:9;22149:16;22174:30;22198:5;22174:30;:::i

Swarm Source

ipfs://9836e7437ec8dc2b421e59c6be69baf47ff7ed506c66c1f123ea781256a90584
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.