ETH Price: $2,628.88 (+1.68%)
Gas: 1 Gwei

Token

Pine Pieces Genesis (PPG1)
 

Overview

Max Total Supply

144 PPG1

Holders

97

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
joshglobal.eth
Balance
2 PPG1
0x1B366f42D0478aFf04C77105B4E994fa574DAdcA
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721A

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-27
*/

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


// 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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: contracts-local/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
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, Ownable {
    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;

    uint8 public randomSeed;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    string public baseURIchangeable;

    function changeBaseURI(string calldata _buri) public onlyOwner {
        baseURIchangeable = _buri;
    }

    // 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 0;
    }

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 (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 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) 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;

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, 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 {}

    function mintMulti(address[] calldata addresses, uint[] calldata quantities) public onlyOwner {
        require(addresses.length == quantities.length, "invalid params");
        for (uint i = 0; i < addresses.length; i++) {
            _mint(addresses[i], quantities[i]);
        }
        if (randomSeed == 0) randomSeed = uint8(uint32(uint(blockhash(block.number - 1))));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"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":"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":[{"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":"baseURIchangeable","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_buri","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"mintMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomSeed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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"}]

60806040523480156200001157600080fd5b5060405162003264380380620032648339818101604052810190620000379190620003c5565b620000576200004b620000a760201b60201c565b620000af60201b60201c565b81600490805190602001906200006f92919062000178565b5080600590805190602001906200008892919062000178565b50620000996200017360201b60201c565b6001819055505050620004ae565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b828054620001869062000479565b90600052602060002090601f016020900481019282620001aa5760008555620001f6565b82601f10620001c557805160ff1916838001178555620001f6565b82800160010185558215620001f6579182015b82811115620001f5578251825591602001919060010190620001d8565b5b50905062000205919062000209565b5090565b5b80821115620002245760008160009055506001016200020a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002918262000246565b810181811067ffffffffffffffff82111715620002b357620002b262000257565b5b80604052505050565b6000620002c862000228565b9050620002d6828262000286565b919050565b600067ffffffffffffffff821115620002f957620002f862000257565b5b620003048262000246565b9050602081019050919050565b60005b838110156200033157808201518184015260208101905062000314565b8381111562000341576000848401525b50505050565b60006200035e6200035884620002db565b620002bc565b9050828152602081018484840111156200037d576200037c62000241565b5b6200038a84828562000311565b509392505050565b600082601f830112620003aa57620003a96200023c565b5b8151620003bc84826020860162000347565b91505092915050565b60008060408385031215620003df57620003de62000232565b5b600083015167ffffffffffffffff8111156200040057620003ff62000237565b5b6200040e8582860162000392565b925050602083015167ffffffffffffffff81111562000432576200043162000237565b5b620004408582860162000392565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200049257607f821691505b602082108103620004a857620004a76200044a565b5b50919050565b612da680620004be6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610328578063b88d4fde14610344578063c87b56dd14610360578063dd4e9bad14610390578063e985e9c5146103ae578063f2fde38b146103de57610137565b80636352211e1461028257806370a08231146102b2578063715018a6146102e25780638da5cb5b146102ec57806395d89b411461030a57610137565b806318160ddd116100ff57806318160ddd146101f457806323b872dd1461021257806339a0c6f91461022e57806342842e0e1461024a57806346e4959d1461026657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba5780630b747d91146101d6575b600080fd5b6101566004803603810190610151919061213a565b6103fa565b6040516101639190612182565b60405180910390f35b6101746104dc565b6040516101819190612236565b60405180910390f35b6101a4600480360381019061019f919061228e565b61056e565b6040516101b191906122fc565b60405180910390f35b6101d460048036038101906101cf9190612343565b6105ea565b005b6101de6106f4565b6040516101eb919061239f565b60405180910390f35b6101fc610707565b60405161020991906123c9565b60405180910390f35b61022c600480360381019061022791906123e4565b61071e565b005b6102486004803603810190610243919061249c565b61072e565b005b610264600480360381019061025f91906123e4565b6107c0565b005b610280600480360381019061027b9190612595565b6107e0565b005b61029c6004803603810190610297919061228e565b61095c565b6040516102a991906122fc565b60405180910390f35b6102cc60048036038101906102c79190612616565b610972565b6040516102d991906123c9565b60405180910390f35b6102ea610a41565b005b6102f4610ac9565b60405161030191906122fc565b60405180910390f35b610312610af2565b60405161031f9190612236565b60405180910390f35b610342600480360381019061033d919061266f565b610b84565b005b61035e600480360381019061035991906127df565b610cfb565b005b61037a6004803603810190610375919061228e565b610d77565b6040516103879190612236565b60405180910390f35b610398610e15565b6040516103a59190612236565b60405180910390f35b6103c860048036038101906103c39190612862565b610ea3565b6040516103d59190612182565b60405180910390f35b6103f860048036038101906103f39190612616565b610f37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d557506104d48261102e565b5b9050919050565b6060600480546104eb906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610517906128d1565b80156105645780601f1061053957610100808354040283529160200191610564565b820191906000526020600020905b81548152906001019060200180831161054757829003601f168201915b5050505050905090565b600061057982611098565b6105af576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105f58261095c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661067b6110e6565b73ffffffffffffffffffffffffffffffffffffffff16141580156106ad57506106ab816106a66110e6565b610ea3565b155b156106e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ef8383836110ee565b505050565b600260009054906101000a900460ff1681565b60006107116111a0565b6003546001540303905090565b6107298383836111a5565b505050565b6107366110e6565b73ffffffffffffffffffffffffffffffffffffffff16610754610ac9565b73ffffffffffffffffffffffffffffffffffffffff16146107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a19061294e565b60405180910390fd5b8181600691906107bb929190611fe8565b505050565b6107db83838360405180602001604052806000815250610cfb565b505050565b6107e86110e6565b73ffffffffffffffffffffffffffffffffffffffff16610806610ac9565b73ffffffffffffffffffffffffffffffffffffffff161461085c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061294e565b60405180910390fd5b8181905084849050146108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089b906129ba565b60405180910390fd5b60005b8484905081101561090f576108fc8585838181106108c8576108c76129da565b5b90506020020160208101906108dd9190612616565b8484848181106108f0576108ef6129da565b5b90506020020135611659565b808061090790612a38565b9150506108a7565b506000600260009054906101000a900460ff1660ff1603610956576001436109379190612a80565b4060001c600260006101000a81548160ff021916908360ff1602179055505b50505050565b600061096782611934565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109d9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610a496110e6565b73ffffffffffffffffffffffffffffffffffffffff16610a67610ac9565b73ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061294e565b60405180910390fd5b610ac76000611bc3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610b01906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906128d1565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b610b8c6110e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bf0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000610bfd6110e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610caa6110e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610cef9190612182565b60405180910390a35050565b610d068484846111a5565b610d258373ffffffffffffffffffffffffffffffffffffffff16611c87565b8015610d3a5750610d3884848484611c9a565b155b15610d71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610d8282611098565b610db8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610dc2611dea565b90506000815103610de25760405180602001604052806000815250610e0d565b80610dec84611e7c565b604051602001610dfd929190612af0565b6040516020818303038152906040525b915050919050565b60068054610e22906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e906128d1565b8015610e9b5780601f10610e7057610100808354040283529160200191610e9b565b820191906000526020600020905b815481529060010190602001808311610e7e57829003601f168201915b505050505081565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f3f6110e6565b73ffffffffffffffffffffffffffffffffffffffff16610f5d610ac9565b73ffffffffffffffffffffffffffffffffffffffff1614610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa9061294e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990612b86565b60405180910390fd5b61102b81611bc3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816110a36111a0565b111580156110b2575060015482105b80156110df575060076000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006111b082611934565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461121b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661123c6110e6565b73ffffffffffffffffffffffffffffffffffffffff16148061126b575061126a856112656110e6565b610ea3565b5b806112b057506112796110e6565b73ffffffffffffffffffffffffffffffffffffffff166112988461056e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806112e9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361134f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61135c8585856001611fdc565b611368600084876110ee565b6001600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600760008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600760008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115e75760015482146115e657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116528585856001611fe2565b5050505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116c6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611700576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170d6000848385611fdc565b81600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826007600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426007600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036118b05781600181905550505061192f6000848385611fe2565b505050565b61193c61206e565b60008290508061194a6111a0565b11158015611959575060015481105b15611b8c576000600760008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611b8a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611a6e578092505050611bbe565b5b600115611b8957818060019003925050600760008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b84578092505050611bbe565b611a6f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cc06110e6565b8786866040518563ffffffff1660e01b8152600401611ce29493929190612bfb565b6020604051808303816000875af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b9190612c5c565b60015b611d97573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b506000815103611d8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060068054611df9906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e25906128d1565b8015611e725780601f10611e4757610100808354040283529160200191611e72565b820191906000526020600020905b815481529060010190602001808311611e5557829003601f168201915b5050505050905090565b606060008203611ec3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fd7565b600082905060005b60008214611ef5578080611ede90612a38565b915050600a82611eee9190612cb8565b9150611ecb565b60008167ffffffffffffffff811115611f1157611f106126b4565b5b6040519080825280601f01601f191660200182016040528015611f435781602001600182028036833780820191505090505b5090505b60008514611fd057600182611f5c9190612a80565b9150600a85611f6b9190612ce9565b6030611f779190612d1a565b60f81b818381518110611f8d57611f8c6129da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fc99190612cb8565b9450611f47565b8093505050505b919050565b50505050565b50505050565b828054611ff4906128d1565b90600052602060002090601f016020900481019282612016576000855561205d565b82601f1061202f57803560ff191683800117855561205d565b8280016001018555821561205d579182015b8281111561205c578235825591602001919060010190612041565b5b50905061206a91906120b1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156120ca5760008160009055506001016120b2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612117816120e2565b811461212257600080fd5b50565b6000813590506121348161210e565b92915050565b6000602082840312156121505761214f6120d8565b5b600061215e84828501612125565b91505092915050565b60008115159050919050565b61217c81612167565b82525050565b60006020820190506121976000830184612173565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d75780820151818401526020810190506121bc565b838111156121e6576000848401525b50505050565b6000601f19601f8301169050919050565b60006122088261219d565b61221281856121a8565b93506122228185602086016121b9565b61222b816121ec565b840191505092915050565b6000602082019050818103600083015261225081846121fd565b905092915050565b6000819050919050565b61226b81612258565b811461227657600080fd5b50565b60008135905061228881612262565b92915050565b6000602082840312156122a4576122a36120d8565b5b60006122b284828501612279565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e6826122bb565b9050919050565b6122f6816122db565b82525050565b600060208201905061231160008301846122ed565b92915050565b612320816122db565b811461232b57600080fd5b50565b60008135905061233d81612317565b92915050565b6000806040838503121561235a576123596120d8565b5b60006123688582860161232e565b925050602061237985828601612279565b9150509250929050565b600060ff82169050919050565b61239981612383565b82525050565b60006020820190506123b46000830184612390565b92915050565b6123c381612258565b82525050565b60006020820190506123de60008301846123ba565b92915050565b6000806000606084860312156123fd576123fc6120d8565b5b600061240b8682870161232e565b935050602061241c8682870161232e565b925050604061242d86828701612279565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261245c5761245b612437565b5b8235905067ffffffffffffffff8111156124795761247861243c565b5b60208301915083600182028301111561249557612494612441565b5b9250929050565b600080602083850312156124b3576124b26120d8565b5b600083013567ffffffffffffffff8111156124d1576124d06120dd565b5b6124dd85828601612446565b92509250509250929050565b60008083601f8401126124ff576124fe612437565b5b8235905067ffffffffffffffff81111561251c5761251b61243c565b5b60208301915083602082028301111561253857612537612441565b5b9250929050565b60008083601f84011261255557612554612437565b5b8235905067ffffffffffffffff8111156125725761257161243c565b5b60208301915083602082028301111561258e5761258d612441565b5b9250929050565b600080600080604085870312156125af576125ae6120d8565b5b600085013567ffffffffffffffff8111156125cd576125cc6120dd565b5b6125d9878288016124e9565b9450945050602085013567ffffffffffffffff8111156125fc576125fb6120dd565b5b6126088782880161253f565b925092505092959194509250565b60006020828403121561262c5761262b6120d8565b5b600061263a8482850161232e565b91505092915050565b61264c81612167565b811461265757600080fd5b50565b60008135905061266981612643565b92915050565b60008060408385031215612686576126856120d8565b5b60006126948582860161232e565b92505060206126a58582860161265a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126ec826121ec565b810181811067ffffffffffffffff8211171561270b5761270a6126b4565b5b80604052505050565b600061271e6120ce565b905061272a82826126e3565b919050565b600067ffffffffffffffff82111561274a576127496126b4565b5b612753826121ec565b9050602081019050919050565b82818337600083830152505050565b600061278261277d8461272f565b612714565b90508281526020810184848401111561279e5761279d6126af565b5b6127a9848285612760565b509392505050565b600082601f8301126127c6576127c5612437565b5b81356127d684826020860161276f565b91505092915050565b600080600080608085870312156127f9576127f86120d8565b5b60006128078782880161232e565b94505060206128188782880161232e565b935050604061282987828801612279565b925050606085013567ffffffffffffffff81111561284a576128496120dd565b5b612856878288016127b1565b91505092959194509250565b60008060408385031215612879576128786120d8565b5b60006128878582860161232e565b92505060206128988582860161232e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128e957607f821691505b6020821081036128fc576128fb6128a2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129386020836121a8565b915061294382612902565b602082019050919050565b600060208201905081810360008301526129678161292b565b9050919050565b7f696e76616c696420706172616d73000000000000000000000000000000000000600082015250565b60006129a4600e836121a8565b91506129af8261296e565b602082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4382612258565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a7557612a74612a09565b5b600182019050919050565b6000612a8b82612258565b9150612a9683612258565b925082821015612aa957612aa8612a09565b5b828203905092915050565b600081905092915050565b6000612aca8261219d565b612ad48185612ab4565b9350612ae48185602086016121b9565b80840191505092915050565b6000612afc8285612abf565b9150612b088284612abf565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b706026836121a8565b9150612b7b82612b14565b604082019050919050565b60006020820190508181036000830152612b9f81612b63565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612bcd82612ba6565b612bd78185612bb1565b9350612be78185602086016121b9565b612bf0816121ec565b840191505092915050565b6000608082019050612c1060008301876122ed565b612c1d60208301866122ed565b612c2a60408301856123ba565b8181036060830152612c3c8184612bc2565b905095945050505050565b600081519050612c568161210e565b92915050565b600060208284031215612c7257612c716120d8565b5b6000612c8084828501612c47565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cc382612258565b9150612cce83612258565b925082612cde57612cdd612c89565b5b828204905092915050565b6000612cf482612258565b9150612cff83612258565b925082612d0f57612d0e612c89565b5b828206905092915050565b6000612d2582612258565b9150612d3083612258565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d6557612d64612a09565b5b82820190509291505056fea2646970667358221220cdf13e7726461604138cacb947660b29fcc017be58c6bc22c1d745ff2d14272864736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001350696e65205069656365732047656e657369730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045050473100000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c80636352211e116100b8578063a22cb4651161007c578063a22cb46514610328578063b88d4fde14610344578063c87b56dd14610360578063dd4e9bad14610390578063e985e9c5146103ae578063f2fde38b146103de57610137565b80636352211e1461028257806370a08231146102b2578063715018a6146102e25780638da5cb5b146102ec57806395d89b411461030a57610137565b806318160ddd116100ff57806318160ddd146101f457806323b872dd1461021257806339a0c6f91461022e57806342842e0e1461024a57806346e4959d1461026657610137565b806301ffc9a71461013c57806306fdde031461016c578063081812fc1461018a578063095ea7b3146101ba5780630b747d91146101d6575b600080fd5b6101566004803603810190610151919061213a565b6103fa565b6040516101639190612182565b60405180910390f35b6101746104dc565b6040516101819190612236565b60405180910390f35b6101a4600480360381019061019f919061228e565b61056e565b6040516101b191906122fc565b60405180910390f35b6101d460048036038101906101cf9190612343565b6105ea565b005b6101de6106f4565b6040516101eb919061239f565b60405180910390f35b6101fc610707565b60405161020991906123c9565b60405180910390f35b61022c600480360381019061022791906123e4565b61071e565b005b6102486004803603810190610243919061249c565b61072e565b005b610264600480360381019061025f91906123e4565b6107c0565b005b610280600480360381019061027b9190612595565b6107e0565b005b61029c6004803603810190610297919061228e565b61095c565b6040516102a991906122fc565b60405180910390f35b6102cc60048036038101906102c79190612616565b610972565b6040516102d991906123c9565b60405180910390f35b6102ea610a41565b005b6102f4610ac9565b60405161030191906122fc565b60405180910390f35b610312610af2565b60405161031f9190612236565b60405180910390f35b610342600480360381019061033d919061266f565b610b84565b005b61035e600480360381019061035991906127df565b610cfb565b005b61037a6004803603810190610375919061228e565b610d77565b6040516103879190612236565b60405180910390f35b610398610e15565b6040516103a59190612236565b60405180910390f35b6103c860048036038101906103c39190612862565b610ea3565b6040516103d59190612182565b60405180910390f35b6103f860048036038101906103f39190612616565b610f37565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104c557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104d557506104d48261102e565b5b9050919050565b6060600480546104eb906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610517906128d1565b80156105645780601f1061053957610100808354040283529160200191610564565b820191906000526020600020905b81548152906001019060200180831161054757829003601f168201915b5050505050905090565b600061057982611098565b6105af576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006105f58261095c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361065c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661067b6110e6565b73ffffffffffffffffffffffffffffffffffffffff16141580156106ad57506106ab816106a66110e6565b610ea3565b155b156106e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106ef8383836110ee565b505050565b600260009054906101000a900460ff1681565b60006107116111a0565b6003546001540303905090565b6107298383836111a5565b505050565b6107366110e6565b73ffffffffffffffffffffffffffffffffffffffff16610754610ac9565b73ffffffffffffffffffffffffffffffffffffffff16146107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a19061294e565b60405180910390fd5b8181600691906107bb929190611fe8565b505050565b6107db83838360405180602001604052806000815250610cfb565b505050565b6107e86110e6565b73ffffffffffffffffffffffffffffffffffffffff16610806610ac9565b73ffffffffffffffffffffffffffffffffffffffff161461085c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108539061294e565b60405180910390fd5b8181905084849050146108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089b906129ba565b60405180910390fd5b60005b8484905081101561090f576108fc8585838181106108c8576108c76129da565b5b90506020020160208101906108dd9190612616565b8484848181106108f0576108ef6129da565b5b90506020020135611659565b808061090790612a38565b9150506108a7565b506000600260009054906101000a900460ff1660ff1603610956576001436109379190612a80565b4060001c600260006101000a81548160ff021916908360ff1602179055505b50505050565b600061096782611934565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109d9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610a496110e6565b73ffffffffffffffffffffffffffffffffffffffff16610a67610ac9565b73ffffffffffffffffffffffffffffffffffffffff1614610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab49061294e565b60405180910390fd5b610ac76000611bc3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610b01906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906128d1565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b610b8c6110e6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bf0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000610bfd6110e6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610caa6110e6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610cef9190612182565b60405180910390a35050565b610d068484846111a5565b610d258373ffffffffffffffffffffffffffffffffffffffff16611c87565b8015610d3a5750610d3884848484611c9a565b155b15610d71576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060610d8282611098565b610db8576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610dc2611dea565b90506000815103610de25760405180602001604052806000815250610e0d565b80610dec84611e7c565b604051602001610dfd929190612af0565b6040516020818303038152906040525b915050919050565b60068054610e22906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e906128d1565b8015610e9b5780601f10610e7057610100808354040283529160200191610e9b565b820191906000526020600020905b815481529060010190602001808311610e7e57829003601f168201915b505050505081565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610f3f6110e6565b73ffffffffffffffffffffffffffffffffffffffff16610f5d610ac9565b73ffffffffffffffffffffffffffffffffffffffff1614610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa9061294e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101990612b86565b60405180910390fd5b61102b81611bc3565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816110a36111a0565b111580156110b2575060015482105b80156110df575060076000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006111b082611934565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461121b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661123c6110e6565b73ffffffffffffffffffffffffffffffffffffffff16148061126b575061126a856112656110e6565b610ea3565b5b806112b057506112796110e6565b73ffffffffffffffffffffffffffffffffffffffff166112988461056e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806112e9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361134f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61135c8585856001611fdc565b611368600084876110ee565b6001600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600760008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600760008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036115e75760015482146115e657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116528585856001611fe2565b5050505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036116c6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611700576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61170d6000848385611fdc565b81600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550826007600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426007600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036118b05781600181905550505061192f6000848385611fe2565b505050565b61193c61206e565b60008290508061194a6111a0565b11158015611959575060015481105b15611b8c576000600760008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611b8a57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611a6e578092505050611bbe565b5b600115611b8957818060019003925050600760008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611b84578092505050611bbe565b611a6f565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611cc06110e6565b8786866040518563ffffffff1660e01b8152600401611ce29493929190612bfb565b6020604051808303816000875af1925050508015611d1e57506040513d601f19601f82011682018060405250810190611d1b9190612c5c565b60015b611d97573d8060008114611d4e576040519150601f19603f3d011682016040523d82523d6000602084013e611d53565b606091505b506000815103611d8f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060068054611df9906128d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611e25906128d1565b8015611e725780601f10611e4757610100808354040283529160200191611e72565b820191906000526020600020905b815481529060010190602001808311611e5557829003601f168201915b5050505050905090565b606060008203611ec3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fd7565b600082905060005b60008214611ef5578080611ede90612a38565b915050600a82611eee9190612cb8565b9150611ecb565b60008167ffffffffffffffff811115611f1157611f106126b4565b5b6040519080825280601f01601f191660200182016040528015611f435781602001600182028036833780820191505090505b5090505b60008514611fd057600182611f5c9190612a80565b9150600a85611f6b9190612ce9565b6030611f779190612d1a565b60f81b818381518110611f8d57611f8c6129da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611fc99190612cb8565b9450611f47565b8093505050505b919050565b50505050565b50505050565b828054611ff4906128d1565b90600052602060002090601f016020900481019282612016576000855561205d565b82601f1061202f57803560ff191683800117855561205d565b8280016001018555821561205d579182015b8281111561205c578235825591602001919060010190612041565b5b50905061206a91906120b1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156120ca5760008160009055506001016120b2565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612117816120e2565b811461212257600080fd5b50565b6000813590506121348161210e565b92915050565b6000602082840312156121505761214f6120d8565b5b600061215e84828501612125565b91505092915050565b60008115159050919050565b61217c81612167565b82525050565b60006020820190506121976000830184612173565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156121d75780820151818401526020810190506121bc565b838111156121e6576000848401525b50505050565b6000601f19601f8301169050919050565b60006122088261219d565b61221281856121a8565b93506122228185602086016121b9565b61222b816121ec565b840191505092915050565b6000602082019050818103600083015261225081846121fd565b905092915050565b6000819050919050565b61226b81612258565b811461227657600080fd5b50565b60008135905061228881612262565b92915050565b6000602082840312156122a4576122a36120d8565b5b60006122b284828501612279565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122e6826122bb565b9050919050565b6122f6816122db565b82525050565b600060208201905061231160008301846122ed565b92915050565b612320816122db565b811461232b57600080fd5b50565b60008135905061233d81612317565b92915050565b6000806040838503121561235a576123596120d8565b5b60006123688582860161232e565b925050602061237985828601612279565b9150509250929050565b600060ff82169050919050565b61239981612383565b82525050565b60006020820190506123b46000830184612390565b92915050565b6123c381612258565b82525050565b60006020820190506123de60008301846123ba565b92915050565b6000806000606084860312156123fd576123fc6120d8565b5b600061240b8682870161232e565b935050602061241c8682870161232e565b925050604061242d86828701612279565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261245c5761245b612437565b5b8235905067ffffffffffffffff8111156124795761247861243c565b5b60208301915083600182028301111561249557612494612441565b5b9250929050565b600080602083850312156124b3576124b26120d8565b5b600083013567ffffffffffffffff8111156124d1576124d06120dd565b5b6124dd85828601612446565b92509250509250929050565b60008083601f8401126124ff576124fe612437565b5b8235905067ffffffffffffffff81111561251c5761251b61243c565b5b60208301915083602082028301111561253857612537612441565b5b9250929050565b60008083601f84011261255557612554612437565b5b8235905067ffffffffffffffff8111156125725761257161243c565b5b60208301915083602082028301111561258e5761258d612441565b5b9250929050565b600080600080604085870312156125af576125ae6120d8565b5b600085013567ffffffffffffffff8111156125cd576125cc6120dd565b5b6125d9878288016124e9565b9450945050602085013567ffffffffffffffff8111156125fc576125fb6120dd565b5b6126088782880161253f565b925092505092959194509250565b60006020828403121561262c5761262b6120d8565b5b600061263a8482850161232e565b91505092915050565b61264c81612167565b811461265757600080fd5b50565b60008135905061266981612643565b92915050565b60008060408385031215612686576126856120d8565b5b60006126948582860161232e565b92505060206126a58582860161265a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6126ec826121ec565b810181811067ffffffffffffffff8211171561270b5761270a6126b4565b5b80604052505050565b600061271e6120ce565b905061272a82826126e3565b919050565b600067ffffffffffffffff82111561274a576127496126b4565b5b612753826121ec565b9050602081019050919050565b82818337600083830152505050565b600061278261277d8461272f565b612714565b90508281526020810184848401111561279e5761279d6126af565b5b6127a9848285612760565b509392505050565b600082601f8301126127c6576127c5612437565b5b81356127d684826020860161276f565b91505092915050565b600080600080608085870312156127f9576127f86120d8565b5b60006128078782880161232e565b94505060206128188782880161232e565b935050604061282987828801612279565b925050606085013567ffffffffffffffff81111561284a576128496120dd565b5b612856878288016127b1565b91505092959194509250565b60008060408385031215612879576128786120d8565b5b60006128878582860161232e565b92505060206128988582860161232e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806128e957607f821691505b6020821081036128fc576128fb6128a2565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006129386020836121a8565b915061294382612902565b602082019050919050565b600060208201905081810360008301526129678161292b565b9050919050565b7f696e76616c696420706172616d73000000000000000000000000000000000000600082015250565b60006129a4600e836121a8565b91506129af8261296e565b602082019050919050565b600060208201905081810360008301526129d381612997565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612a4382612258565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a7557612a74612a09565b5b600182019050919050565b6000612a8b82612258565b9150612a9683612258565b925082821015612aa957612aa8612a09565b5b828203905092915050565b600081905092915050565b6000612aca8261219d565b612ad48185612ab4565b9350612ae48185602086016121b9565b80840191505092915050565b6000612afc8285612abf565b9150612b088284612abf565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612b706026836121a8565b9150612b7b82612b14565b604082019050919050565b60006020820190508181036000830152612b9f81612b63565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612bcd82612ba6565b612bd78185612bb1565b9350612be78185602086016121b9565b612bf0816121ec565b840191505092915050565b6000608082019050612c1060008301876122ed565b612c1d60208301866122ed565b612c2a60408301856123ba565b8181036060830152612c3c8184612bc2565b905095945050505050565b600081519050612c568161210e565b92915050565b600060208284031215612c7257612c716120d8565b5b6000612c8084828501612c47565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612cc382612258565b9150612cce83612258565b925082612cde57612cdd612c89565b5b828204905092915050565b6000612cf482612258565b9150612cff83612258565b925082612d0f57612d0e612c89565b5b828206905092915050565b6000612d2582612258565b9150612d3083612258565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d6557612d64612a09565b5b82820190509291505056fea2646970667358221220cdf13e7726461604138cacb947660b29fcc017be58c6bc22c1d745ff2d14272864736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001350696e65205069656365732047656e657369730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045050473100000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Pine Pieces Genesis
Arg [1] : symbol_ (string): PPG1

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [3] : 50696e65205069656365732047656e6573697300000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 5050473100000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

23442:22592:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26816:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29929:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31447:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31010:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24638:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26065:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32312:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24885:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32553:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45646:385;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29737:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27185:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4730:103;;;:::i;:::-;;4079:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30098:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31723:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32809:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30273:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24845:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32081:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4988:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26816:305;26918:4;26970:25;26955:40;;;:11;:40;;;;:105;;;;27027:33;27012:48;;;:11;:48;;;;26955:105;:158;;;;27077:36;27101:11;27077:23;:36::i;:::-;26955:158;26935:178;;26816:305;;;:::o;29929:100::-;29983:13;30016:5;30009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29929:100;:::o;31447:204::-;31515:7;31540:16;31548:7;31540;:16::i;:::-;31535:64;;31565:34;;;;;;;;;;;;;;31535:64;31619:15;:24;31635:7;31619:24;;;;;;;;;;;;;;;;;;;;;31612:31;;31447:204;;;:::o;31010:371::-;31083:13;31099:24;31115:7;31099:15;:24::i;:::-;31083:40;;31144:5;31138:11;;:2;:11;;;31134:48;;31158:24;;;;;;;;;;;;;;31134:48;31215:5;31199:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31225:37;31242:5;31249:12;:10;:12::i;:::-;31225:16;:37::i;:::-;31224:38;31199:63;31195:138;;;31286:35;;;;;;;;;;;;;;31195:138;31345:28;31354:2;31358:7;31367:5;31345:8;:28::i;:::-;31072:309;31010:371;;:::o;24638:23::-;;;;;;;;;;;;;:::o;26065:303::-;26109:7;26334:15;:13;:15::i;:::-;26319:12;;26303:13;;:28;:46;26296:53;;26065:303;:::o;32312:170::-;32446:28;32456:4;32462:2;32466:7;32446:9;:28::i;:::-;32312:170;;;:::o;24885:107::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24979:5:::1;;24959:17;:25;;;;;;;:::i;:::-;;24885:107:::0;;:::o;32553:185::-;32691:39;32708:4;32714:2;32718:7;32691:39;;;;;;;;;;;;:16;:39::i;:::-;32553:185;;;:::o;45646:385::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45779:10:::1;;:17;;45759:9;;:16;;:37;45751:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45831:6;45826:105;45847:9;;:16;;45843:1;:20;45826:105;;;45885:34;45891:9;;45901:1;45891:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;45905:10;;45916:1;45905:13;;;;;;;:::i;:::-;;;;;;;;45885:5;:34::i;:::-;45865:3;;;;;:::i;:::-;;;;45826:105;;;;45959:1;45945:10;;;;;;;;;;;:15;;::::0;45941:82:::1;;46018:1;46003:12;:16;;;;:::i;:::-;45993:27;45988:33;;45962:10;;:61;;;;;;;;;;;;;;;;;;45941:82;45646:385:::0;;;;:::o;29737:125::-;29801:7;29828:21;29841:7;29828:12;:21::i;:::-;:26;;;29821:33;;29737:125;;;:::o;27185:206::-;27249:7;27290:1;27273:19;;:5;:19;;;27269:60;;27301:28;;;;;;;;;;;;;;27269:60;27355:12;:19;27368:5;27355:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27347:36;;27340:43;;27185:206;;;:::o;4730:103::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;4079:87::-;4125:7;4152:6;;;;;;;;;;;4145:13;;4079:87;:::o;30098:104::-;30154:13;30187:7;30180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30098:104;:::o;31723:287::-;31834:12;:10;:12::i;:::-;31822:24;;:8;:24;;;31818:54;;31855:17;;;;;;;;;;;;;;31818:54;31930:8;31885:18;:32;31904:12;:10;:12::i;:::-;31885:32;;;;;;;;;;;;;;;:42;31918:8;31885:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31983:8;31954:48;;31969:12;:10;:12::i;:::-;31954:48;;;31993:8;31954:48;;;;;;:::i;:::-;;;;;;;;31723:287;;:::o;32809:369::-;32976:28;32986:4;32992:2;32996:7;32976:9;:28::i;:::-;33019:15;:2;:13;;;:15::i;:::-;:76;;;;;33039:56;33070:4;33076:2;33080:7;33089:5;33039:30;:56::i;:::-;33038:57;33019:76;33015:156;;;33119:40;;;;;;;;;;;;;;33015:156;32809:369;;;;:::o;30273:318::-;30346:13;30377:16;30385:7;30377;:16::i;:::-;30372:59;;30402:29;;;;;;;;;;;;;;30372:59;30444:21;30468:10;:8;:10::i;:::-;30444:34;;30521:1;30502:7;30496:21;:26;:87;;;;;;;;;;;;;;;;;30549:7;30558:18;:7;:16;:18::i;:::-;30532:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30496:87;30489:94;;;30273:318;;;:::o;24845:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32081:164::-;32178:4;32202:18;:25;32221:5;32202:25;;;;;;;;;;;;;;;:35;32228:8;32202:35;;;;;;;;;;;;;;;;;;;;;;;;;32195:42;;32081:164;;;;:::o;4988:201::-;4310:12;:10;:12::i;:::-;4299:23;;:7;:5;:7::i;:::-;:23;;;4291:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5097:1:::1;5077:22;;:8;:22;;::::0;5069:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;16511:157::-;16596:4;16635:25;16620:40;;;:11;:40;;;;16613:47;;16511:157;;;:::o;33433:174::-;33490:4;33533:7;33514:15;:13;:15::i;:::-;:26;;:53;;;;;33554:13;;33544:7;:23;33514:53;:85;;;;;33572:11;:20;33584:7;33572:20;;;;;;;;;;;:27;;;;;;;;;;;;33571:28;33514:85;33507:92;;33433:174;;;:::o;2803:98::-;2856:7;2883:10;2876:17;;2803:98;:::o;42659:196::-;42801:2;42774:15;:24;42790:7;42774:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42839:7;42835:2;42819:28;;42828:5;42819:28;;;;;;;;;;;;42659:196;;;:::o;25839:92::-;25895:7;25839:92;:::o;37607:2130::-;37722:35;37760:21;37773:7;37760:12;:21::i;:::-;37722:59;;37820:4;37798:26;;:13;:18;;;:26;;;37794:67;;37833:28;;;;;;;;;;;;;;37794:67;37874:22;37916:4;37900:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;37937:36;37954:4;37960:12;:10;:12::i;:::-;37937:16;:36::i;:::-;37900:73;:126;;;;38014:12;:10;:12::i;:::-;37990:36;;:20;38002:7;37990:11;:20::i;:::-;:36;;;37900:126;37874:153;;38045:17;38040:66;;38071:35;;;;;;;;;;;;;;38040:66;38135:1;38121:16;;:2;:16;;;38117:52;;38146:23;;;;;;;;;;;;;;38117:52;38182:43;38204:4;38210:2;38214:7;38223:1;38182:21;:43::i;:::-;38290:35;38307:1;38311:7;38320:4;38290:8;:35::i;:::-;38651:1;38621:12;:18;38634:4;38621:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38695:1;38667:12;:16;38680:2;38667:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38713:31;38747:11;:20;38759:7;38747:20;;;;;;;;;;;38713:54;;38798:2;38782:8;:13;;;:18;;;;;;;;;;;;;;;;;;38848:15;38815:8;:23;;;:49;;;;;;;;;;;;;;;;;;39116:19;39148:1;39138:7;:11;39116:33;;39164:31;39198:11;:24;39210:11;39198:24;;;;;;;;;;;39164:58;;39266:1;39241:27;;:8;:13;;;;;;;;;;;;:27;;;39237:384;;39451:13;;39436:11;:28;39432:174;;39505:4;39489:8;:13;;;:20;;;;;;;;;;;;;;;;;;39558:13;:28;;;39532:8;:23;;;:54;;;;;;;;;;;;;;;;;;39432:174;39237:384;38596:1036;;;39668:7;39664:2;39649:27;;39658:4;39649:27;;;;;;;;;;;;39687:42;39708:4;39714:2;39718:7;39727:1;39687:20;:42::i;:::-;37711:2026;;37607:2130;;;:::o;36179:1174::-;36244:20;36267:13;;36244:36;;36309:1;36295:16;;:2;:16;;;36291:48;;36320:19;;;;;;;;;;;;;;36291:48;36366:1;36354:8;:13;36350:44;;36376:18;;;;;;;;;;;;;;36350:44;36407:61;36437:1;36441:2;36445:12;36459:8;36407:21;:61::i;:::-;36780:8;36745:12;:16;36758:2;36745:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36844:8;36804:12;:16;36817:2;36804:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36903:2;36870:11;:25;36882:12;36870:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36970:15;36920:11;:25;36932:12;36920:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37003:20;37026:12;37003:35;;37053:11;37082:8;37067:12;:23;37053:37;;37107:112;37159:14;;;;;;37155:2;37134:40;;37151:1;37134:40;;;;;;;;;;;;37214:3;37198:12;:19;37107:112;;37251:12;37235:13;:28;;;;36720:555;;37285:60;37314:1;37318:2;37322:12;37336:8;37285:20;:60::i;:::-;36233:1120;36179:1174;;:::o;28566:1109::-;28628:21;;:::i;:::-;28662:12;28677:7;28662:22;;28745:4;28726:15;:13;:15::i;:::-;:23;;:47;;;;;28760:13;;28753:4;:20;28726:47;28722:886;;;28794:31;28828:11;:17;28840:4;28828:17;;;;;;;;;;;28794:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28869:9;:16;;;28864:729;;28940:1;28914:28;;:9;:14;;;:28;;;28910:101;;28978:9;28971:16;;;;;;28910:101;29313:261;29320:4;29313:261;;;29353:6;;;;;;;;29398:11;:17;29410:4;29398:17;;;;;;;;;;;29386:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29472:1;29446:28;;:9;:14;;;:28;;;29442:109;;29514:9;29507:16;;;;;;29442:109;29313:261;;;28864:729;28775:833;28722:886;29636:31;;;;;;;;;;;;;;28566:1109;;;;:::o;5349:191::-;5423:16;5442:6;;;;;;;;;;;5423:25;;5468:8;5459:6;;:17;;;;;;;;;;;;;;;;;;5523:8;5492:40;;5513:8;5492:40;;;;;;;;;;;;5412:128;5349:191;:::o;6367:387::-;6427:4;6635:12;6702:7;6690:20;6682:28;;6745:1;6738:4;:8;6731:15;;;6367:387;;;:::o;43347:667::-;43510:4;43547:2;43531:36;;;43568:12;:10;:12::i;:::-;43582:4;43588:7;43597:5;43531:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43527:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43782:1;43765:6;:13;:18;43761:235;;43811:40;;;;;;;;;;;;;;43761:235;43954:6;43948:13;43939:6;43935:2;43931:15;43924:38;43527:480;43660:45;;;43650:55;;;:6;:55;;;;43643:62;;;43347:667;;;;;;:::o;30839:109::-;30890:13;30923:17;30916:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30839:109;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;44662:159::-;;;;;:::o;45480:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:86::-;4973:7;5013:4;5006:5;5002:16;4991:27;;4938:86;;;:::o;5030:112::-;5113:22;5129:5;5113:22;:::i;:::-;5108:3;5101:35;5030:112;;:::o;5148:214::-;5237:4;5275:2;5264:9;5260:18;5252:26;;5288:67;5352:1;5341:9;5337:17;5328:6;5288:67;:::i;:::-;5148:214;;;;:::o;5368:118::-;5455:24;5473:5;5455:24;:::i;:::-;5450:3;5443:37;5368:118;;:::o;5492:222::-;5585:4;5623:2;5612:9;5608:18;5600:26;;5636:71;5704:1;5693:9;5689:17;5680:6;5636:71;:::i;:::-;5492:222;;;;:::o;5720:619::-;5797:6;5805;5813;5862:2;5850:9;5841:7;5837:23;5833:32;5830:119;;;5868:79;;:::i;:::-;5830:119;5988:1;6013:53;6058:7;6049:6;6038:9;6034:22;6013:53;:::i;:::-;6003:63;;5959:117;6115:2;6141:53;6186:7;6177:6;6166:9;6162:22;6141:53;:::i;:::-;6131:63;;6086:118;6243:2;6269:53;6314:7;6305:6;6294:9;6290:22;6269:53;:::i;:::-;6259:63;;6214:118;5720:619;;;;;:::o;6345:117::-;6454:1;6451;6444:12;6468:117;6577:1;6574;6567:12;6591:117;6700:1;6697;6690:12;6728:553;6786:8;6796:6;6846:3;6839:4;6831:6;6827:17;6823:27;6813:122;;6854:79;;:::i;:::-;6813:122;6967:6;6954:20;6944:30;;6997:18;6989:6;6986:30;6983:117;;;7019:79;;:::i;:::-;6983:117;7133:4;7125:6;7121:17;7109:29;;7187:3;7179:4;7171:6;7167:17;7157:8;7153:32;7150:41;7147:128;;;7194:79;;:::i;:::-;7147:128;6728:553;;;;;:::o;7287:529::-;7358:6;7366;7415:2;7403:9;7394:7;7390:23;7386:32;7383:119;;;7421:79;;:::i;:::-;7383:119;7569:1;7558:9;7554:17;7541:31;7599:18;7591:6;7588:30;7585:117;;;7621:79;;:::i;:::-;7585:117;7734:65;7791:7;7782:6;7771:9;7767:22;7734:65;:::i;:::-;7716:83;;;;7512:297;7287:529;;;;;:::o;7839:568::-;7912:8;7922:6;7972:3;7965:4;7957:6;7953:17;7949:27;7939:122;;7980:79;;:::i;:::-;7939:122;8093:6;8080:20;8070:30;;8123:18;8115:6;8112:30;8109:117;;;8145:79;;:::i;:::-;8109:117;8259:4;8251:6;8247:17;8235:29;;8313:3;8305:4;8297:6;8293:17;8283:8;8279:32;8276:41;8273:128;;;8320:79;;:::i;:::-;8273:128;7839:568;;;;;:::o;8430:::-;8503:8;8513:6;8563:3;8556:4;8548:6;8544:17;8540:27;8530:122;;8571:79;;:::i;:::-;8530:122;8684:6;8671:20;8661:30;;8714:18;8706:6;8703:30;8700:117;;;8736:79;;:::i;:::-;8700:117;8850:4;8842:6;8838:17;8826:29;;8904:3;8896:4;8888:6;8884:17;8874:8;8870:32;8867:41;8864:128;;;8911:79;;:::i;:::-;8864:128;8430:568;;;;;:::o;9004:934::-;9126:6;9134;9142;9150;9199:2;9187:9;9178:7;9174:23;9170:32;9167:119;;;9205:79;;:::i;:::-;9167:119;9353:1;9342:9;9338:17;9325:31;9383:18;9375:6;9372:30;9369:117;;;9405:79;;:::i;:::-;9369:117;9518:80;9590:7;9581:6;9570:9;9566:22;9518:80;:::i;:::-;9500:98;;;;9296:312;9675:2;9664:9;9660:18;9647:32;9706:18;9698:6;9695:30;9692:117;;;9728:79;;:::i;:::-;9692:117;9841:80;9913:7;9904:6;9893:9;9889:22;9841:80;:::i;:::-;9823:98;;;;9618:313;9004:934;;;;;;;:::o;9944:329::-;10003:6;10052:2;10040:9;10031:7;10027:23;10023:32;10020:119;;;10058:79;;:::i;:::-;10020:119;10178:1;10203:53;10248:7;10239:6;10228:9;10224:22;10203:53;:::i;:::-;10193:63;;10149:117;9944:329;;;;:::o;10279:116::-;10349:21;10364:5;10349:21;:::i;:::-;10342:5;10339:32;10329:60;;10385:1;10382;10375:12;10329:60;10279:116;:::o;10401:133::-;10444:5;10482:6;10469:20;10460:29;;10498:30;10522:5;10498:30;:::i;:::-;10401:133;;;;:::o;10540:468::-;10605:6;10613;10662:2;10650:9;10641:7;10637:23;10633:32;10630:119;;;10668:79;;:::i;:::-;10630:119;10788:1;10813:53;10858:7;10849:6;10838:9;10834:22;10813:53;:::i;:::-;10803:63;;10759:117;10915:2;10941:50;10983:7;10974:6;10963:9;10959:22;10941:50;:::i;:::-;10931:60;;10886:115;10540:468;;;;;:::o;11014:117::-;11123:1;11120;11113:12;11137:180;11185:77;11182:1;11175:88;11282:4;11279:1;11272:15;11306:4;11303:1;11296:15;11323:281;11406:27;11428:4;11406:27;:::i;:::-;11398:6;11394:40;11536:6;11524:10;11521:22;11500:18;11488:10;11485:34;11482:62;11479:88;;;11547:18;;:::i;:::-;11479:88;11587:10;11583:2;11576:22;11366:238;11323:281;;:::o;11610:129::-;11644:6;11671:20;;:::i;:::-;11661:30;;11700:33;11728:4;11720:6;11700:33;:::i;:::-;11610:129;;;:::o;11745:307::-;11806:4;11896:18;11888:6;11885:30;11882:56;;;11918:18;;:::i;:::-;11882:56;11956:29;11978:6;11956:29;:::i;:::-;11948:37;;12040:4;12034;12030:15;12022:23;;11745:307;;;:::o;12058:154::-;12142:6;12137:3;12132;12119:30;12204:1;12195:6;12190:3;12186:16;12179:27;12058:154;;;:::o;12218:410::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:41;12615:6;12610:3;12605;12581:41;:::i;:::-;12301:327;12218:410;;;;;:::o;12647:338::-;12702:5;12751:3;12744:4;12736:6;12732:17;12728:27;12718:122;;12759:79;;:::i;:::-;12718:122;12876:6;12863:20;12901:78;12975:3;12967:6;12960:4;12952:6;12948:17;12901:78;:::i;:::-;12892:87;;12708:277;12647:338;;;;:::o;12991:943::-;13086:6;13094;13102;13110;13159:3;13147:9;13138:7;13134:23;13130:33;13127:120;;;13166:79;;:::i;:::-;13127:120;13286:1;13311:53;13356:7;13347:6;13336:9;13332:22;13311:53;:::i;:::-;13301:63;;13257:117;13413:2;13439:53;13484:7;13475:6;13464:9;13460:22;13439:53;:::i;:::-;13429:63;;13384:118;13541:2;13567:53;13612:7;13603:6;13592:9;13588:22;13567:53;:::i;:::-;13557:63;;13512:118;13697:2;13686:9;13682:18;13669:32;13728:18;13720:6;13717:30;13714:117;;;13750:79;;:::i;:::-;13714:117;13855:62;13909:7;13900:6;13889:9;13885:22;13855:62;:::i;:::-;13845:72;;13640:287;12991:943;;;;;;;:::o;13940:474::-;14008:6;14016;14065:2;14053:9;14044:7;14040:23;14036:32;14033:119;;;14071:79;;:::i;:::-;14033:119;14191:1;14216:53;14261:7;14252:6;14241:9;14237:22;14216:53;:::i;:::-;14206:63;;14162:117;14318:2;14344:53;14389:7;14380:6;14369:9;14365:22;14344:53;:::i;:::-;14334:63;;14289:118;13940:474;;;;;:::o;14420:180::-;14468:77;14465:1;14458:88;14565:4;14562:1;14555:15;14589:4;14586:1;14579:15;14606:320;14650:6;14687:1;14681:4;14677:12;14667:22;;14734:1;14728:4;14724:12;14755:18;14745:81;;14811:4;14803:6;14799:17;14789:27;;14745:81;14873:2;14865:6;14862:14;14842:18;14839:38;14836:84;;14892:18;;:::i;:::-;14836:84;14657:269;14606:320;;;:::o;14932:182::-;15072:34;15068:1;15060:6;15056:14;15049:58;14932:182;:::o;15120:366::-;15262:3;15283:67;15347:2;15342:3;15283:67;:::i;:::-;15276:74;;15359:93;15448:3;15359:93;:::i;:::-;15477:2;15472:3;15468:12;15461:19;;15120:366;;;:::o;15492:419::-;15658:4;15696:2;15685:9;15681:18;15673:26;;15745:9;15739:4;15735:20;15731:1;15720:9;15716:17;15709:47;15773:131;15899:4;15773:131;:::i;:::-;15765:139;;15492:419;;;:::o;15917:164::-;16057:16;16053:1;16045:6;16041:14;16034:40;15917:164;:::o;16087:366::-;16229:3;16250:67;16314:2;16309:3;16250:67;:::i;:::-;16243:74;;16326:93;16415:3;16326:93;:::i;:::-;16444:2;16439:3;16435:12;16428:19;;16087:366;;;:::o;16459:419::-;16625:4;16663:2;16652:9;16648:18;16640:26;;16712:9;16706:4;16702:20;16698:1;16687:9;16683:17;16676:47;16740:131;16866:4;16740:131;:::i;:::-;16732:139;;16459:419;;;:::o;16884:180::-;16932:77;16929:1;16922:88;17029:4;17026:1;17019:15;17053:4;17050:1;17043:15;17070:180;17118:77;17115:1;17108:88;17215:4;17212:1;17205:15;17239:4;17236:1;17229:15;17256:233;17295:3;17318:24;17336:5;17318:24;:::i;:::-;17309:33;;17364:66;17357:5;17354:77;17351:103;;17434:18;;:::i;:::-;17351:103;17481:1;17474:5;17470:13;17463:20;;17256:233;;;:::o;17495:191::-;17535:4;17555:20;17573:1;17555:20;:::i;:::-;17550:25;;17589:20;17607:1;17589:20;:::i;:::-;17584:25;;17628:1;17625;17622:8;17619:34;;;17633:18;;:::i;:::-;17619:34;17678:1;17675;17671:9;17663:17;;17495:191;;;;:::o;17692:148::-;17794:11;17831:3;17816:18;;17692:148;;;;:::o;17846:377::-;17952:3;17980:39;18013:5;17980:39;:::i;:::-;18035:89;18117:6;18112:3;18035:89;:::i;:::-;18028:96;;18133:52;18178:6;18173:3;18166:4;18159:5;18155:16;18133:52;:::i;:::-;18210:6;18205:3;18201:16;18194:23;;17956:267;17846:377;;;;:::o;18229:435::-;18409:3;18431:95;18522:3;18513:6;18431:95;:::i;:::-;18424:102;;18543:95;18634:3;18625:6;18543:95;:::i;:::-;18536:102;;18655:3;18648:10;;18229:435;;;;;:::o;18670:225::-;18810:34;18806:1;18798:6;18794:14;18787:58;18879:8;18874:2;18866:6;18862:15;18855:33;18670:225;:::o;18901:366::-;19043:3;19064:67;19128:2;19123:3;19064:67;:::i;:::-;19057:74;;19140:93;19229:3;19140:93;:::i;:::-;19258:2;19253:3;19249:12;19242:19;;18901:366;;;:::o;19273:419::-;19439:4;19477:2;19466:9;19462:18;19454:26;;19526:9;19520:4;19516:20;19512:1;19501:9;19497:17;19490:47;19554:131;19680:4;19554:131;:::i;:::-;19546:139;;19273:419;;;:::o;19698:98::-;19749:6;19783:5;19777:12;19767:22;;19698:98;;;:::o;19802:168::-;19885:11;19919:6;19914:3;19907:19;19959:4;19954:3;19950:14;19935:29;;19802:168;;;;:::o;19976:360::-;20062:3;20090:38;20122:5;20090:38;:::i;:::-;20144:70;20207:6;20202:3;20144:70;:::i;:::-;20137:77;;20223:52;20268:6;20263:3;20256:4;20249:5;20245:16;20223:52;:::i;:::-;20300:29;20322:6;20300:29;:::i;:::-;20295:3;20291:39;20284:46;;20066:270;19976:360;;;;:::o;20342:640::-;20537:4;20575:3;20564:9;20560:19;20552:27;;20589:71;20657:1;20646:9;20642:17;20633:6;20589:71;:::i;:::-;20670:72;20738:2;20727:9;20723:18;20714:6;20670:72;:::i;:::-;20752;20820:2;20809:9;20805:18;20796:6;20752:72;:::i;:::-;20871:9;20865:4;20861:20;20856:2;20845:9;20841:18;20834:48;20899:76;20970:4;20961:6;20899:76;:::i;:::-;20891:84;;20342:640;;;;;;;:::o;20988:141::-;21044:5;21075:6;21069:13;21060:22;;21091:32;21117:5;21091:32;:::i;:::-;20988:141;;;;:::o;21135:349::-;21204:6;21253:2;21241:9;21232:7;21228:23;21224:32;21221:119;;;21259:79;;:::i;:::-;21221:119;21379:1;21404:63;21459:7;21450:6;21439:9;21435:22;21404:63;:::i;:::-;21394:73;;21350:127;21135:349;;;;:::o;21490:180::-;21538:77;21535:1;21528:88;21635:4;21632:1;21625:15;21659:4;21656:1;21649:15;21676:185;21716:1;21733:20;21751:1;21733:20;:::i;:::-;21728:25;;21767:20;21785:1;21767:20;:::i;:::-;21762:25;;21806:1;21796:35;;21811:18;;:::i;:::-;21796:35;21853:1;21850;21846:9;21841:14;;21676:185;;;;:::o;21867:176::-;21899:1;21916:20;21934:1;21916:20;:::i;:::-;21911:25;;21950:20;21968:1;21950:20;:::i;:::-;21945:25;;21989:1;21979:35;;21994:18;;:::i;:::-;21979:35;22035:1;22032;22028:9;22023:14;;21867:176;;;;:::o;22049:305::-;22089:3;22108:20;22126:1;22108:20;:::i;:::-;22103:25;;22142:20;22160:1;22142:20;:::i;:::-;22137:25;;22296:1;22228:66;22224:74;22221:1;22218:81;22215:107;;;22302:18;;:::i;:::-;22215:107;22346:1;22343;22339:9;22332:16;;22049:305;;;;:::o

Swarm Source

ipfs://cdf13e7726461604138cacb947660b29fcc017be58c6bc22c1d745ff2d142728
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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