ETH Price: $3,253.66 (+2.46%)
Gas: 2 Gwei

PUMA Nitropass (NPASS)
 

Overview

TokenID

3371

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PUMA’s first NFT project will consist of 4,000 NFTs split into two, ████████ and ████████. Both designs were developed with the metaverse in mind. Designed first in 3D and tested in augmented reality before physical samples were ever created. The physical products are a first of their kind experiment with new materials, technology and design. Additionally, holders of the Nitro Collection will receive exclusive access to a first of its kind metaverse experience in September.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PumaNitroPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


// File contracts/ERC721A.sol
// Creator: Chiru Labs

pragma solidity ^0.8.4;


error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }


    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File contracts/mocks/StartTokenIdHelper.sol
// Creators: Chiru Labs

pragma solidity ^0.8.4;

/**
 * This Helper is used to return a dynmamic value in the overriden _startTokenId() function.
 * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId`
 * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks.
 */
contract StartTokenIdHelper {
    uint256 public immutable startTokenId;

    constructor(uint256 startTokenId_) {
        startTokenId = startTokenId_;
    }
}


// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

/**
PumaNitropass Smart Contract Development by @WumboLabs
**/

pragma solidity >=0.8.0 <0.9.0;

interface PumaNitroToken {
    function balanceOf(address account)
        external
        view
        returns (uint256);

    function burnNitroTokenForNitroPass(uint256) external;

    function ownerOf(uint256 tokenId) external view returns (address);
}

interface PumaPhysical {
    function mint(address, uint256) external;
}

interface PumaForever {
    function mint(address, uint256) external;
}

contract PumaNitroPass is ERC721A, Ownable {
    using Strings for uint256;
    
    /// Contract interactions
    address private ForeverContract;
    address private PhysicalContract;
    address public TokenContract;

    /// Supply
    uint256 public constant MAX_SUPPLY = 4000;
    uint256 public PRICE = 0.2 ether;
    uint256 public MAX_PUBLIC_MINT = 1; // only 1 mint during pre or pub sale

    /// Status
    enum Status {
        NOT_LIVE,
        TOKEN_MINT,
        ONE_HOUR_MINT,
        PUBLIC,
        BURN_PASS,
        ENDED
    }

    /// Minting Variables
    string public baseURI = "https://puma-blackbox-prod.herokuapp.com/api/pass/";
    Status public state;

    mapping(address => uint256 ) public tokenAmountBurnedByAddress;

    constructor() ERC721A("PUMA Nitropass", "NPASS") {
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    function ownerMint(uint256 _amount) external onlyOwner {
        require(state == Status.NOT_LIVE || state == Status.TOKEN_MINT, "PUMA Nitropass: Status must be not live or during 48 hour window");
        require(totalSupply() + _amount <= MAX_SUPPLY, "PUMA Nitropass: Mint amount exceeds supply");
        _safeMint(msg.sender, _amount);
    }

    function getRemainingSupply() external view returns (uint256) {
        return MAX_SUPPLY - totalSupply();
    }

    function getTokenAmountBurnedByAddress(address _address) public view returns (uint256) {
        require(_exists(tokenAmountBurnedByAddress[_address]), "PUMA Nitropass: Address has not burned any Nitro Tokens");
        return tokenAmountBurnedByAddress[_address];
    }

    function setForeverContract(address _ForeverContract) external onlyOwner {
        ForeverContract = _ForeverContract;
    }

    function setPhysicalContract(address _PhysicalContract) external onlyOwner {
        PhysicalContract = _PhysicalContract;
    }

    function setTokenContract(address _TokenContract) external onlyOwner {
        TokenContract = _TokenContract;
    }

    /// Burn all unused Nitropasses at a later date
    function burnAllNitroPasses() external onlyOwner {
        require(state == Status.ENDED, "PUMA Nitropass: Still Live");
        for (uint256 i; i<MAX_SUPPLY; i++) {
            if(_exists(i)) {
                _burn(i);
            }
        }
    }

    /// Burn Nitropass on minting Forever and Physical
    function burnNitroPassAndMintForeverPhysical(uint256[] memory NitroPassIds) external {
        require(state == Status.BURN_PASS, "PUMA Nitropass: Status must be on Burn Pass");
        uint256 mintQuantity = NitroPassIds.length;
        require(balanceOf(msg.sender) >= mintQuantity, "PUMA Nitropass: Caller does not own enough Nitropass");
        require(PhysicalContract != address(0) && ForeverContract != address(0), "PUMA Nitropass: Set PhysicalContract and ForeverContract");
        uint256 burnCounter;
        for (uint256 i = 0; i < NitroPassIds.length; i++) {
            uint256 tokenId = NitroPassIds[i];
            require(msg.sender == ownerOf(tokenId), "PUMA Nitropass: Caller does not own NitroPassId");
            burnCounter++;
            _burn(tokenId);
        }
        PumaPhysical(PhysicalContract).mint(msg.sender, burnCounter);
        PumaForever(ForeverContract).mint(msg.sender, burnCounter);
    }

    function burnNitroTokenforNitroPass(uint256[] memory tokenIds) external payable {
        require(state == Status.TOKEN_MINT, "PUMA Nitropass: Token burn is not live");
        uint256 mintQuantity = tokenIds.length;
        require(PumaNitroToken(TokenContract).balanceOf(msg.sender) >= mintQuantity, "PUMA Nitropass: Caller does not own enough Nitro Tokens");
        require(TokenContract != address(0), "PUMA Nitropass: Set TokenContract");
        require(msg.value == PRICE * mintQuantity, "PUMA Nitropass: Not enough payment to mint Nitropass");      
        uint256 mintCounter;  
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 tokenId = tokenIds[i];
            address owner = PumaNitroToken(TokenContract).ownerOf(tokenId);
            require(msg.sender == owner, "PUMA Nitropass: Message sender is not owner of tokenid");
            tokenAmountBurnedByAddress[owner]++;
            mintCounter++;
            PumaNitroToken(TokenContract).burnNitroTokenForNitroPass(tokenId);
        }
        _safeMint(msg.sender, mintCounter);
    }

    function oneHourMint(uint256 _mintAmount) external payable {
        require(state == Status.ONE_HOUR_MINT, "PUMA Nitropass: One hour window not open");
        require(totalSupply() + _mintAmount <= MAX_SUPPLY, "PUMA Nitropass: Mint amount exceeds supply");
        require(msg.value == PRICE * _mintAmount, "PUMA Nitropass: Not enough payment to mint Nitropass");     
        require(_numberMinted(msg.sender) + _mintAmount <= tokenAmountBurnedByAddress[msg.sender] * 2, "PUMA Nitropass: Not enough tokens burned in 48 hours window");
        require(_mintAmount <= tokenAmountBurnedByAddress[msg.sender], "PUMA Nitropass: Not enough tokens burned to mint that amount");
        _safeMint(msg.sender, _mintAmount);
    }

    function publicMint() external payable {
        require(state == Status.PUBLIC, "PUMA Nitropass: Public not live");
        require(msg.sender == tx.origin, "PUMA Nitropass: Contract Interaction Not Allowed");
        require(totalSupply() + 1 <= MAX_SUPPLY, "PUMA Nitropass: Mint Supply Exceeded");
        require(msg.value == PRICE, "PUMA Nitropass: Not enough payment to mint Nitropass");
        require(_numberMinted(msg.sender) < MAX_PUBLIC_MINT, "PUMA Nitropass: Exceeds Max Per Wallet");
        _safeMint(msg.sender, 1);
    }

    function setState(Status _state) external onlyOwner {
        state = _state;
    }
    
    function setURI(string calldata _newURI) external onlyOwner {
        baseURI = _newURI;
    }

    function withdrawMoney() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Withdraw failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenContract","outputs":[{"internalType":"address","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":[],"name":"burnAllNitroPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"NitroPassIds","type":"uint256[]"}],"name":"burnNitroPassAndMintForeverPhysical","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnNitroTokenforNitroPass","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getTokenAmountBurnedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"oneHourMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ForeverContract","type":"address"}],"name":"setForeverContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_PhysicalContract","type":"address"}],"name":"setPhysicalContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PumaNitroPass.Status","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_TokenContract","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum PumaNitroPass.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenAmountBurnedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6702c68af0bb140000600c556001600d5560e0604052603260808181529062002e6360a03980516200003a91600e916020909101906200011d565b503480156200004857600080fd5b50604080518082018252600e81526d50554d41204e6974726f7061737360901b6020808301918252835180850190945260058452644e5041535360d81b9084015281519192916200009c916002916200011d565b508051620000b29060039060208401906200011d565b5050600160005550620000c533620000cb565b62000200565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012b90620001c3565b90600052602060002090601f0160209004810192826200014f57600085556200019a565b82601f106200016a57805160ff19168380011785556200019a565b828001600101855582156200019a579182015b828111156200019a5782518255916020019190600101906200017d565b50620001a8929150620001ac565b5090565b5b80821115620001a85760008155600101620001ad565b600181811c90821680620001d857607f821691505b60208210811415620001fa57634e487b7160e01b600052602260045260246000fd5b50919050565b612c5380620002106000396000f3fe6080604052600436106102255760003560e01c806370a0823111610123578063ac446002116100ab578063c87b56dd1161006f578063c87b56dd14610609578063e4b7fb7314610629578063e985e9c51461063e578063f19e75d414610687578063f2fde38b146106a757600080fd5b8063ac44600214610578578063b88d4fde1461058d578063bbcd5bbe146105ad578063be817b63146105cd578063c19d93fb146105e257600080fd5b80638da5cb5b116100f25780638da5cb5b146104e557806395d89b41146105035780639688738b146105185780639dbc3f7414610538578063a22cb4651461055857600080fd5b806370a0823114610487578063715018a6146104a75780638d372669146104bc5780638d859f3e146104cf57600080fd5b806326092b83116101b157806356de96db1161017557806356de96db146103fc5780636352211e1461041c578063652737111461043c57806365f130971461045c5780636c0360eb1461047257600080fd5b806326092b831461037157806332cb6b0c1461037957806342842e0e1461038f5780634ae44816146103af5780634cfd80a8146103dc57600080fd5b8063081812fc116101f8578063081812fc146102b6578063095ea7b3146102ee57806318160ddd1461030e578063188cb3241461033157806323b872dd1461035157600080fd5b806301ffc9a71461022a57806302fe53051461025f57806306ad20091461028157806306fdde0314610294575b600080fd5b34801561023657600080fd5b5061024a610245366004612739565b6106c7565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a366004612794565b610719565b005b61027f61028f36600461268d565b610732565b3480156102a057600080fd5b506102a9610b06565b604051610256919061298b565b3480156102c257600080fd5b506102d66102d1366004612805565b610b98565b6040516001600160a01b039091168152602001610256565b3480156102fa57600080fd5b5061027f610309366004612661565b610bdc565b34801561031a57600080fd5b50610323610c65565b604051908152602001610256565b34801561033d57600080fd5b5061027f61034c36600461268d565b610c73565b34801561035d57600080fd5b5061027f61036c36600461252a565b610f9d565b61027f610fa8565b34801561038557600080fd5b50610323610fa081565b34801561039b57600080fd5b5061027f6103aa36600461252a565b61117c565b3480156103bb57600080fd5b506103236103ca3660046124b0565b60106020526000908152604090205481565b3480156103e857600080fd5b5061027f6103f73660046124b0565b611197565b34801561040857600080fd5b5061027f610417366004612773565b6111c1565b34801561042857600080fd5b506102d6610437366004612805565b6111f0565b34801561044857600080fd5b506103236104573660046124b0565b611202565b34801561046857600080fd5b50610323600d5481565b34801561047e57600080fd5b506102a96112b2565b34801561049357600080fd5b506103236104a23660046124b0565b611340565b3480156104b357600080fd5b5061027f61138e565b61027f6104ca366004612805565b6113a0565b3480156104db57600080fd5b50610323600c5481565b3480156104f157600080fd5b506008546001600160a01b03166102d6565b34801561050f57600080fd5b506102a96115ac565b34801561052457600080fd5b50600b546102d6906001600160a01b031681565b34801561054457600080fd5b5061027f6105533660046124b0565b6115bb565b34801561056457600080fd5b5061027f61057336600461262e565b6115e5565b34801561058457600080fd5b5061027f61167b565b34801561059957600080fd5b5061027f6105a836600461256b565b61170e565b3480156105b957600080fd5b5061027f6105c83660046124b0565b61175f565b3480156105d957600080fd5b5061027f611789565b3480156105ee57600080fd5b50600f546105fc9060ff1681565b6040516102569190612963565b34801561061557600080fd5b506102a9610624366004612805565b61182d565b34801561063557600080fd5b506103236118b0565b34801561064a57600080fd5b5061024a6106593660046124f1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069357600080fd5b5061027f6106a2366004612805565b6118cb565b3480156106b357600080fd5b5061027f6106c23660046124b0565b6119b6565b60006001600160e01b031982166380ac58cd60e01b14806106f857506001600160e01b03198216635b5e139f60e01b145b8061071357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610721611a2c565b61072d600e8383612417565b505050565b6001600f5460ff16600581111561074b5761074b612b90565b146107ac5760405162461bcd60e51b815260206004820152602660248201527f50554d41204e6974726f706173733a20546f6b656e206275726e206973206e6f60448201526574206c69766560d01b60648201526084015b60405180910390fd5b8051600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061281e565b101561089d5760405162461bcd60e51b815260206004820152603760248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f742060448201527f6f776e20656e6f756768204e6974726f20546f6b656e7300000000000000000060648201526084016107a3565b600b546001600160a01b03166108ff5760405162461bcd60e51b815260206004820152602160248201527f50554d41204e6974726f706173733a2053657420546f6b656e436f6e747261636044820152601d60fa1b60648201526084016107a3565b80600c5461090d9190612a98565b341461092b5760405162461bcd60e51b81526004016107a3906129e8565b6000805b8351811015610afb57600084828151811061094c5761094c612ba6565b6020908102919091010151600b546040516331a9108f60e11b8152600481018390529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d991906124d4565b9050336001600160a01b03821614610a525760405162461bcd60e51b815260206004820152603660248201527f50554d41204e6974726f706173733a204d6573736167652073656e64657220696044820152751cc81b9bdd081bdddb995c881bd9881d1bdad95b9a5960521b60648201526084016107a3565b6001600160a01b0381166000908152601060205260408120805491610a7683612b35565b91905055508380610a8690612b35565b600b5460405163038f3a2b60e61b8152600481018690529196506001600160a01b0316915063e3ce8ac090602401600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b5050505050508080610af390612b35565b91505061092f565b5061072d3382611a86565b606060028054610b1590612afa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4190612afa565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b5050505050905090565b6000610ba382611aa4565b610bc0576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610be7826111f0565b9050806001600160a01b0316836001600160a01b03161415610c1c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c3c5750610c3a8133610659565b155b15610c5a576040516367d9dca160e11b815260040160405180910390fd5b61072d838383611add565b600154600054036000190190565b6004600f5460ff166005811115610c8c57610c8c612b90565b14610ced5760405162461bcd60e51b815260206004820152602b60248201527f50554d41204e6974726f706173733a20537461747573206d757374206265206f60448201526a6e204275726e205061737360a81b60648201526084016107a3565b805180610cf933611340565b1015610d645760405162461bcd60e51b815260206004820152603460248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f74206044820152736f776e20656e6f756768204e6974726f7061737360601b60648201526084016107a3565b600a546001600160a01b031615801590610d8857506009546001600160a01b031615155b610dfa5760405162461bcd60e51b815260206004820152603860248201527f50554d41204e6974726f706173733a2053657420506879736963616c436f6e7460448201527f7261637420616e6420466f7265766572436f6e7472616374000000000000000060648201526084016107a3565b6000805b8351811015610ecf576000848281518110610e1b57610e1b612ba6565b60200260200101519050610e2e816111f0565b6001600160a01b0316336001600160a01b031614610ea65760405162461bcd60e51b815260206004820152602f60248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f742060448201526e1bdddb88139a5d1c9bd4185cdcd259608a1b60648201526084016107a3565b82610eb081612b35565b935050610ebc81611b39565b5080610ec781612b35565b915050610dfe565b50600a546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b50506009546040516340c10f1960e01b8152336004820152602481018590526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015610f8057600080fd5b505af1158015610f94573d6000803e3d6000fd5b50505050505050565b61072d838383611ca3565b6003600f5460ff166005811115610fc157610fc1612b90565b1461100e5760405162461bcd60e51b815260206004820152601f60248201527f50554d41204e6974726f706173733a205075626c6963206e6f74206c6976650060448201526064016107a3565b3332146110765760405162461bcd60e51b815260206004820152603060248201527f50554d41204e6974726f706173733a20436f6e747261637420496e746572616360448201526f1d1a5bdb88139bdd08105b1b1bddd95960821b60648201526084016107a3565b610fa0611081610c65565b61108c906001612a6c565b11156110e65760405162461bcd60e51b8152602060048201526024808201527f50554d41204e6974726f706173733a204d696e7420537570706c7920457863656044820152631959195960e21b60648201526084016107a3565b600c5434146111075760405162461bcd60e51b81526004016107a3906129e8565b600d5461111333611ea5565b1061116f5760405162461bcd60e51b815260206004820152602660248201527f50554d41204e6974726f706173733a2045786365656473204d6178205065722060448201526515d85b1b195d60d21b60648201526084016107a3565b61117a336001611a86565b565b61072d8383836040518060200160405280600081525061170e565b61119f611a2c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6111c9611a2c565b600f805482919060ff191660018360058111156111e8576111e8612b90565b021790555050565b60006111fb82611efa565b5192915050565b6001600160a01b03811660009081526010602052604081205461122490611aa4565b6112965760405162461bcd60e51b815260206004820152603760248201527f50554d41204e6974726f706173733a204164647265737320686173206e6f742060448201527f6275726e656420616e79204e6974726f20546f6b656e7300000000000000000060648201526084016107a3565b506001600160a01b031660009081526010602052604090205490565b600e80546112bf90612afa565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb90612afa565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b505050505081565b60006001600160a01b038216611369576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611396611a2c565b61117a6000612021565b6002600f5460ff1660058111156113b9576113b9612b90565b146114175760405162461bcd60e51b815260206004820152602860248201527f50554d41204e6974726f706173733a204f6e6520686f75722077696e646f77206044820152673737ba1037b832b760c11b60648201526084016107a3565b610fa081611423610c65565b61142d9190612a6c565b111561144b5760405162461bcd60e51b81526004016107a39061299e565b80600c546114599190612a98565b34146114775760405162461bcd60e51b81526004016107a3906129e8565b33600090815260106020526040902054611492906002612a98565b8161149c33611ea5565b6114a69190612a6c565b111561151a5760405162461bcd60e51b815260206004820152603b60248201527f50554d41204e6974726f706173733a204e6f7420656e6f75676820746f6b656e60448201527f73206275726e656420696e20343820686f7572732077696e646f77000000000060648201526084016107a3565b3360009081526010602052604090205481111561159f5760405162461bcd60e51b815260206004820152603c60248201527f50554d41204e6974726f706173733a204e6f7420656e6f75676820746f6b656e60448201527f73206275726e656420746f206d696e74207468617420616d6f756e740000000060648201526084016107a3565b6115a93382611a86565b50565b606060038054610b1590612afa565b6115c3611a2c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821633141561160f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611683611a2c565b604051600090339047908381818185875af1925050503d80600081146116c5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ca565b606091505b50509050806115a95760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b60448201526064016107a3565b611719848484611ca3565b6001600160a01b0383163b1515801561173b575061173984848484612073565b155b15611759576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b611767611a2c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611791611a2c565b6005600f5460ff1660058111156117aa576117aa612b90565b146117f75760405162461bcd60e51b815260206004820152601a60248201527f50554d41204e6974726f706173733a205374696c6c204c69766500000000000060448201526064016107a3565b60005b610fa08110156115a95761180d81611aa4565b1561181b5761181b81611b39565b8061182581612b35565b9150506117fa565b606061183882611aa4565b61185557604051630a14c4b560e41b815260040160405180910390fd5b600e805461186290612afa565b1515905061187f5760405180602001604052806000815250610713565b600e61188a8361216b565b60405160200161189b92919061287f565b60405160208183030381529060405292915050565b60006118ba610c65565b6118c690610fa0612ab7565b905090565b6118d3611a2c565b6000600f5460ff1660058111156118ec576118ec612b90565b148061190e57506001600f5460ff16600581111561190c5761190c612b90565b145b611982576040805162461bcd60e51b81526020600482015260248101919091527f50554d41204e6974726f706173733a20537461747573206d757374206265206e60448201527f6f74206c697665206f7220647572696e6720343820686f75722077696e646f7760648201526084016107a3565b610fa08161198e610c65565b6119989190612a6c565b111561159f5760405162461bcd60e51b81526004016107a39061299e565b6119be611a2c565b6001600160a01b038116611a235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a3565b6115a981612021565b6008546001600160a01b0316331461117a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a3565b611aa0828260405180602001604052806000815250612268565b5050565b600081600111158015611ab8575060005482105b8015610713575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b4482611efa565b9050611b566000838360000151611add565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116611c6d57600054811015611c6d57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020612bfe833981519152908390a450506001805481019055565b6000611cae82611efa565b80519091506000906001600160a01b0316336001600160a01b03161480611cdc57508151611cdc9033610659565b80611cf7575033611cec84610b98565b6001600160a01b0316145b905080611d1757604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611d4c5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611d7357604051633a954ecd60e21b815260040160405180910390fd5b611d836000848460000151611add565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611e6d57600054811015611e6d57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020612bfe83398151915260405160405180910390a45b5050505050565b60006001600160a01b038216611ece576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b60408051606081018252600080825260208201819052918101919091528180600111158015611f2a575060005481105b1561200857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120065780516001600160a01b031615611f9d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612001579392505050565b611f9d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120a8903390899088908890600401612926565b602060405180830381600087803b1580156120c257600080fd5b505af19250505080156120f2575060408051601f3d908101601f191682019092526120ef91810190612756565b60015b61214d573d808015612120576040519150601f19603f3d011682016040523d82523d6000602084013e612125565b606091505b508051612145576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161218f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121b957806121a381612b35565b91506121b29050600a83612a84565b9150612193565b6000816001600160401b038111156121d3576121d3612bbc565b6040519080825280601f01601f1916602001820160405280156121fd576020820181803683370190505b5090505b841561216357612212600183612ab7565b915061221f600a86612b50565b61222a906030612a6c565b60f81b81838151811061223f5761223f612ba6565b60200101906001600160f81b031916908160001a905350612261600a86612a84565b9450612201565b61072d83838360016000546001600160a01b03851661229957604051622e076360e81b815260040160405180910390fd5b836122b75760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561236357506001600160a01b0387163b15155b156123da575b60405182906001600160a01b03891690600090600080516020612bfe833981519152908290a46123a26000888480600101955088612073565b6123bf576040516368d2bf6b60e11b815260040160405180910390fd5b808214156123695782600054146123d557600080fd5b61240e565b5b6040516001830192906001600160a01b03891690600090600080516020612bfe833981519152908290a4808214156123db575b50600055611e9e565b82805461242390612afa565b90600052602060002090601f016020900481019282612445576000855561248b565b82601f1061245e5782800160ff1982351617855561248b565b8280016001018555821561248b579182015b8281111561248b578235825591602001919060010190612470565b5061249792915061249b565b5090565b5b80821115612497576000815560010161249c565b6000602082840312156124c257600080fd5b81356124cd81612bd2565b9392505050565b6000602082840312156124e657600080fd5b81516124cd81612bd2565b6000806040838503121561250457600080fd5b823561250f81612bd2565b9150602083013561251f81612bd2565b809150509250929050565b60008060006060848603121561253f57600080fd5b833561254a81612bd2565b9250602084013561255a81612bd2565b929592945050506040919091013590565b6000806000806080858703121561258157600080fd5b843561258c81612bd2565b935060208581013561259d81612bd2565b93506040860135925060608601356001600160401b03808211156125c057600080fd5b818801915088601f8301126125d457600080fd5b8135818111156125e6576125e6612bbc565b6125f8601f8201601f19168501612a3c565b9150808252898482850101111561260e57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561264157600080fd5b823561264c81612bd2565b91506020830135801515811461251f57600080fd5b6000806040838503121561267457600080fd5b823561267f81612bd2565b946020939093013593505050565b600060208083850312156126a057600080fd5b82356001600160401b03808211156126b757600080fd5b818501915085601f8301126126cb57600080fd5b8135818111156126dd576126dd612bbc565b8060051b91506126ee848301612a3c565b8181528481019084860184860187018a101561270957600080fd5b600095505b8386101561272c57803583526001959095019491860191860161270e565b5098975050505050505050565b60006020828403121561274b57600080fd5b81356124cd81612be7565b60006020828403121561276857600080fd5b81516124cd81612be7565b60006020828403121561278557600080fd5b8135600681106124cd57600080fd5b600080602083850312156127a757600080fd5b82356001600160401b03808211156127be57600080fd5b818501915085601f8301126127d257600080fd5b8135818111156127e157600080fd5b8660208285010111156127f357600080fd5b60209290920196919550909350505050565b60006020828403121561281757600080fd5b5035919050565b60006020828403121561283057600080fd5b5051919050565b6000815180845261284f816020860160208601612ace565b601f01601f19169290920160200192915050565b60008151612875818560208601612ace565b9290920192915050565b600080845481600182811c91508083168061289b57607f831692505b60208084108214156128bb57634e487b7160e01b86526022600452602486fd5b8180156128cf57600181146128e05761290d565b60ff1986168952848901965061290d565b60008b81526020902060005b868110156129055781548b8201529085019083016128ec565b505084890196505b50505050505061291d8185612863565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061295990830184612837565b9695505050505050565b602081016006831061298557634e487b7160e01b600052602160045260246000fd5b91905290565b6020815260006124cd6020830184612837565b6020808252602a908201527f50554d41204e6974726f706173733a204d696e7420616d6f756e74206578636560408201526965647320737570706c7960b01b606082015260800190565b60208082526034908201527f50554d41204e6974726f706173733a204e6f7420656e6f756768207061796d656040820152736e7420746f206d696e74204e6974726f7061737360601b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612a6457612a64612bbc565b604052919050565b60008219821115612a7f57612a7f612b64565b500190565b600082612a9357612a93612b7a565b500490565b6000816000190483118215151615612ab257612ab2612b64565b500290565b600082821015612ac957612ac9612b64565b500390565b60005b83811015612ae9578181015183820152602001612ad1565b838111156117595750506000910152565b600181811c90821680612b0e57607f821691505b60208210811415612b2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b4957612b49612b64565b5060010190565b600082612b5f57612b5f612b7a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146115a957600080fd5b6001600160e01b0319811681146115a957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207894aa59f18460444e8c92876f440c85c11422b010b4f2dd4df37c7a3b201fe664736f6c6343000807003368747470733a2f2f70756d612d626c61636b626f782d70726f642e6865726f6b756170702e636f6d2f6170692f706173732f

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370a0823111610123578063ac446002116100ab578063c87b56dd1161006f578063c87b56dd14610609578063e4b7fb7314610629578063e985e9c51461063e578063f19e75d414610687578063f2fde38b146106a757600080fd5b8063ac44600214610578578063b88d4fde1461058d578063bbcd5bbe146105ad578063be817b63146105cd578063c19d93fb146105e257600080fd5b80638da5cb5b116100f25780638da5cb5b146104e557806395d89b41146105035780639688738b146105185780639dbc3f7414610538578063a22cb4651461055857600080fd5b806370a0823114610487578063715018a6146104a75780638d372669146104bc5780638d859f3e146104cf57600080fd5b806326092b83116101b157806356de96db1161017557806356de96db146103fc5780636352211e1461041c578063652737111461043c57806365f130971461045c5780636c0360eb1461047257600080fd5b806326092b831461037157806332cb6b0c1461037957806342842e0e1461038f5780634ae44816146103af5780634cfd80a8146103dc57600080fd5b8063081812fc116101f8578063081812fc146102b6578063095ea7b3146102ee57806318160ddd1461030e578063188cb3241461033157806323b872dd1461035157600080fd5b806301ffc9a71461022a57806302fe53051461025f57806306ad20091461028157806306fdde0314610294575b600080fd5b34801561023657600080fd5b5061024a610245366004612739565b6106c7565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a366004612794565b610719565b005b61027f61028f36600461268d565b610732565b3480156102a057600080fd5b506102a9610b06565b604051610256919061298b565b3480156102c257600080fd5b506102d66102d1366004612805565b610b98565b6040516001600160a01b039091168152602001610256565b3480156102fa57600080fd5b5061027f610309366004612661565b610bdc565b34801561031a57600080fd5b50610323610c65565b604051908152602001610256565b34801561033d57600080fd5b5061027f61034c36600461268d565b610c73565b34801561035d57600080fd5b5061027f61036c36600461252a565b610f9d565b61027f610fa8565b34801561038557600080fd5b50610323610fa081565b34801561039b57600080fd5b5061027f6103aa36600461252a565b61117c565b3480156103bb57600080fd5b506103236103ca3660046124b0565b60106020526000908152604090205481565b3480156103e857600080fd5b5061027f6103f73660046124b0565b611197565b34801561040857600080fd5b5061027f610417366004612773565b6111c1565b34801561042857600080fd5b506102d6610437366004612805565b6111f0565b34801561044857600080fd5b506103236104573660046124b0565b611202565b34801561046857600080fd5b50610323600d5481565b34801561047e57600080fd5b506102a96112b2565b34801561049357600080fd5b506103236104a23660046124b0565b611340565b3480156104b357600080fd5b5061027f61138e565b61027f6104ca366004612805565b6113a0565b3480156104db57600080fd5b50610323600c5481565b3480156104f157600080fd5b506008546001600160a01b03166102d6565b34801561050f57600080fd5b506102a96115ac565b34801561052457600080fd5b50600b546102d6906001600160a01b031681565b34801561054457600080fd5b5061027f6105533660046124b0565b6115bb565b34801561056457600080fd5b5061027f61057336600461262e565b6115e5565b34801561058457600080fd5b5061027f61167b565b34801561059957600080fd5b5061027f6105a836600461256b565b61170e565b3480156105b957600080fd5b5061027f6105c83660046124b0565b61175f565b3480156105d957600080fd5b5061027f611789565b3480156105ee57600080fd5b50600f546105fc9060ff1681565b6040516102569190612963565b34801561061557600080fd5b506102a9610624366004612805565b61182d565b34801561063557600080fd5b506103236118b0565b34801561064a57600080fd5b5061024a6106593660046124f1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561069357600080fd5b5061027f6106a2366004612805565b6118cb565b3480156106b357600080fd5b5061027f6106c23660046124b0565b6119b6565b60006001600160e01b031982166380ac58cd60e01b14806106f857506001600160e01b03198216635b5e139f60e01b145b8061071357506301ffc9a760e01b6001600160e01b03198316145b92915050565b610721611a2c565b61072d600e8383612417565b505050565b6001600f5460ff16600581111561074b5761074b612b90565b146107ac5760405162461bcd60e51b815260206004820152602660248201527f50554d41204e6974726f706173733a20546f6b656e206275726e206973206e6f60448201526574206c69766560d01b60648201526084015b60405180910390fd5b8051600b546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156107f157600080fd5b505afa158015610805573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610829919061281e565b101561089d5760405162461bcd60e51b815260206004820152603760248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f742060448201527f6f776e20656e6f756768204e6974726f20546f6b656e7300000000000000000060648201526084016107a3565b600b546001600160a01b03166108ff5760405162461bcd60e51b815260206004820152602160248201527f50554d41204e6974726f706173733a2053657420546f6b656e436f6e747261636044820152601d60fa1b60648201526084016107a3565b80600c5461090d9190612a98565b341461092b5760405162461bcd60e51b81526004016107a3906129e8565b6000805b8351811015610afb57600084828151811061094c5761094c612ba6565b6020908102919091010151600b546040516331a9108f60e11b8152600481018390529192506000916001600160a01b0390911690636352211e9060240160206040518083038186803b1580156109a157600080fd5b505afa1580156109b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d991906124d4565b9050336001600160a01b03821614610a525760405162461bcd60e51b815260206004820152603660248201527f50554d41204e6974726f706173733a204d6573736167652073656e64657220696044820152751cc81b9bdd081bdddb995c881bd9881d1bdad95b9a5960521b60648201526084016107a3565b6001600160a01b0381166000908152601060205260408120805491610a7683612b35565b91905055508380610a8690612b35565b600b5460405163038f3a2b60e61b8152600481018690529196506001600160a01b0316915063e3ce8ac090602401600060405180830381600087803b158015610ace57600080fd5b505af1158015610ae2573d6000803e3d6000fd5b5050505050508080610af390612b35565b91505061092f565b5061072d3382611a86565b606060028054610b1590612afa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4190612afa565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b5050505050905090565b6000610ba382611aa4565b610bc0576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610be7826111f0565b9050806001600160a01b0316836001600160a01b03161415610c1c5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610c3c5750610c3a8133610659565b155b15610c5a576040516367d9dca160e11b815260040160405180910390fd5b61072d838383611add565b600154600054036000190190565b6004600f5460ff166005811115610c8c57610c8c612b90565b14610ced5760405162461bcd60e51b815260206004820152602b60248201527f50554d41204e6974726f706173733a20537461747573206d757374206265206f60448201526a6e204275726e205061737360a81b60648201526084016107a3565b805180610cf933611340565b1015610d645760405162461bcd60e51b815260206004820152603460248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f74206044820152736f776e20656e6f756768204e6974726f7061737360601b60648201526084016107a3565b600a546001600160a01b031615801590610d8857506009546001600160a01b031615155b610dfa5760405162461bcd60e51b815260206004820152603860248201527f50554d41204e6974726f706173733a2053657420506879736963616c436f6e7460448201527f7261637420616e6420466f7265766572436f6e7472616374000000000000000060648201526084016107a3565b6000805b8351811015610ecf576000848281518110610e1b57610e1b612ba6565b60200260200101519050610e2e816111f0565b6001600160a01b0316336001600160a01b031614610ea65760405162461bcd60e51b815260206004820152602f60248201527f50554d41204e6974726f706173733a2043616c6c657220646f6573206e6f742060448201526e1bdddb88139a5d1c9bd4185cdcd259608a1b60648201526084016107a3565b82610eb081612b35565b935050610ebc81611b39565b5080610ec781612b35565b915050610dfe565b50600a546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610f1c57600080fd5b505af1158015610f30573d6000803e3d6000fd5b50506009546040516340c10f1960e01b8152336004820152602481018590526001600160a01b0390911692506340c10f199150604401600060405180830381600087803b158015610f8057600080fd5b505af1158015610f94573d6000803e3d6000fd5b50505050505050565b61072d838383611ca3565b6003600f5460ff166005811115610fc157610fc1612b90565b1461100e5760405162461bcd60e51b815260206004820152601f60248201527f50554d41204e6974726f706173733a205075626c6963206e6f74206c6976650060448201526064016107a3565b3332146110765760405162461bcd60e51b815260206004820152603060248201527f50554d41204e6974726f706173733a20436f6e747261637420496e746572616360448201526f1d1a5bdb88139bdd08105b1b1bddd95960821b60648201526084016107a3565b610fa0611081610c65565b61108c906001612a6c565b11156110e65760405162461bcd60e51b8152602060048201526024808201527f50554d41204e6974726f706173733a204d696e7420537570706c7920457863656044820152631959195960e21b60648201526084016107a3565b600c5434146111075760405162461bcd60e51b81526004016107a3906129e8565b600d5461111333611ea5565b1061116f5760405162461bcd60e51b815260206004820152602660248201527f50554d41204e6974726f706173733a2045786365656473204d6178205065722060448201526515d85b1b195d60d21b60648201526084016107a3565b61117a336001611a86565b565b61072d8383836040518060200160405280600081525061170e565b61119f611a2c565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6111c9611a2c565b600f805482919060ff191660018360058111156111e8576111e8612b90565b021790555050565b60006111fb82611efa565b5192915050565b6001600160a01b03811660009081526010602052604081205461122490611aa4565b6112965760405162461bcd60e51b815260206004820152603760248201527f50554d41204e6974726f706173733a204164647265737320686173206e6f742060448201527f6275726e656420616e79204e6974726f20546f6b656e7300000000000000000060648201526084016107a3565b506001600160a01b031660009081526010602052604090205490565b600e80546112bf90612afa565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb90612afa565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b505050505081565b60006001600160a01b038216611369576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611396611a2c565b61117a6000612021565b6002600f5460ff1660058111156113b9576113b9612b90565b146114175760405162461bcd60e51b815260206004820152602860248201527f50554d41204e6974726f706173733a204f6e6520686f75722077696e646f77206044820152673737ba1037b832b760c11b60648201526084016107a3565b610fa081611423610c65565b61142d9190612a6c565b111561144b5760405162461bcd60e51b81526004016107a39061299e565b80600c546114599190612a98565b34146114775760405162461bcd60e51b81526004016107a3906129e8565b33600090815260106020526040902054611492906002612a98565b8161149c33611ea5565b6114a69190612a6c565b111561151a5760405162461bcd60e51b815260206004820152603b60248201527f50554d41204e6974726f706173733a204e6f7420656e6f75676820746f6b656e60448201527f73206275726e656420696e20343820686f7572732077696e646f77000000000060648201526084016107a3565b3360009081526010602052604090205481111561159f5760405162461bcd60e51b815260206004820152603c60248201527f50554d41204e6974726f706173733a204e6f7420656e6f75676820746f6b656e60448201527f73206275726e656420746f206d696e74207468617420616d6f756e740000000060648201526084016107a3565b6115a93382611a86565b50565b606060038054610b1590612afa565b6115c3611a2c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03821633141561160f5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611683611a2c565b604051600090339047908381818185875af1925050503d80600081146116c5576040519150601f19603f3d011682016040523d82523d6000602084013e6116ca565b606091505b50509050806115a95760405162461bcd60e51b815260206004820152601060248201526f2bb4ba34323930bb903330b4b632b21760811b60448201526064016107a3565b611719848484611ca3565b6001600160a01b0383163b1515801561173b575061173984848484612073565b155b15611759576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b611767611a2c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b611791611a2c565b6005600f5460ff1660058111156117aa576117aa612b90565b146117f75760405162461bcd60e51b815260206004820152601a60248201527f50554d41204e6974726f706173733a205374696c6c204c69766500000000000060448201526064016107a3565b60005b610fa08110156115a95761180d81611aa4565b1561181b5761181b81611b39565b8061182581612b35565b9150506117fa565b606061183882611aa4565b61185557604051630a14c4b560e41b815260040160405180910390fd5b600e805461186290612afa565b1515905061187f5760405180602001604052806000815250610713565b600e61188a8361216b565b60405160200161189b92919061287f565b60405160208183030381529060405292915050565b60006118ba610c65565b6118c690610fa0612ab7565b905090565b6118d3611a2c565b6000600f5460ff1660058111156118ec576118ec612b90565b148061190e57506001600f5460ff16600581111561190c5761190c612b90565b145b611982576040805162461bcd60e51b81526020600482015260248101919091527f50554d41204e6974726f706173733a20537461747573206d757374206265206e60448201527f6f74206c697665206f7220647572696e6720343820686f75722077696e646f7760648201526084016107a3565b610fa08161198e610c65565b6119989190612a6c565b111561159f5760405162461bcd60e51b81526004016107a39061299e565b6119be611a2c565b6001600160a01b038116611a235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a3565b6115a981612021565b6008546001600160a01b0316331461117a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107a3565b611aa0828260405180602001604052806000815250612268565b5050565b600081600111158015611ab8575060005482105b8015610713575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611b4482611efa565b9050611b566000838360000151611add565b80516001600160a01b039081166000908152600560209081526040808320805467ffffffffffffffff1981166001600160401b0391821660001901821617909155855185168452818420805467ffffffffffffffff60801b198116600160801b9182900484166001908101851690920217909155865188865260049094528285208054600160e01b9588166001600160e01b031990911617600160a01b42909416939093029290921760ff60e01b1916939093179055908501808352912054909116611c6d57600054811015611c6d57815160008281526004602090815260409091208054918501516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b50805160405183916000916001600160a01b0390911690600080516020612bfe833981519152908390a450506001805481019055565b6000611cae82611efa565b80519091506000906001600160a01b0316336001600160a01b03161480611cdc57508151611cdc9033610659565b80611cf7575033611cec84610b98565b6001600160a01b0316145b905080611d1757604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b031614611d4c5760405162a1148160e81b815260040160405180910390fd5b6001600160a01b038416611d7357604051633a954ecd60e21b815260040160405180910390fd5b611d836000848460000151611add565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217909255908601808352912054909116611e6d57600054811015611e6d57825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b0316600080516020612bfe83398151915260405160405180910390a45b5050505050565b60006001600160a01b038216611ece576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b60408051606081018252600080825260208201819052918101919091528180600111158015611f2a575060005481105b1561200857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120065780516001600160a01b031615611f9d579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612001579392505050565b611f9d565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906120a8903390899088908890600401612926565b602060405180830381600087803b1580156120c257600080fd5b505af19250505080156120f2575060408051601f3d908101601f191682019092526120ef91810190612756565b60015b61214d573d808015612120576040519150601f19603f3d011682016040523d82523d6000602084013e612125565b606091505b508051612145576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161218f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156121b957806121a381612b35565b91506121b29050600a83612a84565b9150612193565b6000816001600160401b038111156121d3576121d3612bbc565b6040519080825280601f01601f1916602001820160405280156121fd576020820181803683370190505b5090505b841561216357612212600183612ab7565b915061221f600a86612b50565b61222a906030612a6c565b60f81b81838151811061223f5761223f612ba6565b60200101906001600160f81b031916908160001a905350612261600a86612a84565b9450612201565b61072d83838360016000546001600160a01b03851661229957604051622e076360e81b815260040160405180910390fd5b836122b75760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561236357506001600160a01b0387163b15155b156123da575b60405182906001600160a01b03891690600090600080516020612bfe833981519152908290a46123a26000888480600101955088612073565b6123bf576040516368d2bf6b60e11b815260040160405180910390fd5b808214156123695782600054146123d557600080fd5b61240e565b5b6040516001830192906001600160a01b03891690600090600080516020612bfe833981519152908290a4808214156123db575b50600055611e9e565b82805461242390612afa565b90600052602060002090601f016020900481019282612445576000855561248b565b82601f1061245e5782800160ff1982351617855561248b565b8280016001018555821561248b579182015b8281111561248b578235825591602001919060010190612470565b5061249792915061249b565b5090565b5b80821115612497576000815560010161249c565b6000602082840312156124c257600080fd5b81356124cd81612bd2565b9392505050565b6000602082840312156124e657600080fd5b81516124cd81612bd2565b6000806040838503121561250457600080fd5b823561250f81612bd2565b9150602083013561251f81612bd2565b809150509250929050565b60008060006060848603121561253f57600080fd5b833561254a81612bd2565b9250602084013561255a81612bd2565b929592945050506040919091013590565b6000806000806080858703121561258157600080fd5b843561258c81612bd2565b935060208581013561259d81612bd2565b93506040860135925060608601356001600160401b03808211156125c057600080fd5b818801915088601f8301126125d457600080fd5b8135818111156125e6576125e6612bbc565b6125f8601f8201601f19168501612a3c565b9150808252898482850101111561260e57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561264157600080fd5b823561264c81612bd2565b91506020830135801515811461251f57600080fd5b6000806040838503121561267457600080fd5b823561267f81612bd2565b946020939093013593505050565b600060208083850312156126a057600080fd5b82356001600160401b03808211156126b757600080fd5b818501915085601f8301126126cb57600080fd5b8135818111156126dd576126dd612bbc565b8060051b91506126ee848301612a3c565b8181528481019084860184860187018a101561270957600080fd5b600095505b8386101561272c57803583526001959095019491860191860161270e565b5098975050505050505050565b60006020828403121561274b57600080fd5b81356124cd81612be7565b60006020828403121561276857600080fd5b81516124cd81612be7565b60006020828403121561278557600080fd5b8135600681106124cd57600080fd5b600080602083850312156127a757600080fd5b82356001600160401b03808211156127be57600080fd5b818501915085601f8301126127d257600080fd5b8135818111156127e157600080fd5b8660208285010111156127f357600080fd5b60209290920196919550909350505050565b60006020828403121561281757600080fd5b5035919050565b60006020828403121561283057600080fd5b5051919050565b6000815180845261284f816020860160208601612ace565b601f01601f19169290920160200192915050565b60008151612875818560208601612ace565b9290920192915050565b600080845481600182811c91508083168061289b57607f831692505b60208084108214156128bb57634e487b7160e01b86526022600452602486fd5b8180156128cf57600181146128e05761290d565b60ff1986168952848901965061290d565b60008b81526020902060005b868110156129055781548b8201529085019083016128ec565b505084890196505b50505050505061291d8185612863565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061295990830184612837565b9695505050505050565b602081016006831061298557634e487b7160e01b600052602160045260246000fd5b91905290565b6020815260006124cd6020830184612837565b6020808252602a908201527f50554d41204e6974726f706173733a204d696e7420616d6f756e74206578636560408201526965647320737570706c7960b01b606082015260800190565b60208082526034908201527f50554d41204e6974726f706173733a204e6f7420656e6f756768207061796d656040820152736e7420746f206d696e74204e6974726f7061737360601b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612a6457612a64612bbc565b604052919050565b60008219821115612a7f57612a7f612b64565b500190565b600082612a9357612a93612b7a565b500490565b6000816000190483118215151615612ab257612ab2612b64565b500290565b600082821015612ac957612ac9612b64565b500390565b60005b83811015612ae9578181015183820152602001612ad1565b838111156117595750506000910152565b600181811c90821680612b0e57607f821691505b60208210811415612b2f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612b4957612b49612b64565b5060010190565b600082612b5f57612b5f612b7a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146115a957600080fd5b6001600160e01b0319811681146115a957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207894aa59f18460444e8c92876f440c85c11422b010b4f2dd4df37c7a3b201fe664736f6c63430008070033

Deployed Bytecode Sourcemap

47117:6393:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25834:305;;;;;;;;;;-1:-1:-1;25834:305:0;;;;;:::i;:::-;;:::i;:::-;;;8925:14:1;;8918:22;8900:41;;8888:2;8873:18;25834:305:0;;;;;;;;53223:96;;;;;;;;;;-1:-1:-1;53223:96:0;;;;;:::i;:::-;;:::i;:::-;;50733:1095;;;;;;:::i;:::-;;:::i;29221:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30724:204::-;;;;;;;;;;-1:-1:-1;30724:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7944:32:1;;;7926:51;;7914:2;7899:18;30724:204:0;7780:203:1;30287:371:0;;;;;;;;;;-1:-1:-1;30287:371:0;;;;;:::i;:::-;;:::i;25083:303::-;;;;;;;;;;;;;:::i;:::-;;;19008:25:1;;;18996:2;18981:18;25083:303:0;18862:177:1;49779:946:0;;;;;;;;;;-1:-1:-1;49779:946:0;;;;;:::i;:::-;;:::i;31581:170::-;;;;;;;;;;-1:-1:-1;31581:170:0;;;;;:::i;:::-;;:::i;52574:544::-;;;:::i;47366:41::-;;;;;;;;;;;;47403:4;47366:41;;31822:185;;;;;;;;;;-1:-1:-1;31822:185:0;;;;;:::i;:::-;;:::i;47832:62::-;;;;;;;;;;-1:-1:-1;47832:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;49007:126;;;;;;;;;;-1:-1:-1;49007:126:0;;;;;:::i;:::-;;:::i;53126:85::-;;;;;;;;;;-1:-1:-1;53126:85:0;;;;;:::i;:::-;;:::i;29030:124::-;;;;;;;;;;-1:-1:-1;29030:124:0;;;;;:::i;:::-;;:::i;48726:273::-;;;;;;;;;;-1:-1:-1;48726:273:0;;;;;:::i;:::-;;:::i;47453:34::-;;;;;;;;;;;;;;;;47721:76;;;;;;;;;;;;;:::i;26203:206::-;;;;;;;;;;-1:-1:-1;26203:206:0;;;;;:::i;:::-;;:::i;45772:103::-;;;;;;;;;;;;;:::i;51836:730::-;;;;;;:::i;:::-;;:::i;47414:32::-;;;;;;;;;;;;;;;;45124:87;;;;;;;;;;-1:-1:-1;45197:6:0;;-1:-1:-1;;;;;45197:6:0;45124:87;;29390:104;;;;;;;;;;;;;:::i;47313:28::-;;;;;;;;;;-1:-1:-1;47313:28:0;;;;-1:-1:-1;;;;;47313:28:0;;;49141:130;;;;;;;;;;-1:-1:-1;49141:130:0;;;;;:::i;:::-;;:::i;31000:279::-;;;;;;;;;;-1:-1:-1;31000:279:0;;;;;:::i;:::-;;:::i;53327:178::-;;;;;;;;;;;;;:::i;32078:369::-;;;;;;;;;;-1:-1:-1;32078:369:0;;;;;:::i;:::-;;:::i;49279:118::-;;;;;;;;;;-1:-1:-1;49279:118:0;;;;;:::i;:::-;;:::i;49458:257::-;;;;;;;;;;;;;:::i;47804:19::-;;;;;;;;;;-1:-1:-1;47804:19:0;;;;;;;;;;;;;;;:::i;47968:271::-;;;;;;;;;;-1:-1:-1;47968:271:0;;;;;:::i;:::-;;:::i;48604:114::-;;;;;;;;;;;;;:::i;31350:164::-;;;;;;;;;;-1:-1:-1;31350:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31471:25:0;;;31447:4;31471:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31350:164;48247:349;;;;;;;;;;-1:-1:-1;48247:349:0;;;;;:::i;:::-;;:::i;46030:201::-;;;;;;;;;;-1:-1:-1;46030:201:0;;;;;:::i;:::-;;:::i;25834:305::-;25936:4;-1:-1:-1;;;;;;25973:40:0;;-1:-1:-1;;;25973:40:0;;:105;;-1:-1:-1;;;;;;;26030:48:0;;-1:-1:-1;;;26030:48:0;25973:105;:158;;;-1:-1:-1;;;;;;;;;;21314:40:0;;;26095:36;25953:178;25834:305;-1:-1:-1;;25834:305:0:o;53223:96::-;45010:13;:11;:13::i;:::-;53294:17:::1;:7;53304::::0;;53294:17:::1;:::i;:::-;;53223:96:::0;;:::o;50733:1095::-;50841:17;50832:5;;;;:26;;;;;;;;:::i;:::-;;50824:77;;;;-1:-1:-1;;;50824:77:0;;17050:2:1;50824:77:0;;;17032:21:1;17089:2;17069:18;;;17062:30;17128:34;17108:18;;;17101:62;-1:-1:-1;;;17179:18:1;;;17172:36;17225:19;;50824:77:0;;;;;;;;;50935:15;;50984:13;;50969:51;;-1:-1:-1;;;50969:51:0;;51009:10;50969:51;;;7926::1;50935:15:0;;-1:-1:-1;;;;;50984:13:0;;50969:39;;7899:18:1;;50969:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;50961:135;;;;-1:-1:-1;;;50961:135:0;;15489:2:1;50961:135:0;;;15471:21:1;15528:2;15508:18;;;15501:30;15567:34;15547:18;;;15540:62;15638:25;15618:18;;;15611:53;15681:19;;50961:135:0;15287:419:1;50961:135:0;51115:13;;-1:-1:-1;;;;;51115:13:0;51107:73;;;;-1:-1:-1;;;51107:73:0;;17878:2:1;51107:73:0;;;17860:21:1;17917:2;17897:18;;;17890:30;17956:34;17936:18;;;17929:62;-1:-1:-1;;;18007:18:1;;;18000:31;18048:19;;51107:73:0;17676:397:1;51107:73:0;51220:12;51212:5;;:20;;;;:::i;:::-;51199:9;:33;51191:98;;;;-1:-1:-1;;;51191:98:0;;;;;;;:::i;:::-;51306:19;;51338:438;51362:8;:15;51358:1;:19;51338:438;;;51399:15;51417:8;51426:1;51417:11;;;;;;;;:::i;:::-;;;;;;;;;;;51474:13;;51459:46;;-1:-1:-1;;;51459:46:0;;;;;19008:25:1;;;51417:11:0;;-1:-1:-1;51443:13:0;;-1:-1:-1;;;;;51474:13:0;;;;51459:37;;18981:18:1;;51459:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51443:62;-1:-1:-1;51528:10:0;-1:-1:-1;;;;;51528:19:0;;;51520:86;;;;-1:-1:-1;;;51520:86:0;;11364:2:1;51520:86:0;;;11346:21:1;11403:2;11383:18;;;11376:30;11442:34;11422:18;;;11415:62;-1:-1:-1;;;11493:18:1;;;11486:52;11555:19;;51520:86:0;11162:418:1;51520:86:0;-1:-1:-1;;;;;51621:33:0;;;;;;:26;:33;;;;;:35;;;;;;:::i;:::-;;;;;;51671:13;;;;;:::i;:::-;51714;;51699:65;;-1:-1:-1;;;51699:65:0;;;;;19008:25:1;;;51671:13:0;;-1:-1:-1;;;;;;51714:13:0;;-1:-1:-1;51699:56:0;;18981:18:1;;51699:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51384:392;;51379:3;;;;;:::i;:::-;;;;51338:438;;;;51786:34;51796:10;51808:11;51786:9;:34::i;29221:100::-;29275:13;29308:5;29301:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29221:100;:::o;30724:204::-;30792:7;30817:16;30825:7;30817;:16::i;:::-;30812:64;;30842:34;;-1:-1:-1;;;30842:34:0;;;;;;;;;;;30812:64;-1:-1:-1;30896:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30896:24:0;;30724:204::o;30287:371::-;30360:13;30376:24;30392:7;30376:15;:24::i;:::-;30360:40;;30421:5;-1:-1:-1;;;;;30415:11:0;:2;-1:-1:-1;;;;;30415:11:0;;30411:48;;;30435:24;;-1:-1:-1;;;30435:24:0;;;;;;;;;;;30411:48;20206:10;-1:-1:-1;;;;;30476:21:0;;;;;;:63;;-1:-1:-1;30502:37:0;30519:5;20206:10;31350:164;:::i;30502:37::-;30501:38;30476:63;30472:138;;;30563:35;;-1:-1:-1;;;30563:35:0;;;;;;;;;;;30472:138;30622:28;30631:2;30635:7;30644:5;30622:8;:28::i;25083:303::-;24890:1;25337:12;25127:7;25321:13;:28;-1:-1:-1;;25321:46:0;;25083:303::o;49779:946::-;49892:16;49883:5;;;;:25;;;;;;;;:::i;:::-;;49875:81;;;;-1:-1:-1;;;49875:81:0;;13823:2:1;49875:81:0;;;13805:21:1;13862:2;13842:18;;;13835:30;13901:34;13881:18;;;13874:62;-1:-1:-1;;;13952:18:1;;;13945:41;14003:19;;49875:81:0;13621:407:1;49875:81:0;49990:19;;;50028:21;50038:10;50028:9;:21::i;:::-;:37;;50020:102;;;;-1:-1:-1;;;50020:102:0;;17457:2:1;50020:102:0;;;17439:21:1;17496:2;17476:18;;;17469:30;17535:34;17515:18;;;17508:62;-1:-1:-1;;;17586:18:1;;;17579:50;17646:19;;50020:102:0;17255:416:1;50020:102:0;50141:16;;-1:-1:-1;;;;;50141:16:0;:30;;;;:63;;-1:-1:-1;50175:15:0;;-1:-1:-1;;;;;50175:15:0;:29;;50141:63;50133:132;;;;-1:-1:-1;;;50133:132:0;;12629:2:1;50133:132:0;;;12611:21:1;12668:2;12648:18;;;12641:30;12707:34;12687:18;;;12680:62;12778:26;12758:18;;;12751:54;12822:19;;50133:132:0;12427:420:1;50133:132:0;50276:19;;50306:272;50330:12;:19;50326:1;:23;50306:272;;;50371:15;50389:12;50402:1;50389:15;;;;;;;;:::i;:::-;;;;;;;50371:33;;50441:16;50449:7;50441;:16::i;:::-;-1:-1:-1;;;;;50427:30:0;:10;-1:-1:-1;;;;;50427:30:0;;50419:90;;;;-1:-1:-1;;;50419:90:0;;16274:2:1;50419:90:0;;;16256:21:1;16313:2;16293:18;;;16286:30;16352:34;16332:18;;;16325:62;-1:-1:-1;;;16403:18:1;;;16396:45;16458:19;;50419:90:0;16072:411:1;50419:90:0;50524:13;;;;:::i;:::-;;;;50552:14;50558:7;50552:5;:14::i;:::-;-1:-1:-1;50351:3:0;;;;:::i;:::-;;;;50306:272;;;-1:-1:-1;50601:16:0;;50588:60;;-1:-1:-1;;;50588:60:0;;50624:10;50588:60;;;8655:51:1;8722:18;;;8715:34;;;-1:-1:-1;;;;;50601:16:0;;;;50588:35;;8628:18:1;;50588:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50671:15:0;;50659:58;;-1:-1:-1;;;50659:58:0;;50693:10;50659:58;;;8655:51:1;8722:18;;;8715:34;;;-1:-1:-1;;;;;50671:15:0;;;;-1:-1:-1;50659:33:0;;-1:-1:-1;8628:18:1;;50659:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49864:861;;49779:946;:::o;31581:170::-;31715:28;31725:4;31731:2;31735:7;31715:9;:28::i;52574:544::-;52641:13;52632:5;;;;:22;;;;;;;;:::i;:::-;;52624:66;;;;-1:-1:-1;;;52624:66:0;;16690:2:1;52624:66:0;;;16672:21:1;16729:2;16709:18;;;16702:30;16768:33;16748:18;;;16741:61;16819:18;;52624:66:0;16488:355:1;52624:66:0;52709:10;52723:9;52709:23;52701:84;;;;-1:-1:-1;;;52701:84:0;;9722:2:1;52701:84:0;;;9704:21:1;9761:2;9741:18;;;9734:30;9800:34;9780:18;;;9773:62;-1:-1:-1;;;9851:18:1;;;9844:46;9907:19;;52701:84:0;9520:412:1;52701:84:0;47403:4;52804:13;:11;:13::i;:::-;:17;;52820:1;52804:17;:::i;:::-;:31;;52796:80;;;;-1:-1:-1;;;52796:80:0;;14656:2:1;52796:80:0;;;14638:21:1;14695:2;14675:18;;;14668:30;14734:34;14714:18;;;14707:62;-1:-1:-1;;;14785:18:1;;;14778:34;14829:19;;52796:80:0;14454:400:1;52796:80:0;52908:5;;52895:9;:18;52887:83;;;;-1:-1:-1;;;52887:83:0;;;;;;;:::i;:::-;53017:15;;52989:25;53003:10;52989:13;:25::i;:::-;:43;52981:94;;;;-1:-1:-1;;;52981:94:0;;10139:2:1;52981:94:0;;;10121:21:1;10178:2;10158:18;;;10151:30;10217:34;10197:18;;;10190:62;-1:-1:-1;;;10268:18:1;;;10261:36;10314:19;;52981:94:0;9937:402:1;52981:94:0;53086:24;53096:10;53108:1;53086:9;:24::i;:::-;52574:544::o;31822:185::-;31960:39;31977:4;31983:2;31987:7;31960:39;;;;;;;;;;;;:16;:39::i;49007:126::-;45010:13;:11;:13::i;:::-;49091:15:::1;:34:::0;;-1:-1:-1;;;;;;49091:34:0::1;-1:-1:-1::0;;;;;49091:34:0;;;::::1;::::0;;;::::1;::::0;;49007:126::o;53126:85::-;45010:13;:11;:13::i;:::-;53189:5:::1;:14:::0;;53197:6;;53189:5;-1:-1:-1;;53189:14:0::1;::::0;53197:6;53189:14:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;53126:85:::0;:::o;29030:124::-;29094:7;29121:20;29133:7;29121:11;:20::i;:::-;:25;;29030:124;-1:-1:-1;;29030:124:0:o;48726:273::-;-1:-1:-1;;;;;48840:36:0;;48804:7;48840:36;;;:26;:36;;;;;;48832:45;;:7;:45::i;:::-;48824:113;;;;-1:-1:-1;;;48824:113:0;;13399:2:1;48824:113:0;;;13381:21:1;13438:2;13418:18;;;13411:30;13477:34;13457:18;;;13450:62;13548:25;13528:18;;;13521:53;13591:19;;48824:113:0;13197:419:1;48824:113:0;-1:-1:-1;;;;;;48955:36:0;;;;;:26;:36;;;;;;;48726:273::o;47721:76::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26203:206::-;26267:7;-1:-1:-1;;;;;26291:19:0;;26287:60;;26319:28;;-1:-1:-1;;;26319:28:0;;;;;;;;;;;26287:60;-1:-1:-1;;;;;;26373:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;26373:27:0;;26203:206::o;45772:103::-;45010:13;:11;:13::i;:::-;45837:30:::1;45864:1;45837:18;:30::i;51836:730::-:0;51923:20;51914:5;;;;:29;;;;;;;;:::i;:::-;;51906:82;;;;-1:-1:-1;;;51906:82:0;;11787:2:1;51906:82:0;;;11769:21:1;11826:2;11806:18;;;11799:30;11865:34;11845:18;;;11838:62;-1:-1:-1;;;11916:18:1;;;11909:38;11964:19;;51906:82:0;11585:404:1;51906:82:0;47403:4;52023:11;52007:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:41;;51999:96;;;;-1:-1:-1;;;51999:96:0;;;;;;;:::i;:::-;52135:11;52127:5;;:19;;;;:::i;:::-;52114:9;:32;52106:97;;;;-1:-1:-1;;;52106:97:0;;;;;;;:::i;:::-;52297:10;52270:38;;;;:26;:38;;;;;;:42;;52311:1;52270:42;:::i;:::-;52255:11;52227:25;52241:10;52227:13;:25::i;:::-;:39;;;;:::i;:::-;:85;;52219:157;;;;-1:-1:-1;;;52219:157:0;;15061:2:1;52219:157:0;;;15043:21:1;15100:2;15080:18;;;15073:30;15139:34;15119:18;;;15112:62;15210:29;15190:18;;;15183:57;15257:19;;52219:157:0;14859:423:1;52219:157:0;52437:10;52410:38;;;;:26;:38;;;;;;52395:53;;;52387:126;;;;-1:-1:-1;;;52387:126:0;;18635:2:1;52387:126:0;;;18617:21:1;18674:2;18654:18;;;18647:30;18713:34;18693:18;;;18686:62;18784:30;18764:18;;;18757:58;18832:19;;52387:126:0;18433:424:1;52387:126:0;52524:34;52534:10;52546:11;52524:9;:34::i;:::-;51836:730;:::o;29390:104::-;29446:13;29479:7;29472:14;;;;;:::i;49141:130::-;45010:13;:11;:13::i;:::-;49227:16:::1;:36:::0;;-1:-1:-1;;;;;;49227:36:0::1;-1:-1:-1::0;;;;;49227:36:0;;;::::1;::::0;;;::::1;::::0;;49141:130::o;31000:279::-;-1:-1:-1;;;;;31091:24:0;;20206:10;31091:24;31087:54;;;31124:17;;-1:-1:-1;;;31124:17:0;;;;;;;;;;;31087:54;20206:10;31154:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31154:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31154:53:0;;;;;;;;;;31223:48;;8900:41:1;;;31154:42:0;;20206:10;31223:48;;8873:18:1;31223:48:0;;;;;;;31000:279;;:::o;53327:178::-;45010:13;:11;:13::i;:::-;53401:49:::1;::::0;53383:12:::1;::::0;53401:10:::1;::::0;53424:21:::1;::::0;53383:12;53401:49;53383:12;53401:49;53424:21;53401:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53382:68;;;53469:7;53461:36;;;::::0;-1:-1:-1;;;53461:36:0;;13054:2:1;53461:36:0::1;::::0;::::1;13036:21:1::0;13093:2;13073:18;;;13066:30;-1:-1:-1;;;13112:18:1;;;13105:46;13168:18;;53461:36:0::1;12852:340:1::0;32078:369:0;32245:28;32255:4;32261:2;32265:7;32245:9;:28::i;:::-;-1:-1:-1;;;;;32288:13:0;;12418:19;:23;;32288:76;;;;;32308:56;32339:4;32345:2;32349:7;32358:5;32308:30;:56::i;:::-;32307:57;32288:76;32284:156;;;32388:40;;-1:-1:-1;;;32388:40:0;;;;;;;;;;;32284:156;32078:369;;;;:::o;49279:118::-;45010:13;:11;:13::i;:::-;49359::::1;:30:::0;;-1:-1:-1;;;;;;49359:30:0::1;-1:-1:-1::0;;;;;49359:30:0;;;::::1;::::0;;;::::1;::::0;;49279:118::o;49458:257::-;45010:13;:11;:13::i;:::-;49535:12:::1;49526:5;::::0;::::1;;:21;::::0;::::1;;;;;;:::i;:::-;;49518:60;;;::::0;-1:-1:-1;;;49518:60:0;;18280:2:1;49518:60:0::1;::::0;::::1;18262:21:1::0;18319:2;18299:18;;;18292:30;18358:28;18338:18;;;18331:56;18404:18;;49518:60:0::1;18078:350:1::0;49518:60:0::1;49594:9;49589:119;47403:4;49605:1;:12;49589:119;;;49642:10;49650:1;49642:7;:10::i;:::-;49639:58;;;49673:8;49679:1;49673:5;:8::i;:::-;49619:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49589:119;;47968:271:::0;48041:13;48072:16;48080:7;48072;:16::i;:::-;48067:59;;48097:29;;-1:-1:-1;;;48097:29:0;;;;;;;;;;;48067:59;48150:7;48144:21;;;;;:::i;:::-;:26;;;-1:-1:-1;48144:87:0;;;;;;;;;;;;;;;;;48197:7;48206:18;:7;:16;:18::i;:::-;48180:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48137:94;47968:271;-1:-1:-1;;47968:271:0:o;48604:114::-;48657:7;48697:13;:11;:13::i;:::-;48684:26;;47403:4;48684:26;:::i;:::-;48677:33;;48604:114;:::o;48247:349::-;45010:13;:11;:13::i;:::-;48330:15:::1;48321:5;::::0;::::1;;:24;::::0;::::1;;;;;;:::i;:::-;;:54;;;-1:-1:-1::0;48358:17:0::1;48349:5;::::0;::::1;;:26;::::0;::::1;;;;;;:::i;:::-;;48321:54;48313:131;;;::::0;;-1:-1:-1;;;48313:131:0;;12196:2:1;48313:131:0::1;::::0;::::1;12178:21:1::0;12215:18;;;12208:30;;;;12274:34;12254:18;;;12247:62;12345:34;12325:18;;;12318:62;12397:19;;48313:131:0::1;11994:428:1::0;48313:131:0::1;47403:4;48479:7;48463:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:37;;48455:92;;;;-1:-1:-1::0;;;48455:92:0::1;;;;;;;:::i;46030:201::-:0;45010:13;:11;:13::i;:::-;-1:-1:-1;;;;;46119:22:0;::::1;46111:73;;;::::0;-1:-1:-1;;;46111:73:0;;10546:2:1;46111:73:0::1;::::0;::::1;10528:21:1::0;10585:2;10565:18;;;10558:30;10624:34;10604:18;;;10597:62;-1:-1:-1;;;10675:18:1;;;10668:36;10721:19;;46111:73:0::1;10344:402:1::0;46111:73:0::1;46195:28;46214:8;46195:18;:28::i;45289:132::-:0;45197:6;;-1:-1:-1;;;;;45197:6:0;20206:10;45353:23;45345:68;;;;-1:-1:-1;;;45345:68:0;;15913:2:1;45345:68:0;;;15895:21:1;;;15932:18;;;15925:30;15991:34;15971:18;;;15964:62;16043:18;;45345:68:0;15711:356:1;32897:104:0;32966:27;32976:2;32980:8;32966:27;;;;;;;;;;;;:9;:27::i;:::-;32897:104;;:::o;32702:187::-;32759:4;32802:7;24890:1;32783:26;;:53;;;;;32823:13;;32813:7;:23;32783:53;:98;;;;-1:-1:-1;;32854:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;32854:27:0;;;;32853:28;;32702:187::o;40313:196::-;40428:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40428:29:0;-1:-1:-1;;;;;40428:29:0;;;;;;;;;40473:28;;40428:24;;40473:28;;;;;;;40313:196;;;:::o;38156:2039::-;38216:35;38254:20;38266:7;38254:11;:20::i;:::-;38216:58;-1:-1:-1;38417:49:0;38434:1;38438:7;38447:13;:18;;;38417:8;:49::i;:::-;38775:18;;-1:-1:-1;;;;;38762:32:0;;;;;;;:12;:32;;;;;;;;:45;;-1:-1:-1;;38762:45:0;;-1:-1:-1;;;;;38762:45:0;;;-1:-1:-1;;38762:45:0;;;;;;;38835:18;;38822:32;;;;;;;:50;;-1:-1:-1;;;;38822:50:0;;-1:-1:-1;;;38822:50:0;;;;;;-1:-1:-1;38822:50:0;;;;;;;;;;;;38999:18;;38971:20;;;:11;:20;;;;;;:46;;-1:-1:-1;;;38971:46:0;;;-1:-1:-1;;;;;;39032:61:0;;;;-1:-1:-1;;;39077:15:0;39032:61;;;;;;;;;;;-1:-1:-1;;;;39108:34:0;;;;;;;39412:11;;;39442:24;;;;;:29;39412:11;;39442:29;39438:445;;39667:13;;39653:11;:27;39649:219;;;39737:18;;;39705:24;;;:11;:24;;;;;;;;:50;;39820:28;;;;-1:-1:-1;;;;;39778:70:0;-1:-1:-1;;;39778:70:0;-1:-1:-1;;;;;;39778:70:0;;;-1:-1:-1;;;;;39705:50:0;;;39778:70;;;;;;;39649:219;-1:-1:-1;39920:18:0;;39911:49;;39952:7;;39948:1;;-1:-1:-1;;;;;39911:49:0;;;;-1:-1:-1;;;;;;;;;;;39911:49:0;39948:1;;39911:49;-1:-1:-1;;40162:12:0;:14;;;;;;38156:2039::o;35815:2112::-;35930:35;35968:20;35980:7;35968:11;:20::i;:::-;36043:18;;35930:58;;-1:-1:-1;36001:22:0;;-1:-1:-1;;;;;36027:34:0;20206:10;-1:-1:-1;;;;;36027:34:0;;:101;;;-1:-1:-1;36095:18:0;;36078:50;;20206:10;31350:164;:::i;36078:50::-;36027:154;;;-1:-1:-1;20206:10:0;36145:20;36157:7;36145:11;:20::i;:::-;-1:-1:-1;;;;;36145:36:0;;36027:154;36001:181;;36200:17;36195:66;;36226:35;;-1:-1:-1;;;36226:35:0;;;;;;;;;;;36195:66;36298:4;-1:-1:-1;;;;;36276:26:0;:13;:18;;;-1:-1:-1;;;;;36276:26:0;;36272:67;;36311:28;;-1:-1:-1;;;36311:28:0;;;;;;;;;;;36272:67;-1:-1:-1;;;;;36354:16:0;;36350:52;;36379:23;;-1:-1:-1;;;36379:23:0;;;;;;;;;;;36350:52;36523:49;36540:1;36544:7;36553:13;:18;;;36523:8;:49::i;:::-;-1:-1:-1;;;;;36868:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36868:31:0;;;-1:-1:-1;;;;;36868:31:0;;;-1:-1:-1;;36868:31:0;;;;;;;36914:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36914:29:0;;;;;;;;;;;36960:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;37005:61:0;;;;-1:-1:-1;;;37050:15:0;37005:61;;;;;;;;;;;37340:11;;;37370:24;;;;;:29;37340:11;;37370:29;37366:445;;37595:13;;37581:11;:27;37577:219;;;37665:18;;;37633:24;;;:11;:24;;;;;;;;:50;;37748:28;;;;-1:-1:-1;;;;;37706:70:0;-1:-1:-1;;;37706:70:0;-1:-1:-1;;;;;;37706:70:0;;;-1:-1:-1;;;;;37633:50:0;;;37706:70;;;;;;;37577:219;36843:979;37858:7;37854:2;-1:-1:-1;;;;;37839:27:0;37848:4;-1:-1:-1;;;;;37839:27:0;-1:-1:-1;;;;;;;;;;;37839:27:0;;;;;;;;;37877:42;35919:2008;;35815:2112;;;:::o;26491:207::-;26552:7;-1:-1:-1;;;;;26576:19:0;;26572:59;;26604:27;;-1:-1:-1;;;26604:27:0;;;;;;;;;;;26572:59;-1:-1:-1;;;;;;26657:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;26657:32:0;;-1:-1:-1;;;;;26657:32:0;;26491:207::o;27860:1108::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;27970:7:0;;24890:1;28019:23;;:47;;;;;28053:13;;28046:4;:20;28019:47;28015:886;;;28087:31;28121:17;;;:11;:17;;;;;;;;;28087:51;;;;;;;;;-1:-1:-1;;;;;28087:51:0;;;;-1:-1:-1;;;28087:51:0;;-1:-1:-1;;;;;28087:51:0;;;;;;;;-1:-1:-1;;;28087:51:0;;;;;;;;;;;;;;28157:729;;28207:14;;-1:-1:-1;;;;;28207:28:0;;28203:101;;28271:9;27860:1108;-1:-1:-1;;;27860:1108:0:o;28203:101::-;-1:-1:-1;;;28646:6:0;28691:17;;;;:11;:17;;;;;;;;;28679:29;;;;;;;;;-1:-1:-1;;;;;28679:29:0;;;;;-1:-1:-1;;;28679:29:0;;-1:-1:-1;;;;;28679:29:0;;;;;;;;-1:-1:-1;;;28679:29:0;;;;;;;;;;;;;28739:28;28735:109;;28807:9;27860:1108;-1:-1:-1;;;27860:1108:0:o;28735:109::-;28606:261;;;28068:833;28015:886;28929:31;;-1:-1:-1;;;28929:31:0;;;;;;;;;;;46391:191;46484:6;;;-1:-1:-1;;;;;46501:17:0;;;-1:-1:-1;;;;;;46501:17:0;;;;;;;46534:40;;46484:6;;;46501:17;46484:6;;46534:40;;46465:16;;46534:40;46454:128;46391:191;:::o;41001:667::-;41185:72;;-1:-1:-1;;;41185:72:0;;41164:4;;-1:-1:-1;;;;;41185:36:0;;;;;:72;;20206:10;;41236:4;;41242:7;;41251:5;;41185:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41185:72:0;;;;;;;;-1:-1:-1;;41185:72:0;;;;;;;;;;;;:::i;:::-;;;41181:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41419:13:0;;41415:235;;41465:40;;-1:-1:-1;;;41465:40:0;;;;;;;;;;;41415:235;41608:6;41602:13;41593:6;41589:2;41585:15;41578:38;41181:480;-1:-1:-1;;;;;;41304:55:0;-1:-1:-1;;;41304:55:0;;-1:-1:-1;41181:480:0;41001:667;;;;;;:::o;375:723::-;431:13;652:10;648:53;;-1:-1:-1;;679:10:0;;;;;;;;;;;;-1:-1:-1;;;679:10:0;;;;;375:723::o;648:53::-;726:5;711:12;767:78;774:9;;767:78;;800:8;;;;:::i;:::-;;-1:-1:-1;823:10:0;;-1:-1:-1;831:2:0;823:10;;:::i;:::-;;;767:78;;;855:19;887:6;-1:-1:-1;;;;;877:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;877:17:0;;855:39;;905:154;912:10;;905:154;;939:11;949:1;939:11;;:::i;:::-;;-1:-1:-1;1008:10:0;1016:2;1008:5;:10;:::i;:::-;995:24;;:2;:24;:::i;:::-;982:39;;965:6;972;965:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;965:56:0;;;;;;;;-1:-1:-1;1036:11:0;1045:2;1036:11;;:::i;:::-;;;905:154;;33364:163;33487:32;33493:2;33497:8;33507:5;33514:4;33925:20;33948:13;-1:-1:-1;;;;;33976:16:0;;33972:48;;34001:19;;-1:-1:-1;;;34001:19:0;;;;;;;;;;;33972:48;34035:13;34031:44;;34057:18;;-1:-1:-1;;;34057:18:0;;;;;;;;;;;34031:44;-1:-1:-1;;;;;34426:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;34485:49:0;;-1:-1:-1;;;;;34426:44:0;;;;;;;34485:49;;;-1:-1:-1;;;;;34426:44:0;;;;;;34485:49;;;;;;;;;;;;;;;;34551:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;34601:66:0;;;;-1:-1:-1;;;34651:15:0;34601:66;;;;;;;;;;34551:25;34748:23;;;34792:4;:23;;;;-1:-1:-1;;;;;;34800:13:0;;12418:19;:23;;34800:15;34788:641;;;34836:314;34867:38;;34892:12;;-1:-1:-1;;;;;34867:38:0;;;34884:1;;-1:-1:-1;;;;;;;;;;;34867:38:0;34884:1;;34867:38;34933:69;34972:1;34976:2;34980:14;;;;;;34996:5;34933:30;:69::i;:::-;34928:174;;35038:40;;-1:-1:-1;;;35038:40:0;;;;;;;;;;;34928:174;35145:3;35129:12;:19;;34836:314;;35231:12;35214:13;;:29;35210:43;;35245:8;;;35210:43;34788:641;;;35294:120;35325:40;;35350:14;;;;;-1:-1:-1;;;;;35325:40:0;;;35342:1;;-1:-1:-1;;;;;;;;;;;35325:40:0;35342:1;;35325:40;35409:3;35393:12;:19;;35294:120;;34788:641;-1:-1:-1;35443:13:0;:28;35493:60;32078:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1108::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1697:2:1;1736:18;;;1723:32;1764:33;1723:32;1764:33;:::i;:::-;1816:7;-1:-1:-1;1870:2:1;1855:18;;1842:32;;-1:-1:-1;1925:2:1;1910:18;;1897:32;-1:-1:-1;;;;;1978:14:1;;;1975:34;;;2005:1;2002;1995:12;1975:34;2043:6;2032:9;2028:22;2018:32;;2088:7;2081:4;2077:2;2073:13;2069:27;2059:55;;2110:1;2107;2100:12;2059:55;2146:2;2133:16;2168:2;2164;2161:10;2158:36;;;2174:18;;:::i;:::-;2216:53;2259:2;2240:13;;-1:-1:-1;;2236:27:1;2232:36;;2216:53;:::i;:::-;2203:66;;2292:2;2285:5;2278:17;2332:7;2327:2;2322;2318;2314:11;2310:20;2307:33;2304:53;;;2353:1;2350;2343:12;2304:53;2408:2;2403;2399;2395:11;2390:2;2383:5;2379:14;2366:45;2452:1;2447:2;2442;2435:5;2431:14;2427:23;2420:34;;2473:5;2463:15;;;;;1376:1108;;;;;;;:::o;2489:416::-;2554:6;2562;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;2670:9;2657:23;2689:31;2714:5;2689:31;:::i;:::-;2739:5;-1:-1:-1;2796:2:1;2781:18;;2768:32;2838:15;;2831:23;2819:36;;2809:64;;2869:1;2866;2859:12;2910:315;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;3094:9;3081:23;3113:31;3138:5;3113:31;:::i;:::-;3163:5;3215:2;3200:18;;;;3187:32;;-1:-1:-1;;;2910:315:1:o;3230:957::-;3314:6;3345:2;3388;3376:9;3367:7;3363:23;3359:32;3356:52;;;3404:1;3401;3394:12;3356:52;3444:9;3431:23;-1:-1:-1;;;;;3514:2:1;3506:6;3503:14;3500:34;;;3530:1;3527;3520:12;3500:34;3568:6;3557:9;3553:22;3543:32;;3613:7;3606:4;3602:2;3598:13;3594:27;3584:55;;3635:1;3632;3625:12;3584:55;3671:2;3658:16;3693:2;3689;3686:10;3683:36;;;3699:18;;:::i;:::-;3745:2;3742:1;3738:10;3728:20;;3768:28;3792:2;3788;3784:11;3768:28;:::i;:::-;3830:15;;;3861:12;;;;3893:11;;;3923;;;3919:20;;3916:33;-1:-1:-1;3913:53:1;;;3962:1;3959;3952:12;3913:53;3984:1;3975:10;;3994:163;4008:2;4005:1;4002:9;3994:163;;;4065:17;;4053:30;;4026:1;4019:9;;;;;4103:12;;;;4135;;3994:163;;;-1:-1:-1;4176:5:1;3230:957;-1:-1:-1;;;;;;;;3230:957:1:o;4192:245::-;4250:6;4303:2;4291:9;4282:7;4278:23;4274:32;4271:52;;;4319:1;4316;4309:12;4271:52;4358:9;4345:23;4377:30;4401:5;4377:30;:::i;4442:249::-;4511:6;4564:2;4552:9;4543:7;4539:23;4535:32;4532:52;;;4580:1;4577;4570:12;4532:52;4612:9;4606:16;4631:30;4655:5;4631:30;:::i;4696:267::-;4766:6;4819:2;4807:9;4798:7;4794:23;4790:32;4787:52;;;4835:1;4832;4825:12;4787:52;4874:9;4861:23;4913:1;4906:5;4903:12;4893:40;;4929:1;4926;4919:12;4968:592;5039:6;5047;5100:2;5088:9;5079:7;5075:23;5071:32;5068:52;;;5116:1;5113;5106:12;5068:52;5156:9;5143:23;-1:-1:-1;;;;;5226:2:1;5218:6;5215:14;5212:34;;;5242:1;5239;5232:12;5212:34;5280:6;5269:9;5265:22;5255:32;;5325:7;5318:4;5314:2;5310:13;5306:27;5296:55;;5347:1;5344;5337:12;5296:55;5387:2;5374:16;5413:2;5405:6;5402:14;5399:34;;;5429:1;5426;5419:12;5399:34;5474:7;5469:2;5460:6;5456:2;5452:15;5448:24;5445:37;5442:57;;;5495:1;5492;5485:12;5442:57;5526:2;5518:11;;;;;5548:6;;-1:-1:-1;4968:592:1;;-1:-1:-1;;;;4968:592:1:o;5565:180::-;5624:6;5677:2;5665:9;5656:7;5652:23;5648:32;5645:52;;;5693:1;5690;5683:12;5645:52;-1:-1:-1;5716:23:1;;5565:180;-1:-1:-1;5565:180:1:o;5750:184::-;5820:6;5873:2;5861:9;5852:7;5848:23;5844:32;5841:52;;;5889:1;5886;5879:12;5841:52;-1:-1:-1;5912:16:1;;5750:184;-1:-1:-1;5750:184:1:o;5939:257::-;5980:3;6018:5;6012:12;6045:6;6040:3;6033:19;6061:63;6117:6;6110:4;6105:3;6101:14;6094:4;6087:5;6083:16;6061:63;:::i;:::-;6178:2;6157:15;-1:-1:-1;;6153:29:1;6144:39;;;;6185:4;6140:50;;5939:257;-1:-1:-1;;5939:257:1:o;6201:185::-;6243:3;6281:5;6275:12;6296:52;6341:6;6336:3;6329:4;6322:5;6318:16;6296:52;:::i;:::-;6364:16;;;;;6201:185;-1:-1:-1;;6201:185:1:o;6391:1174::-;6567:3;6596:1;6629:6;6623:13;6659:3;6681:1;6709:9;6705:2;6701:18;6691:28;;6769:2;6758:9;6754:18;6791;6781:61;;6835:4;6827:6;6823:17;6813:27;;6781:61;6861:2;6909;6901:6;6898:14;6878:18;6875:38;6872:165;;;-1:-1:-1;;;6936:33:1;;6992:4;6989:1;6982:15;7022:4;6943:3;7010:17;6872:165;7053:18;7080:104;;;;7198:1;7193:320;;;;7046:467;;7080:104;-1:-1:-1;;7113:24:1;;7101:37;;7158:16;;;;-1:-1:-1;7080:104:1;;7193:320;19397:1;19390:14;;;19434:4;19421:18;;7288:1;7302:165;7316:6;7313:1;7310:13;7302:165;;;7394:14;;7381:11;;;7374:35;7437:16;;;;7331:10;;7302:165;;;7306:3;;7496:6;7491:3;7487:16;7480:23;;7046:467;;;;;;;7529:30;7555:3;7547:6;7529:30;:::i;:::-;7522:37;6391:1174;-1:-1:-1;;;;;6391:1174:1:o;7988:488::-;-1:-1:-1;;;;;8257:15:1;;;8239:34;;8309:15;;8304:2;8289:18;;8282:43;8356:2;8341:18;;8334:34;;;8404:3;8399:2;8384:18;;8377:31;;;8182:4;;8425:45;;8450:19;;8442:6;8425:45;:::i;:::-;8417:53;7988:488;-1:-1:-1;;;;;;7988:488:1:o;8952:339::-;9095:2;9080:18;;9128:1;9117:13;;9107:144;;9173:10;9168:3;9164:20;9161:1;9154:31;9208:4;9205:1;9198:15;9236:4;9233:1;9226:15;9107:144;9260:25;;;8952:339;:::o;9296:219::-;9445:2;9434:9;9427:21;9408:4;9465:44;9505:2;9494:9;9490:18;9482:6;9465:44;:::i;10751:406::-;10953:2;10935:21;;;10992:2;10972:18;;;10965:30;11031:34;11026:2;11011:18;;11004:62;-1:-1:-1;;;11097:2:1;11082:18;;11075:40;11147:3;11132:19;;10751:406::o;14033:416::-;14235:2;14217:21;;;14274:2;14254:18;;;14247:30;14313:34;14308:2;14293:18;;14286:62;-1:-1:-1;;;14379:2:1;14364:18;;14357:50;14439:3;14424:19;;14033:416::o;19044:275::-;19115:2;19109:9;19180:2;19161:13;;-1:-1:-1;;19157:27:1;19145:40;;-1:-1:-1;;;;;19200:34:1;;19236:22;;;19197:62;19194:88;;;19262:18;;:::i;:::-;19298:2;19291:22;19044:275;;-1:-1:-1;19044:275:1:o;19450:128::-;19490:3;19521:1;19517:6;19514:1;19511:13;19508:39;;;19527:18;;:::i;:::-;-1:-1:-1;19563:9:1;;19450:128::o;19583:120::-;19623:1;19649;19639:35;;19654:18;;:::i;:::-;-1:-1:-1;19688:9:1;;19583:120::o;19708:168::-;19748:7;19814:1;19810;19806:6;19802:14;19799:1;19796:21;19791:1;19784:9;19777:17;19773:45;19770:71;;;19821:18;;:::i;:::-;-1:-1:-1;19861:9:1;;19708:168::o;19881:125::-;19921:4;19949:1;19946;19943:8;19940:34;;;19954:18;;:::i;:::-;-1:-1:-1;19991:9:1;;19881:125::o;20011:258::-;20083:1;20093:113;20107:6;20104:1;20101:13;20093:113;;;20183:11;;;20177:18;20164:11;;;20157:39;20129:2;20122:10;20093:113;;;20224:6;20221:1;20218:13;20215:48;;;-1:-1:-1;;20259:1:1;20241:16;;20234:27;20011:258::o;20274:380::-;20353:1;20349:12;;;;20396;;;20417:61;;20471:4;20463:6;20459:17;20449:27;;20417:61;20524:2;20516:6;20513:14;20493:18;20490:38;20487:161;;;20570:10;20565:3;20561:20;20558:1;20551:31;20605:4;20602:1;20595:15;20633:4;20630:1;20623:15;20487:161;;20274:380;;;:::o;20659:135::-;20698:3;-1:-1:-1;;20719:17:1;;20716:43;;;20739:18;;:::i;:::-;-1:-1:-1;20786:1:1;20775:13;;20659:135::o;20799:112::-;20831:1;20857;20847:35;;20862:18;;:::i;:::-;-1:-1:-1;20896:9:1;;20799:112::o;20916:127::-;20977:10;20972:3;20968:20;20965:1;20958:31;21008:4;21005:1;20998:15;21032:4;21029:1;21022:15;21048:127;21109:10;21104:3;21100:20;21097:1;21090:31;21140:4;21137:1;21130:15;21164:4;21161:1;21154:15;21180:127;21241:10;21236:3;21232:20;21229:1;21222:31;21272:4;21269:1;21262:15;21296:4;21293:1;21286:15;21312:127;21373:10;21368:3;21364:20;21361:1;21354:31;21404:4;21401:1;21394:15;21428:4;21425:1;21418:15;21444:127;21505:10;21500:3;21496:20;21493:1;21486:31;21536:4;21533:1;21526:15;21560:4;21557:1;21550:15;21576:131;-1:-1:-1;;;;;21651:31:1;;21641:42;;21631:70;;21697:1;21694;21687:12;21712:131;-1:-1:-1;;;;;;21786:32:1;;21776:43;;21766:71;;21833:1;21830;21823:12

Swarm Source

ipfs://7894aa59f18460444e8c92876f440c85c11422b010b4f2dd4df37c7a3b201fe6
Loading...
Loading
Loading...
Loading
[ 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.