ETH Price: $3,635.05 (+9.40%)

Token

Crypto Alpha Island (CAISLAND)
 

Overview

Max Total Supply

1,810 CAISLAND

Holders

192

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 CAISLAND
0x714cd8718adc069bf23119c70b7dc093ad949e8f
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:
CryptoAlphaIsland

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 15 : CryptoAlphaIsland.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
import "erc721a/contracts/ERC721A.sol";
import "erc721a/contracts/extensions/ERC721AQueryable.sol";
import "erc721a/contracts/extensions/ERC4907A.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/common/ERC2981.sol";

/**
 * @author Created with HeyMint Launchpad https://launchpad.heymint.xyz
 * @notice This contract handles minting Crypto Alpha Island  tokens.
 */
contract CryptoAlphaIsland is
    ERC721A,
    ERC721AQueryable,
    ERC4907A,
    Ownable,
    Pausable,
    ReentrancyGuard,
    ERC2981
{
    // Address of the smart contract used to check if an operator address is from a blocklisted exchange
    address public blocklistContractAddress;
    address public royaltyAddress = 0x662247835bBaa47Ab2A241fCAb073dB4f2D2A1EF;
    address[] public payoutAddresses = [
        0x662247835bBaa47Ab2A241fCAb073dB4f2D2A1EF
    ];
    // Permanently disable the blocklist so all exchanges are allowed
    bool public blocklistPermanentlyDisabled = false;
    bool public isPublicSaleActive = false;
    // Permanently freezes metadata so it can never be changed
    bool public metadataFrozen = false;
    // If true, payout addresses and basis points are permanently frozen and can never be updated
    bool public payoutAddressesFrozen = false;
    // If true, the exchange represented by a uint256 integer is blocklisted and cannot be used to transfer tokens
    mapping(uint256 => bool) public isExchangeBlocklisted;
    string public baseTokenURI =
        "ipfs://bafybeiendwkoxlvfgf7yjeh4v5uubfdp6mee5ynwg75xtknv7ugcufc7dq/";
    // Maximum supply of tokens that can be minted
    uint256 public constant MAX_SUPPLY = 3333;
    uint256 public publicMintsAllowedPerAddress = 10;
    uint256 public publicMintsAllowedPerTransaction = 10;
    uint256 public publicPrice = 0.0055 ether;
    // The respective share of funds to be sent to each address in payoutAddresses in basis points
    uint256[] public payoutBasisPoints = [10000];
    uint96 public royaltyFee = 750;

    constructor(address _blocklistContractAddress)
        ERC721A("Crypto Alpha Island ", "CAISLAND")
    {
        blocklistContractAddress = _blocklistContractAddress;
        _setDefaultRoyalty(royaltyAddress, royaltyFee);
        require(
            payoutAddresses.length == payoutBasisPoints.length,
            "PAYOUT_ADDRESSES_AND_PAYOUT_BASIS_POINTS_MUST_BE_SAME_LENGTH"
        );
        uint256 totalPayoutBasisPoints = 0;
        for (uint256 i = 0; i < payoutBasisPoints.length; i++) {
            totalPayoutBasisPoints += payoutBasisPoints[i];
        }
        require(
            totalPayoutBasisPoints == 10000,
            "TOTAL_PAYOUT_BASIS_POINTS_MUST_BE_10000"
        );
        isExchangeBlocklisted[5] = true;
        isExchangeBlocklisted[6] = true;
        isExchangeBlocklisted[4] = true;
        isExchangeBlocklisted[3] = true;
        isExchangeBlocklisted[2] = true;
    }

    modifier originalUser() {
        require(tx.origin == msg.sender, "Cannot call from contract address");
        _;
    }

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

    /**
     * @dev Overrides the default ERC721A _startTokenId() so tokens begin at 1 instead of 0
     */
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    /**
     * @notice Change the royalty fee for the collection
     */
    function setRoyaltyFee(uint96 _feeNumerator) external onlyOwner {
        royaltyFee = _feeNumerator;
        _setDefaultRoyalty(royaltyAddress, royaltyFee);
    }

    /**
     * @notice Change the royalty address where royalty payouts are sent
     */
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
        _setDefaultRoyalty(royaltyAddress, royaltyFee);
    }

    /**
     * @notice Wraps and exposes publicly _numberMinted() from ERC721A
     */
    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    /**
     * @notice Update the base token URI
     */
    function setBaseURI(string calldata _newBaseURI) external onlyOwner {
        require(!metadataFrozen, "METADATA_HAS_BEEN_FROZEN");
        baseTokenURI = _newBaseURI;
    }

    /**
     * @notice Freeze metadata so it can never be changed again
     */
    function freezeMetadata() external onlyOwner {
        require(!metadataFrozen, "METADATA_HAS_ALREADY_BEEN_FROZEN");
        metadataFrozen = true;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    // https://chiru-labs.github.io/ERC721A/#/migration?id=supportsinterface
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC721A, ERC2981, ERC4907A)
        returns (bool)
    {
        // Supports the following interfaceIds:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        // - IERC4907: 0xad092b5c
        return
            ERC721A.supportsInterface(interfaceId) ||
            ERC2981.supportsInterface(interfaceId) ||
            ERC4907A.supportsInterface(interfaceId);
    }

    /**
     * @notice Allow owner to send 'mintNumber' tokens without cost to multiple addresses
     */
    function gift(address[] calldata receivers, uint256[] calldata mintNumber)
        external
        onlyOwner
    {
        require(
            receivers.length == mintNumber.length,
            "RECEIVERS_AND_MINT_NUMBERS_MUST_BE_SAME_LENGTH"
        );
        uint256 totalMint = 0;
        for (uint256 i = 0; i < mintNumber.length; i++) {
            totalMint += mintNumber[i];
        }
        require(totalSupply() + totalMint <= MAX_SUPPLY, "MINT_TOO_LARGE");
        for (uint256 i = 0; i < receivers.length; i++) {
            _safeMint(receivers[i], mintNumber[i]);
        }
    }

    /**
     * @notice To be updated by contract owner to allow public sale minting
     */
    function setPublicSaleState(bool _saleActiveState) external onlyOwner {
        require(
            isPublicSaleActive != _saleActiveState,
            "NEW_STATE_IDENTICAL_TO_OLD_STATE"
        );
        isPublicSaleActive = _saleActiveState;
    }

    /**
     * @notice Update the public mint price
     */
    function setPublicPrice(uint256 _publicPrice) external onlyOwner {
        publicPrice = _publicPrice;
    }

    /**
     * @notice Set the maximum mints allowed per a given address in the public sale
     */
    function setPublicMintsAllowedPerAddress(uint256 _mintsAllowed)
        external
        onlyOwner
    {
        publicMintsAllowedPerAddress = _mintsAllowed;
    }

    /**
     * @notice Set the maximum public mints allowed per a given transaction
     */
    function setPublicMintsAllowedPerTransaction(uint256 _mintsAllowed)
        external
        onlyOwner
    {
        publicMintsAllowedPerTransaction = _mintsAllowed;
    }

    /**
     * @notice Allow for public minting of tokens
     */
    function mint(uint256 numTokens)
        external
        payable
        nonReentrant
        originalUser
    {
        require(isPublicSaleActive, "PUBLIC_SALE_IS_NOT_ACTIVE");

        require(
            numTokens <= publicMintsAllowedPerTransaction,
            "MAX_MINTS_PER_TX_EXCEEDED"
        );
        require(
            _numberMinted(msg.sender) + numTokens <=
                publicMintsAllowedPerAddress,
            "MAX_MINTS_EXCEEDED"
        );
        require(totalSupply() + numTokens <= MAX_SUPPLY, "MAX_SUPPLY_EXCEEDED");
        require(msg.value == publicPrice * numTokens, "PAYMENT_INCORRECT");

        _safeMint(msg.sender, numTokens);

        if (totalSupply() >= MAX_SUPPLY) {
            isPublicSaleActive = false;
        }
    }

    /**
     * @notice Freeze all metadata so it can never be changed again
     */
    function freezePayoutAddresses() external onlyOwner {
        require(!payoutAddressesFrozen, "PAYOUT_ADDRESSES_ALREADY_FROZEN");
        payoutAddressesFrozen = true;
    }

    /**
     * @notice Update payout addresses and basis points for each addresses' respective share of contract funds
     */
    function updatePayoutAddressesAndBasisPoints(
        address[] calldata _payoutAddresses,
        uint256[] calldata _payoutBasisPoints
    ) external onlyOwner {
        require(!payoutAddressesFrozen, "PAYOUT_ADDRESSES_FROZEN");
        require(
            _payoutAddresses.length == _payoutBasisPoints.length,
            "ARRAY_LENGTHS_MUST_MATCH"
        );
        uint256 totalBasisPoints = 0;
        for (uint256 i = 0; i < _payoutBasisPoints.length; i++) {
            totalBasisPoints += _payoutBasisPoints[i];
        }
        require(totalBasisPoints == 10000, "TOTAL_BASIS_POINTS_MUST_BE_10000");
        payoutAddresses = _payoutAddresses;
        payoutBasisPoints = _payoutBasisPoints;
    }

    /**
     * @notice Withdraws all funds held within contract
     */
    function withdraw() external nonReentrant onlyOwner {
        require(address(this).balance > 0, "CONTRACT_HAS_NO_BALANCE");
        uint256 balance = address(this).balance;
        for (uint256 i = 0; i < payoutAddresses.length; i++) {
            require(
                payable(payoutAddresses[i]).send(
                    (balance * payoutBasisPoints[i]) / 10000
                )
            );
        }
    }

    /**
     * @notice Update blocklist contract address to a custom contract addresss if desired for custom functionality
     */
    function updateBlocklistContractAddress(address _blocklistContractAddress)
        external
        onlyOwner
    {
        blocklistContractAddress = _blocklistContractAddress;
    }

    /**
     * @notice Permanently disable the blocklist so all exchanges are allowed forever
     */
    function permanentlyDisableBlocklist() external onlyOwner {
        require(!blocklistPermanentlyDisabled, "BLOCKLIST_ALREADY_DISABLED");
        blocklistPermanentlyDisabled = true;
    }

    /**
     * @notice Set or unset an exchange contract address as blocklisted
     */
    function updateBlocklistedExchanges(
        uint256[] calldata exchanges,
        bool[] calldata blocklisted
    ) external onlyOwner {
        require(
            exchanges.length == blocklisted.length,
            "EXCHANGES_AND_BLOCKLISTED_MUST_BE_SAME_LENGTH"
        );
        for (uint256 i = 0; i < exchanges.length; i++) {
            isExchangeBlocklisted[exchanges[i]] = blocklisted[i];
        }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal override(ERC721A) whenNotPaused {
        uint256 operatorExchangeId = IExchangeOperatorAddressList(
            blocklistContractAddress
        ).operatorAddressToExchange(msg.sender);
        require(
            blocklistPermanentlyDisabled ||
                !isExchangeBlocklisted[operatorExchangeId],
            "BLOCKLISTED_EXCHANGE"
        );
        super._beforeTokenTransfers(from, to, tokenId, quantity);
    }
}

interface IExchangeOperatorAddressList {
    function operatorAddressToExchange(address operatorAddress)
        external
        view
        returns (uint256);
}

File 2 of 15 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
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 {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 virtual override {
        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 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.
            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`.
                )

                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 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // 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)
        }
    }
}

File 3 of 15 : ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import '../ERC721A.sol';

/**
 * @title ERC721AQueryable.
 *
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] calldata tokenIds)
        external
        view
        virtual
        override
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view virtual override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 4 of 15 : ERC4907A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC4907A.sol';
import '../ERC721A.sol';

/**
 * @title ERC4907A
 *
 * @dev [ERC4907](https://eips.ethereum.org/EIPS/eip-4907) compliant
 * extension of ERC721A, which allows owners and authorized addresses
 * to add a time-limited role with restricted permissions to ERC721 tokens.
 */
abstract contract ERC4907A is ERC721A, IERC4907A {
    // The bit position of `expires` in packed user info.
    uint256 private constant _BITPOS_EXPIRES = 160;

    // Mapping from token ID to user info.
    //
    // Bits Layout:
    // - [0..159]   `user`
    // - [160..223] `expires`
    mapping(uint256 => uint256) private _packedUserInfo;

    /**
     * @dev Sets the `user` and `expires` for `tokenId`.
     * The zero address indicates there is no user.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function setUser(
        uint256 tokenId,
        address user,
        uint64 expires
    ) public virtual override {
        // Require the caller to be either the token owner or an approved operator.
        address owner = ownerOf(tokenId);
        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A()))
                if (getApproved(tokenId) != _msgSenderERC721A()) revert SetUserCallerNotOwnerNorApproved();

        _packedUserInfo[tokenId] = (uint256(expires) << _BITPOS_EXPIRES) | uint256(uint160(user));

        emit UpdateUser(tokenId, user, expires);
    }

    /**
     * @dev Returns the user address for `tokenId`.
     * The zero address indicates that there is no user or if the user is expired.
     */
    function userOf(uint256 tokenId) public view virtual override returns (address) {
        uint256 packed = _packedUserInfo[tokenId];
        assembly {
            // Branchless `packed *= (block.timestamp <= expires ? 1 : 0)`.
            // If the `block.timestamp == expires`, the `lt` clause will be true
            // if there is a non-zero user address in the lower 160 bits of `packed`.
            packed := mul(
                packed,
                // `block.timestamp <= expires ? 1 : 0`.
                lt(shl(_BITPOS_EXPIRES, timestamp()), packed)
            )
        }
        return address(uint160(packed));
    }

    /**
     * @dev Returns the user's expires of `tokenId`.
     */
    function userExpires(uint256 tokenId) public view virtual override returns (uint256) {
        return _packedUserInfo[tokenId] >> _BITPOS_EXPIRES;
    }

    /**
     * @dev Override of {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC721A) returns (bool) {
        // The interface ID for ERC4907 is `0xad092b5c`,
        // as defined in [ERC4907](https://eips.ethereum.org/EIPS/eip-4907).
        return super.supportsInterface(interfaceId) || interfaceId == 0xad092b5c;
    }

    /**
     * @dev Returns the user address for `tokenId`, ignoring the expiry status.
     */
    function _explicitUserOf(uint256 tokenId) internal view virtual returns (address) {
        return address(uint160(_packedUserInfo[tokenId]));
    }
}

File 5 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

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

File 6 of 15 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 7 of 15 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 8 of 15 : ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 9 of 15 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 10 of 15 : IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 11 of 15 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 12 of 15 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

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

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

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

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

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

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

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

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

File 13 of 15 : IERC4907A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

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

    /**
     * @dev Emitted when the `user` of an NFT or the `expires` of the `user` is changed.
     * The zero address for user indicates that there is no user address.
     */
    event UpdateUser(uint256 indexed tokenId, address indexed user, uint64 expires);

    /**
     * @dev Sets the `user` and `expires` for `tokenId`.
     * The zero address indicates there is no user.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function setUser(
        uint256 tokenId,
        address user,
        uint64 expires
    ) external;

    /**
     * @dev Returns the user address for `tokenId`.
     * The zero address indicates that there is no user or if the user is expired.
     */
    function userOf(uint256 tokenId) external view returns (address);

    /**
     * @dev Returns the user's expires of `tokenId`.
     */
    function userExpires(uint256 tokenId) external view returns (uint256);
}

File 14 of 15 : IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '../IERC721A.sol';

/**
 * @dev Interface of ERC721AQueryable.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *
     * - `addr = address(0)`
     * - `startTimestamp = 0`
     * - `burned = false`
     * - `extraData = 0`
     *
     * If the `tokenId` is burned:
     *
     * - `addr = <Address of owner before token was burned>`
     * - `startTimestamp = <Timestamp when token was burned>`
     * - `burned = true`
     * - `extraData = <Extra data when token was burned>`
     *
     * Otherwise:
     *
     * - `addr = <Address of owner>`
     * - `startTimestamp = <Timestamp of start of ownership>`
     * - `burned = false`
     * - `extraData = <Extra data at start of ownership>`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start < stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(`totalSupply`) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 15 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "runs": 200,
    "enabled": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_blocklistContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":"SetUserCallerNotOwnerNorApproved","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint64","name":"expires","type":"uint64"}],"name":"UpdateUser","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocklistContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocklistPermanentlyDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freezePayoutAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"mintNumber","type":"uint256[]"}],"name":"gift","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isExchangeBlocklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutAddressesFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"payoutBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyDisableBlocklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintsAllowedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintsAllowedPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFee","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintsAllowed","type":"uint256"}],"name":"setPublicMintsAllowedPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintsAllowed","type":"uint256"}],"name":"setPublicMintsAllowedPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleActiveState","type":"bool"}],"name":"setPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"expires","type":"uint64"}],"name":"setUser","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blocklistContractAddress","type":"address"}],"name":"updateBlocklistContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"exchanges","type":"uint256[]"},{"internalType":"bool[]","name":"blocklisted","type":"bool[]"}],"name":"updateBlocklistedExchanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_payoutAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_payoutBasisPoints","type":"uint256[]"}],"name":"updatePayoutAddressesAndBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600e80546001600160a01b03191673662247835bbaa47ab2a241fcab073db4f2d2a1ef90811790915560a060405260809081526200004290600f90600162000540565b506010805463ffffffff191690556040805160808101909152604380825262003c666020830139601290620000789082620006aa565b50600a601381905560145566138a388a43c00060155560408051602081019091526127108152620000ae906016906001620005aa565b50601780546001600160601b0319166102ee179055348015620000d057600080fd5b5060405162003ca938038062003ca9833981016040819052620000f39162000776565b6040518060400160405280601481526020017f43727970746f20416c7068612049736c616e64200000000000000000000000008152506040518060400160405280600881526020016710d05254d310539160c21b81525081600290816200015b9190620006aa565b5060036200016a8282620006aa565b50506001600055506200017d33620003ed565b6009805460ff60a01b191690556001600a55600d80546001600160a01b0319166001600160a01b0383811691909117909155600e54601754620001ce9291909116906001600160601b03166200043f565b601654600f54146200024d5760405162461bcd60e51b815260206004820152603c60248201527f5041594f55545f4144445245535345535f414e445f5041594f55545f4241534960448201527f535f504f494e54535f4d5553545f42455f53414d455f4c454e4754480000000060648201526084015b60405180910390fd5b6000805b601654811015620002a15760168181548110620002725762000272620007a8565b9060005260206000200154826200028a9190620007d4565b9150806200029881620007f0565b91505062000251565b508061271014620003055760405162461bcd60e51b815260206004820152602760248201527f544f54414c5f5041594f55545f42415349535f504f494e54535f4d5553545f426044820152660455f31303030360cc1b606482015260840162000244565b505060116020527fc550213cee30afd5e67ccba7be3d381bbc169034ae08eb3ec9168caca9fe55e78054600160ff1991821681179092557ffb9ce45064c7e7d9bf9deb4750ba7c94ab3d6e7418c5d76bf69966d39a9d42f680548216831790557f251164fe1d8864fe5e86082eae9c288bc2b58695a4d28538dfe86e9e4f17558580548216831790557f9bfbaa59f8e10e7868f8b402de9d605a390c45ddaebd8c9de3c6f31e733c87ff805482168317905560026000527f08037d7b151cc412d25674a4e66b334d9ae9d2e5517a7feaae5cdb828bf1c628805490911690911790556200080c565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b0382161115620004af5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840162000244565b6001600160a01b038216620005075760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000244565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b82805482825590600052602060002090810192821562000598579160200282015b828111156200059857825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000561565b50620005a6929150620005ee565b5090565b82805482825590600052602060002090810192821562000598579160200282015b8281111562000598578251829061ffff16905591602001919060010190620005cb565b5b80821115620005a65760008155600101620005ef565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200063057607f821691505b6020821081036200065157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006a557600081815260208120601f850160051c81016020861015620006805750805b601f850160051c820191505b81811015620006a1578281556001016200068c565b5050505b505050565b81516001600160401b03811115620006c657620006c662000605565b620006de81620006d784546200061b565b8462000657565b602080601f831160018114620007165760008415620006fd5750858301515b600019600386901b1c1916600185901b178555620006a1565b600085815260208120601f198616915b82811015620007475788860151825594840194600190910190840162000726565b5085821015620007665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200078957600080fd5b81516001600160a01b0381168114620007a157600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115620007ea57620007ea620007be565b92915050565b600060018201620008055762000805620007be565b5060010190565b61344a806200081c6000396000f3fe6080604052600436106103975760003560e01c80638834e93b116101dc578063ba75298911610102578063d547cfb7116100a0578063e985e9c51161006f578063e985e9c514610aca578063f2fde38b14610b13578063f487077414610b33578063fb3cc6c214610b5357600080fd5b8063d547cfb714610a55578063dc33e68114610a6a578063e030565e14610a8a578063e03aaae614610aaa57600080fd5b8063c6275255116100dc578063c6275255146109e0578063c872d0e814610a00578063c87b56dd14610a20578063d111515d14610a4057600080fd5b8063ba7529891461095e578063c23dc68f1461097f578063c2f1f14a146109ac57600080fd5b80639cd233741161017a578063a945bf8011610149578063a945bf80146108d0578063ad2f852a146108e6578063b88d4fde14610906578063b8997a971461092657600080fd5b80639cd233741461084d578063a0712d681461087d578063a07ee1aa14610890578063a22cb465146108b057600080fd5b80639293a5c7116101b65780639293a5c7146107d857806395d89b41146107f857806398118c801461080d57806399a2557a1461082d57600080fd5b80638834e93b1461076a5780638da5cb5b1461078a5780638fc88c48146107a857600080fd5b80633f4ba83a116102c15780636dd00f271161025f578063771c17fe1161022e578063771c17fe146106f85780638456cb59146107125780638462151c14610727578063858179ff1461075457600080fd5b80636dd00f271461068d57806370a08231146106a3578063715018a6146106c35780637705f9b5146106d857600080fd5b806355f804b31161029b57806355f804b3146106015780635bbb2177146106215780635c975abb1461064e5780636352211e1461066d57600080fd5b80633f4ba83a146105ac57806342842e0e146105c15780634e00c667146105e157600080fd5b8063191f883b116103395780632a55205a116103085780632a55205a1461052257806331faafb41461056157806332cb6b0c146105815780633ccfd60b1461059757600080fd5b8063191f883b146104ae5780631e84c413146104c357806323b872dd146104e257806326cd76db1461050257600080fd5b806306fdde031161037557806306fdde0314610408578063081812fc1461042a578063095ea7b31461046257806318160ddd1461048257600080fd5b806301ffc9a71461039c57806304ff2d07146103d157806306d254da146103e8575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004612c04565b610b73565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103e6610ba2565b005b3480156103f457600080fd5b506103e6610403366004612c3d565b610c1e565b34801561041457600080fd5b5061041d610c5d565b6040516103c89190612ca8565b34801561043657600080fd5b5061044a610445366004612cbb565b610cef565b6040516001600160a01b0390911681526020016103c8565b34801561046e57600080fd5b506103e661047d366004612cd4565b610d33565b34801561048e57600080fd5b506104a0600154600054036000190190565b6040519081526020016103c8565b3480156104ba57600080fd5b506103e6610dd3565b3480156104cf57600080fd5b506010546103bc90610100900460ff1681565b3480156104ee57600080fd5b506103e66104fd366004612cfe565b610e3d565b34801561050e57600080fd5b506103e661051d366004612c3d565b610fe3565b34801561052e57600080fd5b5061054261053d366004612d3a565b61100d565b604080516001600160a01b0390931683526020830191909152016103c8565b34801561056d57600080fd5b506103e661057c366004612d5c565b6110bb565b34801561058d57600080fd5b506104a0610d0581565b3480156105a357600080fd5b506103e66110fe565b3480156105b857600080fd5b506103e661125d565b3480156105cd57600080fd5b506103e66105dc366004612cfe565b61126f565b3480156105ed57600080fd5b506103e66105fc366004612cbb565b61128f565b34801561060d57600080fd5b506103e661061c366004612d85565b61129c565b34801561062d57600080fd5b5061064161063c366004612e3a565b61130a565b6040516103c89190612eb7565b34801561065a57600080fd5b50600954600160a01b900460ff166103bc565b34801561067957600080fd5b5061044a610688366004612cbb565b6113d5565b34801561069957600080fd5b506104a060135481565b3480156106af57600080fd5b506104a06106be366004612c3d565b6113e0565b3480156106cf57600080fd5b506103e661142e565b3480156106e457600080fd5b506103e66106f3366004612ef9565b611440565b34801561070457600080fd5b506010546103bc9060ff1681565b34801561071e57600080fd5b506103e66115b6565b34801561073357600080fd5b50610747610742366004612c3d565b6115c6565b6040516103c89190612f64565b34801561076057600080fd5b506104a060145481565b34801561077657600080fd5b506104a0610785366004612cbb565b6116ce565b34801561079657600080fd5b506009546001600160a01b031661044a565b3480156107b457600080fd5b506104a06107c3366004612cbb565b60009081526008602052604090205460a01c90565b3480156107e457600080fd5b506103e66107f3366004612fac565b6116ef565b34801561080457600080fd5b5061041d611773565b34801561081957600080fd5b506103e6610828366004612ef9565b611782565b34801561083957600080fd5b50610747610848366004612fc7565b61187d565b34801561085957600080fd5b506103bc610868366004612cbb565b60116020526000908152604090205460ff1681565b6103e661088b366004612cbb565b611a04565b34801561089c57600080fd5b50600d5461044a906001600160a01b031681565b3480156108bc57600080fd5b506103e66108cb366004612ffa565b611cb5565b3480156108dc57600080fd5b506104a060155481565b3480156108f257600080fd5b50600e5461044a906001600160a01b031681565b34801561091257600080fd5b506103e6610921366004613043565b611d4a565b34801561093257600080fd5b50601754610946906001600160601b031681565b6040516001600160601b0390911681526020016103c8565b34801561096a57600080fd5b506010546103bc906301000000900460ff1681565b34801561098b57600080fd5b5061099f61099a366004612cbb565b611d94565b6040516103c8919061311e565b3480156109b857600080fd5b5061044a6109c7366004612cbb565b6000908152600860205260409020544260a01b81110290565b3480156109ec57600080fd5b506103e66109fb366004612cbb565b611e1c565b348015610a0c57600080fd5b506103e6610a1b366004612ef9565b611e29565b348015610a2c57600080fd5b5061041d610a3b366004612cbb565b611f89565b348015610a4c57600080fd5b506103e661200c565b348015610a6157600080fd5b5061041d612080565b348015610a7657600080fd5b506104a0610a85366004612c3d565b61210e565b348015610a9657600080fd5b506103e6610aa536600461312c565b612138565b348015610ab657600080fd5b506103e6610ac5366004612cbb565b612208565b348015610ad657600080fd5b506103bc610ae5366004613178565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b1f57600080fd5b506103e6610b2e366004612c3d565b612215565b348015610b3f57600080fd5b5061044a610b4e366004612cbb565b61228b565b348015610b5f57600080fd5b506010546103bc9062010000900460ff1681565b6000610b7e826122b5565b80610b8d5750610b8d82612303565b80610b9c5750610b9c82612338565b92915050565b610baa612360565b6010546301000000900460ff1615610c095760405162461bcd60e51b815260206004820152601f60248201527f5041594f55545f4144445245535345535f414c52454144595f46524f5a454e0060448201526064015b60405180910390fd5b6010805463ff00000019166301000000179055565b610c26612360565b600e80546001600160a01b0319166001600160a01b038316908117909155601754610c5a91906001600160601b03166123ba565b50565b606060028054610c6c906131a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c98906131a2565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b5050505050905090565b6000610cfa826124b7565b610d17576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d3e826113d5565b9050336001600160a01b03821614610d7757610d5a8133610ae5565b610d77576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ddb612360565b60105460ff1615610e2e5760405162461bcd60e51b815260206004820152601a60248201527f424c4f434b4c4953545f414c52454144595f44495341424c45440000000000006044820152606401610c00565b6010805460ff19166001179055565b6000610e48826124ec565b9050836001600160a01b0316816001600160a01b031614610e7b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ec857610eab8633610ae5565b610ec857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610eef57604051633a954ecd60e21b815260040160405180910390fd5b610efc868686600161255b565b8015610f0757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610f9957600184016000818152600460205260408120549003610f97576000548114610f975760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610feb612360565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611082575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906110a1906001600160601b0316876131f2565b6110ab9190613209565b91519350909150505b9250929050565b6110c3612360565b601780546bffffffffffffffffffffffff19166001600160601b038316908117909155600e54610c5a916001600160a01b03909116906123ba565b6002600a54036111505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c00565b6002600a5561115d612360565b600047116111ad5760405162461bcd60e51b815260206004820152601760248201527f434f4e54524143545f4841535f4e4f5f42414c414e43450000000000000000006044820152606401610c00565b4760005b600f5481101561125457600f81815481106111ce576111ce61322b565b600091825260209091200154601680546001600160a01b03909216916108fc9161271091859081106112025761120261322b565b90600052602060002001548561121891906131f2565b6112229190613209565b6040518115909202916000818181858888f1935050505061124257600080fd5b8061124c81613241565b9150506111b1565b50506001600a55565b611265612360565b61126d61263b565b565b61128a83838360405180602001604052806000815250611d4a565b505050565b611297612360565b601355565b6112a4612360565b60105462010000900460ff16156112fd5760405162461bcd60e51b815260206004820152601860248201527f4d455441444154415f4841535f4245454e5f46524f5a454e00000000000000006044820152606401610c00565b601261128a8284836132a0565b6060816000816001600160401b038111156113275761132761302d565b60405190808252806020026020018201604052801561137957816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816113455790505b50905060005b8281146113cc576113a786868381811061139b5761139b61322b565b90506020020135611d94565b8282815181106113b9576113b961322b565b602090810291909101015260010161137f565b50949350505050565b6000610b9c826124ec565b60006001600160a01b038216611409576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611436612360565b61126d6000612690565b611448612360565b8281146114ae5760405162461bcd60e51b815260206004820152602e60248201527f5245434549564552535f414e445f4d494e545f4e554d424552535f4d5553545f60448201526d0848abea6829a8abe988a9c8ea8960931b6064820152608401610c00565b6000805b828110156114f2578383828181106114cc576114cc61322b565b90506020020135826114de919061335f565b9150806114ea81613241565b9150506114b2565b50610d0581611508600154600054036000190190565b611512919061335f565b11156115515760405162461bcd60e51b815260206004820152600e60248201526d4d494e545f544f4f5f4c4152474560901b6044820152606401610c00565b60005b84811015610fdb576115a48686838181106115715761157161322b565b90506020020160208101906115869190612c3d565b8585848181106115985761159861322b565b905060200201356126e2565b806115ae81613241565b915050611554565b6115be612360565b61126d612700565b606060008060006115d6856113e0565b90506000816001600160401b038111156115f2576115f261302d565b60405190808252806020026020018201604052801561161b578160200160208202803683370190505b50905061164860408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146116c25761165b81612743565b915081604001516116ba5781516001600160a01b03161561167b57815194505b876001600160a01b0316856001600160a01b0316036116ba57808387806001019850815181106116ad576116ad61322b565b6020026020010181815250505b60010161164b565b50909695505050505050565b601681815481106116de57600080fd5b600091825260209091200154905081565b6116f7612360565b801515601060019054906101000a900460ff161515036117595760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f53544154456044820152606401610c00565b601080549115156101000261ff0019909216919091179055565b606060038054610c6c906131a2565b61178a612360565b8281146117ef5760405162461bcd60e51b815260206004820152602d60248201527f45584348414e4745535f414e445f424c4f434b4c49535445445f4d5553545f4260448201526c08abea6829a8abe988a9c8ea89609b1b6064820152608401610c00565b60005b838110156118765782828281811061180c5761180c61322b565b90506020020160208101906118219190612fac565b601160008787858181106118375761183761322b565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061186e90613241565b9150506117f2565b5050505050565b606081831061189f57604051631960ccad60e11b815260040160405180910390fd5b6000806118ab60005490565b905060018510156118bb57600194505b808411156118c7578093505b60006118d2876113e0565b9050848610156118f157858503818110156118eb578091505b506118f5565b5060005b6000816001600160401b0381111561190f5761190f61302d565b604051908082528060200260200182016040528015611938578160200160208202803683370190505b5090508160000361194e5793506119fd92505050565b600061195988611d94565b90506000816040015161196a575080515b885b88811415801561197c5750848714155b156119f15761198a81612743565b925082604001516119e95782516001600160a01b0316156119aa57825191505b8a6001600160a01b0316826001600160a01b0316036119e957808488806001019950815181106119dc576119dc61322b565b6020026020010181815250505b60010161196c565b50505092835250909150505b9392505050565b6002600a5403611a565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c00565b6002600a55323314611ab45760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742063616c6c2066726f6d20636f6e7472616374206164647265736044820152607360f81b6064820152608401610c00565b601054610100900460ff16611b0b5760405162461bcd60e51b815260206004820152601960248201527f5055424c49435f53414c455f49535f4e4f545f414354495645000000000000006044820152606401610c00565b601454811115611b5d5760405162461bcd60e51b815260206004820152601960248201527f4d41585f4d494e54535f5045525f54585f4558434545444544000000000000006044820152606401610c00565b60135433600090815260056020526040908190205483911c6001600160401b0316611b88919061335f565b1115611bcb5760405162461bcd60e51b815260206004820152601260248201527113505617d352539514d7d15610d15151115160721b6044820152606401610c00565b610d0581611be0600154600054036000190190565b611bea919061335f565b1115611c2e5760405162461bcd60e51b815260206004820152601360248201527213505617d4d55414131657d15610d151511151606a1b6044820152606401610c00565b80601554611c3c91906131f2565b3414611c7e5760405162461bcd60e51b81526020600482015260116024820152701410565351539517d25390d3d4949150d5607a1b6044820152606401610c00565b611c8833826126e2565b610d05611c9c600154600054036000190190565b10611cad576010805461ff00191690555b506001600a55565b336001600160a01b03831603611cde5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d55848484610e3d565b6001600160a01b0383163b15611d8e57611d718484848461277f565b611d8e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526001831080611ded57506000548310155b15611df85792915050565b611e0183612743565b9050806040015115611e135792915050565b6119fd8361286a565b611e24612360565b601555565b611e31612360565b6010546301000000900460ff1615611e8b5760405162461bcd60e51b815260206004820152601760248201527f5041594f55545f4144445245535345535f46524f5a454e0000000000000000006044820152606401610c00565b828114611eda5760405162461bcd60e51b815260206004820152601860248201527f41525241595f4c454e475448535f4d5553545f4d4154434800000000000000006044820152606401610c00565b6000805b82811015611f1e57838382818110611ef857611ef861322b565b9050602002013582611f0a919061335f565b915080611f1681613241565b915050611ede565b508061271014611f705760405162461bcd60e51b815260206004820181905260248201527f544f54414c5f42415349535f504f494e54535f4d5553545f42455f31303030306044820152606401610c00565b611f7c600f8686612b3b565b50610fdb60168484612b9e565b6060611f94826124b7565b611fb157604051630a14c4b560e41b815260040160405180910390fd5b6000611fbb61289f565b90508051600003611fdb57604051806020016040528060008152506119fd565b80611fe5846128ae565b604051602001611ff6929190613372565b6040516020818303038152906040529392505050565b612014612360565b60105462010000900460ff161561206d5760405162461bcd60e51b815260206004820181905260248201527f4d455441444154415f4841535f414c52454144595f4245454e5f46524f5a454e6044820152606401610c00565b6010805462ff0000191662010000179055565b6012805461208d906131a2565b80601f01602080910402602001604051908101604052809291908181526020018280546120b9906131a2565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b505050505081565b6001600160a01b038116600090815260056020526040808220546001600160401b03911c16610b9c565b6000612143846113d5565b9050336001600160a01b038216146121945761215f8133610ae5565b612194573361216d85610cef565b6001600160a01b031614612194576040516309e3bb1d60e31b815260040160405180910390fd5b6000848152600860209081526040918290206001600160a01b03861660a086901b67ffffffffffffffff60a01b16811790915591516001600160401b038516815286917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe910160405180910390a350505050565b612210612360565b601455565b61221d612360565b6001600160a01b0381166122825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c00565b610c5a81612690565b600f818154811061229b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006301ffc9a760e01b6001600160e01b0319831614806122e657506380ac58cd60e01b6001600160e01b03198316145b80610b9c5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b1480610b9c57506301ffc9a760e01b6001600160e01b0319831614610b9c565b6000612343826122b5565b80610b9c5750506001600160e01b031916632b424ad760e21b1490565b6009546001600160a01b0316331461126d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c00565b6127106001600160601b03821611156124285760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c00565b6001600160a01b03821661247e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c00565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b6000816001111580156124cb575060005482105b8015610b9c575050600090815260046020526040902054600160e01b161590565b60008180600111612542576000548110156125425760008181526004602052604081205490600160e01b82169003612540575b806000036119fd57506000190160008181526004602052604090205461251f565b505b604051636f96cda160e11b815260040160405180910390fd5b6125636128e6565b600d54604051630565a4ad60e31b81523360048201526000916001600160a01b031690632b2d256890602401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d091906133a1565b60105490915060ff16806125f3575060008181526011602052604090205460ff16155b6126365760405162461bcd60e51b8152602060048201526014602482015273424c4f434b4c49535445445f45584348414e474560601b6044820152606401610c00565b611876565b612643612933565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6126fc828260405180602001604052806000815250612983565b5050565b6127086128e6565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126733390565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610b9c906129e9565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906127b49033908990889088906004016133ba565b6020604051808303816000875af19250505080156127ef575060408051601f3d908101601f191682019092526127ec918101906133f7565b60015b61284d573d80801561281d576040519150601f19603f3d011682016040523d82523d6000602084013e612822565b606091505b508051600003612845576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610b9c61289a836124ec565b6129e9565b606060128054610c6c906131a2565b604080516080019081905280825b600183039250600a81066030018353600a9004806128bc5750819003601f19909101908152919050565b600954600160a01b900460ff161561126d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c00565b600954600160a01b900460ff1661126d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c00565b61298d8383612a30565b6001600160a01b0383163b1561128a576000548281035b6129b7600086838060010194508661277f565b6129d4576040516368d2bf6b60e11b815260040160405180910390fd5b8181106129a457816000541461187657600080fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6000805490829003612a555760405163b562e8dd60e01b815260040160405180910390fd5b612a62600084838561255b565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114612b1157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612ad9565b5081600003612b3257604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054828255906000526020600020908101928215612b8e579160200282015b82811115612b8e5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b5b565b50612b9a929150612bd9565b5090565b828054828255906000526020600020908101928215612b8e579160200282015b82811115612b8e578235825591602001919060010190612bbe565b5b80821115612b9a5760008155600101612bda565b6001600160e01b031981168114610c5a57600080fd5b600060208284031215612c1657600080fd5b81356119fd81612bee565b80356001600160a01b0381168114612c3857600080fd5b919050565b600060208284031215612c4f57600080fd5b6119fd82612c21565b60005b83811015612c73578181015183820152602001612c5b565b50506000910152565b60008151808452612c94816020860160208601612c58565b601f01601f19169290920160200192915050565b6020815260006119fd6020830184612c7c565b600060208284031215612ccd57600080fd5b5035919050565b60008060408385031215612ce757600080fd5b612cf083612c21565b946020939093013593505050565b600080600060608486031215612d1357600080fd5b612d1c84612c21565b9250612d2a60208501612c21565b9150604084013590509250925092565b60008060408385031215612d4d57600080fd5b50508035926020909101359150565b600060208284031215612d6e57600080fd5b81356001600160601b03811681146119fd57600080fd5b60008060208385031215612d9857600080fd5b82356001600160401b0380821115612daf57600080fd5b818501915085601f830112612dc357600080fd5b813581811115612dd257600080fd5b866020828501011115612de457600080fd5b60209290920196919550909350505050565b60008083601f840112612e0857600080fd5b5081356001600160401b03811115612e1f57600080fd5b6020830191508360208260051b85010111156110b457600080fd5b60008060208385031215612e4d57600080fd5b82356001600160401b03811115612e6357600080fd5b612e6f85828601612df6565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156116c257612ee6838551612e7b565b9284019260809290920191600101612ed3565b60008060008060408587031215612f0f57600080fd5b84356001600160401b0380821115612f2657600080fd5b612f3288838901612df6565b90965094506020870135915080821115612f4b57600080fd5b50612f5887828801612df6565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156116c257835183529284019291840191600101612f80565b80358015158114612c3857600080fd5b600060208284031215612fbe57600080fd5b6119fd82612f9c565b600080600060608486031215612fdc57600080fd5b612fe584612c21565b95602085013595506040909401359392505050565b6000806040838503121561300d57600080fd5b61301683612c21565b915061302460208401612f9c565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561305957600080fd5b61306285612c21565b935061307060208601612c21565b92506040850135915060608501356001600160401b038082111561309357600080fd5b818701915087601f8301126130a757600080fd5b8135818111156130b9576130b961302d565b604051601f8201601f19908116603f011681019083821181831017156130e1576130e161302d565b816040528281528a60208487010111156130fa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60808101610b9c8284612e7b565b60008060006060848603121561314157600080fd5b8335925061315160208501612c21565b915060408401356001600160401b038116811461316d57600080fd5b809150509250925092565b6000806040838503121561318b57600080fd5b61319483612c21565b915061302460208401612c21565b600181811c908216806131b657607f821691505b6020821081036131d657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b9c57610b9c6131dc565b60008261322657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201613253576132536131dc565b5060010190565b601f82111561128a57600081815260208120601f850160051c810160208610156132815750805b601f850160051c820191505b81811015610fdb5782815560010161328d565b6001600160401b038311156132b7576132b761302d565b6132cb836132c583546131a2565b8361325a565b6000601f8411600181146132ff57600085156132e75750838201355b600019600387901b1c1916600186901b178355611876565b600083815260209020601f19861690835b828110156133305786850135825560209485019460019092019101613310565b508682101561334d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b80820180821115610b9c57610b9c6131dc565b60008351613384818460208801612c58565b835190830190613398818360208801612c58565b01949350505050565b6000602082840312156133b357600080fd5b5051919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133ed90830184612c7c565b9695505050505050565b60006020828403121561340957600080fd5b81516119fd81612bee56fea2646970667358221220bd64fdf2d0c11315b3aaca6e180c6580f4133ddd13154c67cacb26f39db53b5f64736f6c63430008110033697066733a2f2f62616679626569656e64776b6f786c7666676637796a6568347635757562666470366d656535796e7767373578746b6e76377567637566633764712f000000000000000000000000ca71b13c9465c2117f3dbba294c2f4134c629c72

Deployed Bytecode

0x6080604052600436106103975760003560e01c80638834e93b116101dc578063ba75298911610102578063d547cfb7116100a0578063e985e9c51161006f578063e985e9c514610aca578063f2fde38b14610b13578063f487077414610b33578063fb3cc6c214610b5357600080fd5b8063d547cfb714610a55578063dc33e68114610a6a578063e030565e14610a8a578063e03aaae614610aaa57600080fd5b8063c6275255116100dc578063c6275255146109e0578063c872d0e814610a00578063c87b56dd14610a20578063d111515d14610a4057600080fd5b8063ba7529891461095e578063c23dc68f1461097f578063c2f1f14a146109ac57600080fd5b80639cd233741161017a578063a945bf8011610149578063a945bf80146108d0578063ad2f852a146108e6578063b88d4fde14610906578063b8997a971461092657600080fd5b80639cd233741461084d578063a0712d681461087d578063a07ee1aa14610890578063a22cb465146108b057600080fd5b80639293a5c7116101b65780639293a5c7146107d857806395d89b41146107f857806398118c801461080d57806399a2557a1461082d57600080fd5b80638834e93b1461076a5780638da5cb5b1461078a5780638fc88c48146107a857600080fd5b80633f4ba83a116102c15780636dd00f271161025f578063771c17fe1161022e578063771c17fe146106f85780638456cb59146107125780638462151c14610727578063858179ff1461075457600080fd5b80636dd00f271461068d57806370a08231146106a3578063715018a6146106c35780637705f9b5146106d857600080fd5b806355f804b31161029b57806355f804b3146106015780635bbb2177146106215780635c975abb1461064e5780636352211e1461066d57600080fd5b80633f4ba83a146105ac57806342842e0e146105c15780634e00c667146105e157600080fd5b8063191f883b116103395780632a55205a116103085780632a55205a1461052257806331faafb41461056157806332cb6b0c146105815780633ccfd60b1461059757600080fd5b8063191f883b146104ae5780631e84c413146104c357806323b872dd146104e257806326cd76db1461050257600080fd5b806306fdde031161037557806306fdde0314610408578063081812fc1461042a578063095ea7b31461046257806318160ddd1461048257600080fd5b806301ffc9a71461039c57806304ff2d07146103d157806306d254da146103e8575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004612c04565b610b73565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103e6610ba2565b005b3480156103f457600080fd5b506103e6610403366004612c3d565b610c1e565b34801561041457600080fd5b5061041d610c5d565b6040516103c89190612ca8565b34801561043657600080fd5b5061044a610445366004612cbb565b610cef565b6040516001600160a01b0390911681526020016103c8565b34801561046e57600080fd5b506103e661047d366004612cd4565b610d33565b34801561048e57600080fd5b506104a0600154600054036000190190565b6040519081526020016103c8565b3480156104ba57600080fd5b506103e6610dd3565b3480156104cf57600080fd5b506010546103bc90610100900460ff1681565b3480156104ee57600080fd5b506103e66104fd366004612cfe565b610e3d565b34801561050e57600080fd5b506103e661051d366004612c3d565b610fe3565b34801561052e57600080fd5b5061054261053d366004612d3a565b61100d565b604080516001600160a01b0390931683526020830191909152016103c8565b34801561056d57600080fd5b506103e661057c366004612d5c565b6110bb565b34801561058d57600080fd5b506104a0610d0581565b3480156105a357600080fd5b506103e66110fe565b3480156105b857600080fd5b506103e661125d565b3480156105cd57600080fd5b506103e66105dc366004612cfe565b61126f565b3480156105ed57600080fd5b506103e66105fc366004612cbb565b61128f565b34801561060d57600080fd5b506103e661061c366004612d85565b61129c565b34801561062d57600080fd5b5061064161063c366004612e3a565b61130a565b6040516103c89190612eb7565b34801561065a57600080fd5b50600954600160a01b900460ff166103bc565b34801561067957600080fd5b5061044a610688366004612cbb565b6113d5565b34801561069957600080fd5b506104a060135481565b3480156106af57600080fd5b506104a06106be366004612c3d565b6113e0565b3480156106cf57600080fd5b506103e661142e565b3480156106e457600080fd5b506103e66106f3366004612ef9565b611440565b34801561070457600080fd5b506010546103bc9060ff1681565b34801561071e57600080fd5b506103e66115b6565b34801561073357600080fd5b50610747610742366004612c3d565b6115c6565b6040516103c89190612f64565b34801561076057600080fd5b506104a060145481565b34801561077657600080fd5b506104a0610785366004612cbb565b6116ce565b34801561079657600080fd5b506009546001600160a01b031661044a565b3480156107b457600080fd5b506104a06107c3366004612cbb565b60009081526008602052604090205460a01c90565b3480156107e457600080fd5b506103e66107f3366004612fac565b6116ef565b34801561080457600080fd5b5061041d611773565b34801561081957600080fd5b506103e6610828366004612ef9565b611782565b34801561083957600080fd5b50610747610848366004612fc7565b61187d565b34801561085957600080fd5b506103bc610868366004612cbb565b60116020526000908152604090205460ff1681565b6103e661088b366004612cbb565b611a04565b34801561089c57600080fd5b50600d5461044a906001600160a01b031681565b3480156108bc57600080fd5b506103e66108cb366004612ffa565b611cb5565b3480156108dc57600080fd5b506104a060155481565b3480156108f257600080fd5b50600e5461044a906001600160a01b031681565b34801561091257600080fd5b506103e6610921366004613043565b611d4a565b34801561093257600080fd5b50601754610946906001600160601b031681565b6040516001600160601b0390911681526020016103c8565b34801561096a57600080fd5b506010546103bc906301000000900460ff1681565b34801561098b57600080fd5b5061099f61099a366004612cbb565b611d94565b6040516103c8919061311e565b3480156109b857600080fd5b5061044a6109c7366004612cbb565b6000908152600860205260409020544260a01b81110290565b3480156109ec57600080fd5b506103e66109fb366004612cbb565b611e1c565b348015610a0c57600080fd5b506103e6610a1b366004612ef9565b611e29565b348015610a2c57600080fd5b5061041d610a3b366004612cbb565b611f89565b348015610a4c57600080fd5b506103e661200c565b348015610a6157600080fd5b5061041d612080565b348015610a7657600080fd5b506104a0610a85366004612c3d565b61210e565b348015610a9657600080fd5b506103e6610aa536600461312c565b612138565b348015610ab657600080fd5b506103e6610ac5366004612cbb565b612208565b348015610ad657600080fd5b506103bc610ae5366004613178565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b1f57600080fd5b506103e6610b2e366004612c3d565b612215565b348015610b3f57600080fd5b5061044a610b4e366004612cbb565b61228b565b348015610b5f57600080fd5b506010546103bc9062010000900460ff1681565b6000610b7e826122b5565b80610b8d5750610b8d82612303565b80610b9c5750610b9c82612338565b92915050565b610baa612360565b6010546301000000900460ff1615610c095760405162461bcd60e51b815260206004820152601f60248201527f5041594f55545f4144445245535345535f414c52454144595f46524f5a454e0060448201526064015b60405180910390fd5b6010805463ff00000019166301000000179055565b610c26612360565b600e80546001600160a01b0319166001600160a01b038316908117909155601754610c5a91906001600160601b03166123ba565b50565b606060028054610c6c906131a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610c98906131a2565b8015610ce55780601f10610cba57610100808354040283529160200191610ce5565b820191906000526020600020905b815481529060010190602001808311610cc857829003601f168201915b5050505050905090565b6000610cfa826124b7565b610d17576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d3e826113d5565b9050336001600160a01b03821614610d7757610d5a8133610ae5565b610d77576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610ddb612360565b60105460ff1615610e2e5760405162461bcd60e51b815260206004820152601a60248201527f424c4f434b4c4953545f414c52454144595f44495341424c45440000000000006044820152606401610c00565b6010805460ff19166001179055565b6000610e48826124ec565b9050836001600160a01b0316816001600160a01b031614610e7b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610ec857610eab8633610ae5565b610ec857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610eef57604051633a954ecd60e21b815260040160405180910390fd5b610efc868686600161255b565b8015610f0757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610f9957600184016000818152600460205260408120549003610f97576000548114610f975760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610feb612360565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000828152600c602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291611082575060408051808201909152600b546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906110a1906001600160601b0316876131f2565b6110ab9190613209565b91519350909150505b9250929050565b6110c3612360565b601780546bffffffffffffffffffffffff19166001600160601b038316908117909155600e54610c5a916001600160a01b03909116906123ba565b6002600a54036111505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c00565b6002600a5561115d612360565b600047116111ad5760405162461bcd60e51b815260206004820152601760248201527f434f4e54524143545f4841535f4e4f5f42414c414e43450000000000000000006044820152606401610c00565b4760005b600f5481101561125457600f81815481106111ce576111ce61322b565b600091825260209091200154601680546001600160a01b03909216916108fc9161271091859081106112025761120261322b565b90600052602060002001548561121891906131f2565b6112229190613209565b6040518115909202916000818181858888f1935050505061124257600080fd5b8061124c81613241565b9150506111b1565b50506001600a55565b611265612360565b61126d61263b565b565b61128a83838360405180602001604052806000815250611d4a565b505050565b611297612360565b601355565b6112a4612360565b60105462010000900460ff16156112fd5760405162461bcd60e51b815260206004820152601860248201527f4d455441444154415f4841535f4245454e5f46524f5a454e00000000000000006044820152606401610c00565b601261128a8284836132a0565b6060816000816001600160401b038111156113275761132761302d565b60405190808252806020026020018201604052801561137957816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816113455790505b50905060005b8281146113cc576113a786868381811061139b5761139b61322b565b90506020020135611d94565b8282815181106113b9576113b961322b565b602090810291909101015260010161137f565b50949350505050565b6000610b9c826124ec565b60006001600160a01b038216611409576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b611436612360565b61126d6000612690565b611448612360565b8281146114ae5760405162461bcd60e51b815260206004820152602e60248201527f5245434549564552535f414e445f4d494e545f4e554d424552535f4d5553545f60448201526d0848abea6829a8abe988a9c8ea8960931b6064820152608401610c00565b6000805b828110156114f2578383828181106114cc576114cc61322b565b90506020020135826114de919061335f565b9150806114ea81613241565b9150506114b2565b50610d0581611508600154600054036000190190565b611512919061335f565b11156115515760405162461bcd60e51b815260206004820152600e60248201526d4d494e545f544f4f5f4c4152474560901b6044820152606401610c00565b60005b84811015610fdb576115a48686838181106115715761157161322b565b90506020020160208101906115869190612c3d565b8585848181106115985761159861322b565b905060200201356126e2565b806115ae81613241565b915050611554565b6115be612360565b61126d612700565b606060008060006115d6856113e0565b90506000816001600160401b038111156115f2576115f261302d565b60405190808252806020026020018201604052801561161b578160200160208202803683370190505b50905061164860408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146116c25761165b81612743565b915081604001516116ba5781516001600160a01b03161561167b57815194505b876001600160a01b0316856001600160a01b0316036116ba57808387806001019850815181106116ad576116ad61322b565b6020026020010181815250505b60010161164b565b50909695505050505050565b601681815481106116de57600080fd5b600091825260209091200154905081565b6116f7612360565b801515601060019054906101000a900460ff161515036117595760405162461bcd60e51b815260206004820181905260248201527f4e45575f53544154455f4944454e544943414c5f544f5f4f4c445f53544154456044820152606401610c00565b601080549115156101000261ff0019909216919091179055565b606060038054610c6c906131a2565b61178a612360565b8281146117ef5760405162461bcd60e51b815260206004820152602d60248201527f45584348414e4745535f414e445f424c4f434b4c49535445445f4d5553545f4260448201526c08abea6829a8abe988a9c8ea89609b1b6064820152608401610c00565b60005b838110156118765782828281811061180c5761180c61322b565b90506020020160208101906118219190612fac565b601160008787858181106118375761183761322b565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550808061186e90613241565b9150506117f2565b5050505050565b606081831061189f57604051631960ccad60e11b815260040160405180910390fd5b6000806118ab60005490565b905060018510156118bb57600194505b808411156118c7578093505b60006118d2876113e0565b9050848610156118f157858503818110156118eb578091505b506118f5565b5060005b6000816001600160401b0381111561190f5761190f61302d565b604051908082528060200260200182016040528015611938578160200160208202803683370190505b5090508160000361194e5793506119fd92505050565b600061195988611d94565b90506000816040015161196a575080515b885b88811415801561197c5750848714155b156119f15761198a81612743565b925082604001516119e95782516001600160a01b0316156119aa57825191505b8a6001600160a01b0316826001600160a01b0316036119e957808488806001019950815181106119dc576119dc61322b565b6020026020010181815250505b60010161196c565b50505092835250909150505b9392505050565b6002600a5403611a565760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c00565b6002600a55323314611ab45760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742063616c6c2066726f6d20636f6e7472616374206164647265736044820152607360f81b6064820152608401610c00565b601054610100900460ff16611b0b5760405162461bcd60e51b815260206004820152601960248201527f5055424c49435f53414c455f49535f4e4f545f414354495645000000000000006044820152606401610c00565b601454811115611b5d5760405162461bcd60e51b815260206004820152601960248201527f4d41585f4d494e54535f5045525f54585f4558434545444544000000000000006044820152606401610c00565b60135433600090815260056020526040908190205483911c6001600160401b0316611b88919061335f565b1115611bcb5760405162461bcd60e51b815260206004820152601260248201527113505617d352539514d7d15610d15151115160721b6044820152606401610c00565b610d0581611be0600154600054036000190190565b611bea919061335f565b1115611c2e5760405162461bcd60e51b815260206004820152601360248201527213505617d4d55414131657d15610d151511151606a1b6044820152606401610c00565b80601554611c3c91906131f2565b3414611c7e5760405162461bcd60e51b81526020600482015260116024820152701410565351539517d25390d3d4949150d5607a1b6044820152606401610c00565b611c8833826126e2565b610d05611c9c600154600054036000190190565b10611cad576010805461ff00191690555b506001600a55565b336001600160a01b03831603611cde5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d55848484610e3d565b6001600160a01b0383163b15611d8e57611d718484848461277f565b611d8e576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526001831080611ded57506000548310155b15611df85792915050565b611e0183612743565b9050806040015115611e135792915050565b6119fd8361286a565b611e24612360565b601555565b611e31612360565b6010546301000000900460ff1615611e8b5760405162461bcd60e51b815260206004820152601760248201527f5041594f55545f4144445245535345535f46524f5a454e0000000000000000006044820152606401610c00565b828114611eda5760405162461bcd60e51b815260206004820152601860248201527f41525241595f4c454e475448535f4d5553545f4d4154434800000000000000006044820152606401610c00565b6000805b82811015611f1e57838382818110611ef857611ef861322b565b9050602002013582611f0a919061335f565b915080611f1681613241565b915050611ede565b508061271014611f705760405162461bcd60e51b815260206004820181905260248201527f544f54414c5f42415349535f504f494e54535f4d5553545f42455f31303030306044820152606401610c00565b611f7c600f8686612b3b565b50610fdb60168484612b9e565b6060611f94826124b7565b611fb157604051630a14c4b560e41b815260040160405180910390fd5b6000611fbb61289f565b90508051600003611fdb57604051806020016040528060008152506119fd565b80611fe5846128ae565b604051602001611ff6929190613372565b6040516020818303038152906040529392505050565b612014612360565b60105462010000900460ff161561206d5760405162461bcd60e51b815260206004820181905260248201527f4d455441444154415f4841535f414c52454144595f4245454e5f46524f5a454e6044820152606401610c00565b6010805462ff0000191662010000179055565b6012805461208d906131a2565b80601f01602080910402602001604051908101604052809291908181526020018280546120b9906131a2565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b505050505081565b6001600160a01b038116600090815260056020526040808220546001600160401b03911c16610b9c565b6000612143846113d5565b9050336001600160a01b038216146121945761215f8133610ae5565b612194573361216d85610cef565b6001600160a01b031614612194576040516309e3bb1d60e31b815260040160405180910390fd5b6000848152600860209081526040918290206001600160a01b03861660a086901b67ffffffffffffffff60a01b16811790915591516001600160401b038516815286917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe910160405180910390a350505050565b612210612360565b601455565b61221d612360565b6001600160a01b0381166122825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c00565b610c5a81612690565b600f818154811061229b57600080fd5b6000918252602090912001546001600160a01b0316905081565b60006301ffc9a760e01b6001600160e01b0319831614806122e657506380ac58cd60e01b6001600160e01b03198316145b80610b9c5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b1480610b9c57506301ffc9a760e01b6001600160e01b0319831614610b9c565b6000612343826122b5565b80610b9c5750506001600160e01b031916632b424ad760e21b1490565b6009546001600160a01b0316331461126d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c00565b6127106001600160601b03821611156124285760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c00565b6001600160a01b03821661247e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c00565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600b55565b6000816001111580156124cb575060005482105b8015610b9c575050600090815260046020526040902054600160e01b161590565b60008180600111612542576000548110156125425760008181526004602052604081205490600160e01b82169003612540575b806000036119fd57506000190160008181526004602052604090205461251f565b505b604051636f96cda160e11b815260040160405180910390fd5b6125636128e6565b600d54604051630565a4ad60e31b81523360048201526000916001600160a01b031690632b2d256890602401602060405180830381865afa1580156125ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d091906133a1565b60105490915060ff16806125f3575060008181526011602052604090205460ff16155b6126365760405162461bcd60e51b8152602060048201526014602482015273424c4f434b4c49535445445f45584348414e474560601b6044820152606401610c00565b611876565b612643612933565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6126fc828260405180602001604052806000815250612983565b5050565b6127086128e6565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126733390565b604080516080810182526000808252602082018190529181018290526060810191909152600082815260046020526040902054610b9c906129e9565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906127b49033908990889088906004016133ba565b6020604051808303816000875af19250505080156127ef575060408051601f3d908101601f191682019092526127ec918101906133f7565b60015b61284d573d80801561281d576040519150601f19603f3d011682016040523d82523d6000602084013e612822565b606091505b508051600003612845576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b604080516080810182526000808252602082018190529181018290526060810191909152610b9c61289a836124ec565b6129e9565b606060128054610c6c906131a2565b604080516080019081905280825b600183039250600a81066030018353600a9004806128bc5750819003601f19909101908152919050565b600954600160a01b900460ff161561126d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610c00565b600954600160a01b900460ff1661126d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610c00565b61298d8383612a30565b6001600160a01b0383163b1561128a576000548281035b6129b7600086838060010194508661277f565b6129d4576040516368d2bf6b60e11b815260040160405180910390fd5b8181106129a457816000541461187657600080fd5b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b6000805490829003612a555760405163b562e8dd60e01b815260040160405180910390fd5b612a62600084838561255b565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114612b1157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612ad9565b5081600003612b3257604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054828255906000526020600020908101928215612b8e579160200282015b82811115612b8e5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b5b565b50612b9a929150612bd9565b5090565b828054828255906000526020600020908101928215612b8e579160200282015b82811115612b8e578235825591602001919060010190612bbe565b5b80821115612b9a5760008155600101612bda565b6001600160e01b031981168114610c5a57600080fd5b600060208284031215612c1657600080fd5b81356119fd81612bee565b80356001600160a01b0381168114612c3857600080fd5b919050565b600060208284031215612c4f57600080fd5b6119fd82612c21565b60005b83811015612c73578181015183820152602001612c5b565b50506000910152565b60008151808452612c94816020860160208601612c58565b601f01601f19169290920160200192915050565b6020815260006119fd6020830184612c7c565b600060208284031215612ccd57600080fd5b5035919050565b60008060408385031215612ce757600080fd5b612cf083612c21565b946020939093013593505050565b600080600060608486031215612d1357600080fd5b612d1c84612c21565b9250612d2a60208501612c21565b9150604084013590509250925092565b60008060408385031215612d4d57600080fd5b50508035926020909101359150565b600060208284031215612d6e57600080fd5b81356001600160601b03811681146119fd57600080fd5b60008060208385031215612d9857600080fd5b82356001600160401b0380821115612daf57600080fd5b818501915085601f830112612dc357600080fd5b813581811115612dd257600080fd5b866020828501011115612de457600080fd5b60209290920196919550909350505050565b60008083601f840112612e0857600080fd5b5081356001600160401b03811115612e1f57600080fd5b6020830191508360208260051b85010111156110b457600080fd5b60008060208385031215612e4d57600080fd5b82356001600160401b03811115612e6357600080fd5b612e6f85828601612df6565b90969095509350505050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6020808252825182820181905260009190848201906040850190845b818110156116c257612ee6838551612e7b565b9284019260809290920191600101612ed3565b60008060008060408587031215612f0f57600080fd5b84356001600160401b0380821115612f2657600080fd5b612f3288838901612df6565b90965094506020870135915080821115612f4b57600080fd5b50612f5887828801612df6565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156116c257835183529284019291840191600101612f80565b80358015158114612c3857600080fd5b600060208284031215612fbe57600080fd5b6119fd82612f9c565b600080600060608486031215612fdc57600080fd5b612fe584612c21565b95602085013595506040909401359392505050565b6000806040838503121561300d57600080fd5b61301683612c21565b915061302460208401612f9c565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561305957600080fd5b61306285612c21565b935061307060208601612c21565b92506040850135915060608501356001600160401b038082111561309357600080fd5b818701915087601f8301126130a757600080fd5b8135818111156130b9576130b961302d565b604051601f8201601f19908116603f011681019083821181831017156130e1576130e161302d565b816040528281528a60208487010111156130fa57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60808101610b9c8284612e7b565b60008060006060848603121561314157600080fd5b8335925061315160208501612c21565b915060408401356001600160401b038116811461316d57600080fd5b809150509250925092565b6000806040838503121561318b57600080fd5b61319483612c21565b915061302460208401612c21565b600181811c908216806131b657607f821691505b6020821081036131d657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b9c57610b9c6131dc565b60008261322657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060018201613253576132536131dc565b5060010190565b601f82111561128a57600081815260208120601f850160051c810160208610156132815750805b601f850160051c820191505b81811015610fdb5782815560010161328d565b6001600160401b038311156132b7576132b761302d565b6132cb836132c583546131a2565b8361325a565b6000601f8411600181146132ff57600085156132e75750838201355b600019600387901b1c1916600186901b178355611876565b600083815260209020601f19861690835b828110156133305786850135825560209485019460019092019101613310565b508682101561334d5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b80820180821115610b9c57610b9c6131dc565b60008351613384818460208801612c58565b835190830190613398818360208801612c58565b01949350505050565b6000602082840312156133b357600080fd5b5051919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133ed90830184612c7c565b9695505050505050565b60006020828403121561340957600080fd5b81516119fd81612bee56fea2646970667358221220bd64fdf2d0c11315b3aaca6e180c6580f4133ddd13154c67cacb26f39db53b5f64736f6c63430008110033

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

000000000000000000000000ca71b13c9465c2117f3dbba294c2f4134c629c72

-----Decoded View---------------
Arg [0] : _blocklistContractAddress (address): 0xca71B13C9465c2117f3DBBA294c2f4134c629C72

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ca71b13c9465c2117f3dbba294c2f4134c629c72


Deployed Bytecode Sourcemap

591:10883:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4986:579;;;;;;;;;;-1:-1:-1;4986:579:8;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;4986:579:8;;;;;;;;8264:173;;;;;;;;;;;;;:::i;:::-;;3910:176;;;;;;;;;;-1:-1:-1;3910:176:8;;;;;:::i;:::-;;:::i;9996:98:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16309:214::-;;;;;;;;;;-1:-1:-1;16309:214:9;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2066:32:15;;;2048:51;;2036:2;2021:18;16309:214:9;1902:203:15;15769:390:9;;;;;;;;;;-1:-1:-1;15769:390:9;;;;;:::i;:::-;;:::i;5851:317::-;;;;;;;;;;;;3565:1:8;6121:12:9;5912:7;6105:13;:28;-1:-1:-1;;6105:46:9;;5851:317;;;;2515:25:15;;;2503:2;2488:18;5851:317:9;2369:177:15;10204:188:8;;;;;;;;;;;;;:::i;1189:38::-;;;;;;;;;;-1:-1:-1;1189:38:8;;;;;;;;;;;19918:2756:9;;;;;;;;;;-1:-1:-1;19918:2756:9;;;;;:::i;:::-;;:::i;9913:183:8:-;;;;;;;;;;-1:-1:-1;9913:183:8;;;;;:::i;:::-;;:::i;1671:432:4:-;;;;;;;;;;-1:-1:-1;1671:432:4;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3329:32:15;;;3311:51;;3393:2;3378:18;;3371:34;;;;3284:18;1671:432:4;3137:274:15;3652:163:8;;;;;;;;;;-1:-1:-1;3652:163:8;;;;;:::i;:::-;;:::i;1818:41::-;;;;;;;;;;;;1855:4;1818:41;;9359:417;;;;;;;;;;;;;:::i;4838:65::-;;;;;;;;;;;;;:::i;22765:179:9:-;;;;;;;;;;-1:-1:-1;22765:179:9;;;;;:::i;:::-;;:::i;6901:164:8:-;;;;;;;;;;-1:-1:-1;6901:164:8;;;;;:::i;:::-;;:::i;4353:173::-;;;;;;;;;;-1:-1:-1;4353:173:8;;;;;:::i;:::-;;:::i;1641:513:12:-;;;;;;;;;;-1:-1:-1;1641:513:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1615:84:2:-;;;;;;;;;;-1:-1:-1;1685:7:2;;-1:-1:-1;;;1685:7:2;;;;1615:84;;11348:150:9;;;;;;;;;;-1:-1:-1;11348:150:9;;;;;:::i;:::-;;:::i;1865:48:8:-;;;;;;;;;;;;;;;;7002:230:9;;;;;;;;;;-1:-1:-1;7002:230:9;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;5677:595:8:-;;;;;;;;;;-1:-1:-1;5677:595:8;;;;;:::i;:::-;;:::i;1135:48::-;;;;;;;;;;-1:-1:-1;1135:48:8;;;;;;;;4771:61;;;;;;;;;;;;;:::i;5417:879:12:-;;;;;;;;;;-1:-1:-1;5417:879:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1919:52:8:-;;;;;;;;;;;;;;;;2123:44;;;;;;;;;;-1:-1:-1;2123:44:8;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;2465:152:11;;;;;;;;;;-1:-1:-1;2465:152:11;;;;;:::i;:::-;2541:7;2567:24;;;:15;:24;;;;;;562:3;2567:43;;2465:152;6370:251:8;;;;;;;;;;-1:-1:-1;6370:251:8;;;;;:::i;:::-;;:::i;10165:102:9:-;;;;;;;;;;;;;:::i;10486:416:8:-;;;;;;;;;;-1:-1:-1;10486:416:8;;;;;:::i;:::-;;:::i;2528:2454:12:-;;;;;;;;;;-1:-1:-1;2528:2454:12;;;;;:::i;:::-;;:::i;1596:53:8:-;;;;;;;;;;-1:-1:-1;1596:53:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;7407:767;;;;;;:::i;:::-;;:::i;841:39::-;;;;;;;;;;-1:-1:-1;841:39:8;;;;-1:-1:-1;;;;;841:39:8;;;16850:303:9;;;;;;;;;;-1:-1:-1;16850:303:9;;;;;:::i;:::-;;:::i;1977:41:8:-;;;;;;;;;;;;;;;;886:74;;;;;;;;;;-1:-1:-1;886:74:8;;;;-1:-1:-1;;;;;886:74:8;;;23525:388:9;;;;;;;;;;-1:-1:-1;23525:388:9;;;;;:::i;:::-;;:::i;2173:30:8:-;;;;;;;;;;-1:-1:-1;2173:30:8;;;;-1:-1:-1;;;;;2173:30:8;;;;;;-1:-1:-1;;;;;10770:39:15;;;10752:58;;10740:2;10725:18;2173:30:8;10608:208:15;1434:41:8;;;;;;;;;;-1:-1:-1;1434:41:8;;;;;;;;;;;1070:418:12;;;;;;;;;;-1:-1:-1;1070:418:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1755:635:11:-;;;;;;;;;;-1:-1:-1;1755:635:11;;;;;:::i;:::-;1826:7;1862:24;;;:15;:24;;;;;;2298:11;2281:15;2277:33;2274:45;-1:-1:-1;2172:161:11;;1755:635;6687:108:8;;;;;;;;;;-1:-1:-1;6687:108:8;;;;;:::i;:::-;;:::i;8570:711::-;;;;;;;;;;-1:-1:-1;8570:711:8;;;;;:::i;:::-;;:::i;10368:313:9:-;;;;;;;;;;-1:-1:-1;10368:313:9;;;;;:::i;:::-;;:::i;4612:153:8:-;;;;;;;;;;;;;:::i;1655:106::-;;;;;;;;;;;;;:::i;4179:111::-;;;;;;;;;;-1:-1:-1;4179:111:8;;;;;:::i;:::-;;:::i;984:614:11:-;;;;;;;;;;-1:-1:-1;984:614:11;;;;;:::i;:::-;;:::i;7163:172:8:-;;;;;;;;;;-1:-1:-1;7163:172:8;;;;;:::i;:::-;;:::i;17303:162:9:-;;;;;;;;;;-1:-1:-1;17303:162:9;;;;;:::i;:::-;-1:-1:-1;;;;;17423:25:9;;;17400:4;17423:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17303:162;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;966:93:8:-;;;;;;;;;;-1:-1:-1;966:93:8;;;;;:::i;:::-;;:::i;1296:34::-;;;;;;;;;;-1:-1:-1;1296:34:8;;;;;;;;;;;4986:579;5149:4;5411:38;5437:11;5411:25;:38::i;:::-;:92;;;;5465:38;5491:11;5465:25;:38::i;:::-;5411:147;;;;5519:39;5546:11;5519:26;:39::i;:::-;5392:166;4986:579;-1:-1:-1;;4986:579:8:o;8264:173::-;1094:13:0;:11;:13::i;:::-;8335:21:8::1;::::0;;;::::1;;;8334:22;8326:66;;;::::0;-1:-1:-1;;;8326:66:8;;11992:2:15;8326:66:8::1;::::0;::::1;11974:21:15::0;12031:2;12011:18;;;12004:30;12070:33;12050:18;;;12043:61;12121:18;;8326:66:8::1;;;;;;;;;8402:21;:28:::0;;-1:-1:-1;;8402:28:8::1;::::0;::::1;::::0;;8264:173::o;3910:176::-;1094:13:0;:11;:13::i;:::-;3991:14:8::1;:32:::0;;-1:-1:-1;;;;;;3991:32:8::1;-1:-1:-1::0;;;;;3991:32:8;::::1;::::0;;::::1;::::0;;;4068:10:::1;::::0;4033:46:::1;::::0;3991:32;-1:-1:-1;;;;;4068:10:8::1;4033:18;:46::i;:::-;3910:176:::0;:::o;9996:98:9:-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;-1:-1:-1;;;16434:34:9;;;;;;;;;;;16404:64;-1:-1:-1;16486:24:9;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;16486:30:9;;16309:214::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;-1:-1:-1;39008:10:9;-1:-1:-1;;;;;15896:28:9;;;15892:172;;15943:44;15960:5;39008:10;17303:162;:::i;15943:44::-;15938:126;;16014:35;;-1:-1:-1;;;16014:35:9;;;;;;;;;;;15938:126;16074:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16074:35:9;-1:-1:-1;;;;;16074:35:9;;;;;;;;;16124:28;;16074:24;;16124:28;;;;;;;15839:320;15769:390;;:::o;10204:188:8:-;1094:13:0;:11;:13::i;:::-;10281:28:8::1;::::0;::::1;;10280:29;10272:68;;;::::0;-1:-1:-1;;;10272:68:8;;12737:2:15;10272:68:8::1;::::0;::::1;12719:21:15::0;12776:2;12756:18;;;12749:30;12815:28;12795:18;;;12788:56;12861:18;;10272:68:8::1;12535:350:15::0;10272:68:8::1;10350:28;:35:::0;;-1:-1:-1;;10350:35:8::1;10381:4;10350:35;::::0;;10204:188::o;19918:2756:9:-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;-1:-1:-1;;;;;20119:45:9;20135:19;-1:-1:-1;;;;;20119:45:9;;20115:86;;20173:28;;-1:-1:-1;;;20173:28:9;;;;;;;;;;;20115:86;20213:27;19057:24;;;:15;:24;;;;;19275:26;;39008:10;18694:30;;;-1:-1:-1;;;;;18391:28:9;;18672:20;;;18669:56;20396:179;;20488:43;20505:4;39008:10;17303:162;:::i;20488:43::-;20483:92;;20540:35;;-1:-1:-1;;;20540:35:9;;;;;;;;;;;20483:92;-1:-1:-1;;;;;20590:16:9;;20586:52;;20615:23;;-1:-1:-1;;;20615:23:9;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;-1:-1:-1;;;;;21307:24:9;;;;;;;:18;:24;;;;;;21305:26;;-1:-1:-1;;21305:26:9;;;21375:22;;;;;;;;;21373:24;;-1:-1:-1;21373:24:9;;;14660:11;14635:23;14631:41;14618:63;-1:-1:-1;;;14618:63:9;21661:26;;;;:17;:26;;;;;:172;;;;-1:-1:-1;;;21950:47:9;;:52;;21946:617;;22054:1;22044:11;;22022:19;22175:30;;;:17;:30;;;;;;:35;;22171:378;;22311:13;;22296:11;:28;22292:239;;22456:30;;;;:17;:30;;;;;:52;;;22292:239;22004:559;21946:617;22607:7;22603:2;-1:-1:-1;;;;;22588:27:9;22597:4;-1:-1:-1;;;;;22588:27:9;;;;;;;;;;;22625:42;20037:2637;;;19918:2756;;;:::o;9913:183:8:-;1094:13:0;:11;:13::i;:::-;10037:24:8::1;:52:::0;;-1:-1:-1;;;;;;10037:52:8::1;-1:-1:-1::0;;;;;10037:52:8;;;::::1;::::0;;;::::1;::::0;;9913:183::o;1671:432:4:-;1768:7;1825:27;;;:17;:27;;;;;;;;1796:56;;;;;;;;;-1:-1:-1;;;;;1796:56:4;;;;;-1:-1:-1;;;1796:56:4;;;-1:-1:-1;;;;;1796:56:4;;;;;;;;1768:7;;1863:90;;-1:-1:-1;1913:29:4;;;;;;;;;1923:19;1913:29;-1:-1:-1;;;;;1913:29:4;;;;-1:-1:-1;;;1913:29:4;;-1:-1:-1;;;;;1913:29:4;;;;;1863:90;2001:23;;;;1963:21;;2461:5;;1988:36;;-1:-1:-1;;;;;1988:36:4;:10;:36;:::i;:::-;1987:58;;;;:::i;:::-;2064:16;;;-1:-1:-1;1963:82:4;;-1:-1:-1;;1671:432:4;;;;;;:::o;3652:163:8:-;1094:13:0;:11;:13::i;:::-;3726:10:8::1;:26:::0;;-1:-1:-1;;3726:26:8::1;-1:-1:-1::0;;;;;3726:26:8;::::1;::::0;;::::1;::::0;;;3781:14:::1;::::0;3762:46:::1;::::0;-1:-1:-1;;;;;3781:14:8;;::::1;::::0;3762:18:::1;:46::i;9359:417::-:0;1744:1:3;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:3;;13619:2:15;2317:63:3;;;13601:21:15;13658:2;13638:18;;;13631:30;13697:33;13677:18;;;13670:61;13748:18;;2317:63:3;13417:355:15;2317:63:3;1744:1;2455:7;:18;1094:13:0::1;:11;:13::i;:::-;9453:1:8::2;9429:21;:25;9421:61;;;::::0;-1:-1:-1;;;9421:61:8;;13979:2:15;9421:61:8::2;::::0;::::2;13961:21:15::0;14018:2;13998:18;;;13991:30;14057:25;14037:18;;;14030:53;14100:18;;9421:61:8::2;13777:347:15::0;9421:61:8::2;9510:21;9492:15;9541:229;9565:15;:22:::0;9561:26;::::2;9541:229;;;9641:15;9657:1;9641:18;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;9698:17:::2;:20:::0;;-1:-1:-1;;;;;9641:18:8;;::::2;::::0;9633:112:::2;::::0;9722:5:::2;::::0;9716:1;;9698:20;::::2;;;;;:::i;:::-;;;;;;;;;9688:7;:30;;;;:::i;:::-;9687:40;;;;:::i;:::-;9633:112;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;9608:151;;;::::0;::::2;;9589:3:::0;::::2;::::0;::::2;:::i;:::-;;;;9541:229;;;-1:-1:-1::0;;1701:1:3;2628:7;:22;9359:417:8:o;4838:65::-;1094:13:0;:11;:13::i;:::-;4886:10:8::1;:8;:10::i;:::-;4838:65::o:0;22765:179:9:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;6901:164:8:-;1094:13:0;:11;:13::i;:::-;7014:28:8::1;:44:::0;6901:164::o;4353:173::-;1094:13:0;:11;:13::i;:::-;4440:14:8::1;::::0;;;::::1;;;4439:15;4431:52;;;::::0;-1:-1:-1;;;4431:52:8;;14603:2:15;4431:52:8::1;::::0;::::1;14585:21:15::0;14642:2;14622:18;;;14615:30;14681:26;14661:18;;;14654:54;14725:18;;4431:52:8::1;14401:348:15::0;4431:52:8::1;4493:12;:26;4508:11:::0;;4493:12;:26:::1;:::i;1641:513:12:-:0;1780:23;1868:8;1843:22;1868:8;-1:-1:-1;;;;;1934:36:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1934:36:12;;-1:-1:-1;;1934:36:12;;;;;;;;;;;;1897:73;;1989:9;1984:123;2005:14;2000:1;:19;1984:123;;2060:32;2080:8;;2089:1;2080:11;;;;;;;:::i;:::-;;;;;;;2060:19;:32::i;:::-;2044:10;2055:1;2044:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;2021:3;;1984:123;;;-1:-1:-1;2127:10:12;1641:513;-1:-1:-1;;;;1641:513:12:o;11348:150:9:-;11420:7;11462:27;11481:7;11462:18;:27::i;7002:230::-;7074:7;-1:-1:-1;;;;;7097:19:9;;7093:60;;7125:28;;-1:-1:-1;;;7125:28:9;;;;;;;;;;;7093:60;-1:-1:-1;;;;;;7170:25:9;;;;;:18;:25;;;;;;-1:-1:-1;;;;;7170:55:9;;7002:230::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;5677:595:8:-:0;1094:13:0;:11;:13::i;:::-;5822:37:8;;::::1;5801:130;;;::::0;-1:-1:-1;;;5801:130:8;;17014:2:15;5801:130:8::1;::::0;::::1;16996:21:15::0;17053:2;17033:18;;;17026:30;17092:34;17072:18;;;17065:62;-1:-1:-1;;;17143:18:15;;;17136:44;17197:19;;5801:130:8::1;16812:410:15::0;5801:130:8::1;5941:17;5977:9:::0;5972:99:::1;5992:21:::0;;::::1;5972:99;;;6047:10;;6058:1;6047:13;;;;;;;:::i;:::-;;;;;;;6034:26;;;;;:::i;:::-;::::0;-1:-1:-1;6015:3:8;::::1;::::0;::::1;:::i;:::-;;;;5972:99;;;;1855:4;6104:9;6088:13;3565:1:::0;6121:12:9;5912:7;6105:13;:28;-1:-1:-1;;6105:46:9;;5851:317;6088:13:8::1;:25;;;;:::i;:::-;:39;;6080:66;;;::::0;-1:-1:-1;;;6080:66:8;;17559:2:15;6080:66:8::1;::::0;::::1;17541:21:15::0;17598:2;17578:18;;;17571:30;-1:-1:-1;;;17617:18:15;;;17610:44;17671:18;;6080:66:8::1;17357:338:15::0;6080:66:8::1;6161:9;6156:110;6176:20:::0;;::::1;6156:110;;;6217:38;6227:9;;6237:1;6227:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6241:10;;6252:1;6241:13;;;;;;;:::i;:::-;;;;;;;6217:9;:38::i;:::-;6198:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6156:110;;4771:61:::0;1094:13:0;:11;:13::i;:::-;4817:8:8::1;:6;:8::i;5417:879:12:-:0;5495:16;5547:19;5580:25;5619:22;5644:16;5654:5;5644:9;:16::i;:::-;5619:41;;5674:25;5716:14;-1:-1:-1;;;;;5702:29:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5702:29:12;;5674:57;;5745:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5745:31:12;3565:1:8;5790:461:12;5839:14;5824:11;:29;5790:461;;5890:15;5903:1;5890:12;:15::i;:::-;5878:27;;5927:9;:16;;;5967:8;5923:71;6015:14;;-1:-1:-1;;;;;6015:28:12;;6011:109;;6087:14;;;-1:-1:-1;6011:109:12;6162:5;-1:-1:-1;;;;;6141:26:12;:17;-1:-1:-1;;;;;6141:26:12;;6137:100;;6217:1;6191:8;6200:13;;;;;;6191:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;6137:100;5855:3;;5790:461;;;-1:-1:-1;6271:8:12;;5417:879;-1:-1:-1;;;;;;5417:879:12:o;2123:44:8:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2123:44:8;:::o;6370:251::-;1094:13:0;:11;:13::i;:::-;6493:16:8::1;6471:38;;:18;;;;;;;;;;;:38;;::::0;6450:117:::1;;;::::0;-1:-1:-1;;;6450:117:8;;17902:2:15;6450:117:8::1;::::0;::::1;17884:21:15::0;;;17921:18;;;17914:30;17980:34;17960:18;;;17953:62;18032:18;;6450:117:8::1;17700:356:15::0;6450:117:8::1;6577:18;:37:::0;;;::::1;;;;-1:-1:-1::0;;6577:37:8;;::::1;::::0;;;::::1;::::0;;6370:251::o;10165:102:9:-;10221:13;10253:7;10246:14;;;;;:::i;10486:416:8:-;1094:13:0;:11;:13::i;:::-;10653:38:8;;::::1;10632:130;;;::::0;-1:-1:-1;;;10632:130:8;;18263:2:15;10632:130:8::1;::::0;::::1;18245:21:15::0;18302:2;18282:18;;;18275:30;18341:34;18321:18;;;18314:62;-1:-1:-1;;;18392:18:15;;;18385:43;18445:19;;10632:130:8::1;18061:409:15::0;10632:130:8::1;10777:9;10772:124;10792:20:::0;;::::1;10772:124;;;10871:11;;10883:1;10871:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;10833:21;:35;10855:9;;10865:1;10855:12;;;;;;;:::i;:::-;;;;;;;10833:35;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;10814:3;;;;;:::i;:::-;;;;10772:124;;;;10486:416:::0;;;;:::o;2528:2454:12:-;2667:16;2732:4;2723:5;:13;2719:45;;2745:19;;-1:-1:-1;;;2745:19:12;;;;;;;;;;;2719:45;2778:19;2811:17;2831:14;5602:7:9;5628:13;;5547:101;2831:14:12;2811:34;-1:-1:-1;3565:1:8;2921:5:12;:23;2917:85;;;3565:1:8;2964:23:12;;2917:85;3076:9;3069:4;:16;3065:71;;;3112:9;3105:16;;3065:71;3149:25;3177:16;3187:5;3177:9;:16::i;:::-;3149:44;;3368:4;3360:5;:12;3356:271;;;3414:12;;;3448:31;;;3444:109;;;3523:11;3503:31;;3444:109;3374:193;3356:271;;;-1:-1:-1;3611:1:12;3356:271;3640:25;3682:17;-1:-1:-1;;;;;3668:32:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3668:32:12;;3640:60;;3718:17;3739:1;3718:22;3714:76;;3767:8;-1:-1:-1;3760:15:12;;-1:-1:-1;;;3760:15:12;3714:76;3931:31;3965:26;3985:5;3965:19;:26::i;:::-;3931:60;;4005:25;4247:9;:16;;;4242:90;;-1:-1:-1;4303:14:12;;4242:90;4362:5;4345:467;4374:4;4369:1;:9;;:45;;;;;4397:17;4382:11;:32;;4369:45;4345:467;;;4451:15;4464:1;4451:12;:15::i;:::-;4439:27;;4488:9;:16;;;4528:8;4484:71;4576:14;;-1:-1:-1;;;;;4576:28:12;;4572:109;;4648:14;;;-1:-1:-1;4572:109:12;4723:5;-1:-1:-1;;;;;4702:26:12;:17;-1:-1:-1;;;;;4702:26:12;;4698:100;;4778:1;4752:8;4761:13;;;;;;4752:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;4698:100;4416:3;;4345:467;;;-1:-1:-1;;;4894:29:12;;;-1:-1:-1;4901:8:12;;-1:-1:-1;;2528:2454:12;;;;;;:::o;7407:767:8:-;1744:1:3;2325:7;;:19;2317:63;;;;-1:-1:-1;;;2317:63:3;;13619:2:15;2317:63:3;;;13601:21:15;13658:2;13638:18;;;13631:30;13697:33;13677:18;;;13670:61;13748:18;;2317:63:3;13417:355:15;2317:63:3;1744:1;2455:7;:18;3164:9:8::1;3177:10;3164:23;3156:69;;;::::0;-1:-1:-1;;;3156:69:8;;18677:2:15;3156:69:8::1;::::0;::::1;18659:21:15::0;18716:2;18696:18;;;18689:30;18755:34;18735:18;;;18728:62;-1:-1:-1;;;18806:18:15;;;18799:31;18847:19;;3156:69:8::1;18475:397:15::0;3156:69:8::1;7537:18:::2;::::0;::::2;::::0;::::2;;;7529:56;;;::::0;-1:-1:-1;;;7529:56:8;;19079:2:15;7529:56:8::2;::::0;::::2;19061:21:15::0;19118:2;19098:18;;;19091:30;19157:27;19137:18;;;19130:55;19202:18;;7529:56:8::2;18877:349:15::0;7529:56:8::2;7630:32;;7617:9;:45;;7596:117;;;::::0;-1:-1:-1;;;7596:117:8;;19433:2:15;7596:117:8::2;::::0;::::2;19415:21:15::0;19472:2;19452:18;;;19445:30;19511:27;19491:18;;;19484:55;19556:18;;7596:117:8::2;19231:349:15::0;7596:117:8::2;7801:28;::::0;7758:10:::2;7370:7:9::0;7397:25;;;:18;:25;;1452:2;7397:25;;;;;7772:9:8;;7397:50:9;-1:-1:-1;;;;;7396:82:9;7744:37:8::2;;;;:::i;:::-;:85;;7723:150;;;::::0;-1:-1:-1;;;7723:150:8;;19787:2:15;7723:150:8::2;::::0;::::2;19769:21:15::0;19826:2;19806:18;;;19799:30;-1:-1:-1;;;19845:18:15;;;19838:48;19903:18;;7723:150:8::2;19585:342:15::0;7723:150:8::2;1855:4;7907:9;7891:13;3565:1:::0;6121:12:9;5912:7;6105:13;:28;-1:-1:-1;;6105:46:9;;5851:317;7891:13:8::2;:25;;;;:::i;:::-;:39;;7883:71;;;::::0;-1:-1:-1;;;7883:71:8;;20134:2:15;7883:71:8::2;::::0;::::2;20116:21:15::0;20173:2;20153:18;;;20146:30;-1:-1:-1;;;20192:18:15;;;20185:49;20251:18;;7883:71:8::2;19932:343:15::0;7883:71:8::2;7999:9;7985:11;;:23;;;;:::i;:::-;7972:9;:36;7964:66;;;::::0;-1:-1:-1;;;7964:66:8;;20482:2:15;7964:66:8::2;::::0;::::2;20464:21:15::0;20521:2;20501:18;;;20494:30;-1:-1:-1;;;20540:18:15;;;20533:47;20597:18;;7964:66:8::2;20280:341:15::0;7964:66:8::2;8041:32;8051:10;8063:9;8041;:32::i;:::-;1855:4;8088:13;3565:1:::0;6121:12:9;5912:7;6105:13;:28;-1:-1:-1;;6105:46:9;;5851:317;8088:13:8::2;:27;8084:84;;8131:18;:26:::0;;-1:-1:-1;;8131:26:8::2;::::0;;8084:84:::2;-1:-1:-1::0;1701:1:3;2628:7;:22;7407:767:8:o;16850:303:9:-;39008:10;-1:-1:-1;;;;;16948:31:9;;;16944:61;;16988:17;;-1:-1:-1;;;16988:17:9;;;;;;;;;;;16944:61;39008:10;17016:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;17016:49:9;;;;;;;;;;;;:60;;-1:-1:-1;;17016:60:9;;;;;;;;;;17091:55;;540:41:15;;;17016:49:9;;39008:10;17091:55;;513:18:15;17091:55:9;;;;;;;16850:303;;:::o;23525:388::-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;-1:-1:-1;;;;;23731:14:9;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;-1:-1:-1;;;23852:40:9;;;;;;;;;;;23764:143;23525:388;;;;:::o;1070:418:12:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3565:1:8;1232:7:12;:25;:54;;;-1:-1:-1;5602:7:9;5628:13;1261:7:12;:25;;1232:54;1228:101;;;1309:9;1070:418;-1:-1:-1;;1070:418:12:o;1228:101::-;1350:21;1363:7;1350:12;:21::i;:::-;1338:33;;1385:9;:16;;;1381:63;;;1424:9;1070:418;-1:-1:-1;;1070:418:12:o;1381:63::-;1460:21;1473:7;1460:12;:21::i;6687:108:8:-;1094:13:0;:11;:13::i;:::-;6762:11:8::1;:26:::0;6687:108::o;8570:711::-;1094:13:0;:11;:13::i;:::-;8751:21:8::1;::::0;;;::::1;;;8750:22;8742:58;;;::::0;-1:-1:-1;;;8742:58:8;;20828:2:15;8742:58:8::1;::::0;::::1;20810:21:15::0;20867:2;20847:18;;;20840:30;20906:25;20886:18;;;20879:53;20949:18;;8742:58:8::1;20626:347:15::0;8742:58:8::1;8831:52:::0;;::::1;8810:123;;;::::0;-1:-1:-1;;;8810:123:8;;21180:2:15;8810:123:8::1;::::0;::::1;21162:21:15::0;21219:2;21199:18;;;21192:30;21258:26;21238:18;;;21231:54;21302:18;;8810:123:8::1;20978:348:15::0;8810:123:8::1;8943:24;8986:9:::0;8981:122:::1;9001:29:::0;;::::1;8981:122;;;9071:18;;9090:1;9071:21;;;;;;;:::i;:::-;;;;;;;9051:41;;;;;:::i;:::-;::::0;-1:-1:-1;9032:3:8;::::1;::::0;::::1;:::i;:::-;;;;8981:122;;;;9120:16;9140:5;9120:25;9112:70;;;::::0;-1:-1:-1;;;9112:70:8;;21533:2:15;9112:70:8::1;::::0;::::1;21515:21:15::0;;;21552:18;;;21545:30;21611:34;21591:18;;;21584:62;21663:18;;9112:70:8::1;21331:356:15::0;9112:70:8::1;9192:34;:15;9210:16:::0;;9192:34:::1;:::i;:::-;-1:-1:-1::0;9236:38:8::1;:17;9256:18:::0;;9236:38:::1;:::i;10368:313:9:-:0;10441:13;10471:16;10479:7;10471;:16::i;:::-;10466:59;;10496:29;;-1:-1:-1;;;10496:29:9;;;;;;;;;;;10466:59;10536:21;10560:10;:8;:10::i;:::-;10536:34;;10593:7;10587:21;10612:1;10587:26;:87;;;;;;;;;;;;;;;;;10640:7;10649:18;10659:7;10649:9;:18::i;:::-;10623:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10580:94;10368:313;-1:-1:-1;;;10368:313:9:o;4612:153:8:-;1094:13:0;:11;:13::i;:::-;4676:14:8::1;::::0;;;::::1;;;4675:15;4667:60;;;::::0;-1:-1:-1;;;4667:60:8;;22395:2:15;4667:60:8::1;::::0;::::1;22377:21:15::0;;;22414:18;;;22407:30;22473:34;22453:18;;;22446:62;22525:18;;4667:60:8::1;22193:356:15::0;4667:60:8::1;4737:14;:21:::0;;-1:-1:-1;;4737:21:8::1;::::0;::::1;::::0;;4612:153::o;1655:106::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4179:111::-;-1:-1:-1;;;;;7397:25:9;;4237:7:8;7397:25:9;;;:18;:25;;1452:2;7397:25;;;;-1:-1:-1;;;;;7397:50:9;;7396:82;4263:20:8;7309:176:9;984:614:11;1196:13;1212:16;1220:7;1212;:16::i;:::-;1196:32;-1:-1:-1;39008:10:9;-1:-1:-1;;;;;1242:28:11;;;1238:203;;1289:44;1306:5;39008:10:9;17303:162;:::i;1289:44:11:-;1284:157;;39008:10:9;1355:20:11;1367:7;1355:11;:20::i;:::-;-1:-1:-1;;;;;1355:43:11;;1351:90;;1407:34;;-1:-1:-1;;;1407:34:11;;;;;;;;;;;1351:90;1452:24;;;;:15;:24;;;;;;;;;-1:-1:-1;;;;;1519:22:11;;562:3;1480:35;;;-1:-1:-1;;;1480:35:11;1479:62;;1452:89;;;1557:34;;-1:-1:-1;;;;;22716:31:15;;22698:50;;1452:24:11;;1557:34;;22671:18:15;1557:34:11;;;;;;;1102:496;984:614;;;:::o;7163:172:8:-;1094:13:0;:11;:13::i;:::-;7280:32:8::1;:48:::0;7163:172::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;22961:2:15;2161:73:0::1;::::0;::::1;22943:21:15::0;23000:2;22980:18;;;22973:30;23039:34;23019:18;;;23012:62;-1:-1:-1;;;23090:18:15;;;23083:36;23136:19;;2161:73:0::1;22759:402:15::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;966:93:8:-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;966:93:8;;-1:-1:-1;966:93:8;:::o;9112:630:9:-;9197:4;-1:-1:-1;;;;;;;;;9515:25:9;;;;:101;;-1:-1:-1;;;;;;;;;;9591:25:9;;;9515:101;:177;;;-1:-1:-1;;;;;;;;9667:25:9;-1:-1:-1;;;9667:25:9;;9112:630::o;1408:213:4:-;1510:4;-1:-1:-1;;;;;;1533:41:4;;-1:-1:-1;;;1533:41:4;;:81;;-1:-1:-1;;;;;;;;;;937:40:6;;;1578:36:4;829:155:6;2692:333:11;2796:4;2953:36;2977:11;2953:23;:36::i;:::-;:65;;;-1:-1:-1;;;;;;;;2993:25:11;-1:-1:-1;;;2993:25:11;;2692:333::o;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;39008:10:9;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;23368:2:15;1414:68:0;;;23350:21:15;;;23387:18;;;23380:30;23446:34;23426:18;;;23419:62;23498:18;;1414:68:0;23166:356:15;2734:327:4;2461:5;-1:-1:-1;;;;;2836:33:4;;;;2828:88;;;;-1:-1:-1;;;2828:88:4;;23729:2:15;2828:88:4;;;23711:21:15;23768:2;23748:18;;;23741:30;23807:34;23787:18;;;23780:62;-1:-1:-1;;;23858:18:15;;;23851:40;23908:19;;2828:88:4;23527:406:15;2828:88:4;-1:-1:-1;;;;;2934:22:4;;2926:60;;;;-1:-1:-1;;;2926:60:4;;24140:2:15;2926:60:4;;;24122:21:15;24179:2;24159:18;;;24152:30;24218:27;24198:18;;;24191:55;24263:18;;2926:60:4;23938:349:15;2926:60:4;3019:35;;;;;;;;;-1:-1:-1;;;;;3019:35:4;;;;;;-1:-1:-1;;;;;3019:35:4;;;;;;;;;;-1:-1:-1;;;2997:57:4;;;;:19;:57;2734:327::o;17714:277:9:-;17779:4;17833:7;3565:1:8;17814:26:9;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;-1:-1:-1;;17916:26:9;;;;:17;:26;;;;;;-1:-1:-1;;;17916:44:9;:49;;17714:277::o;12472:1249::-;12539:7;12573;;3565:1:8;12619:23:9;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:23;;;:17;:23;;;;;;;-1:-1:-1;;;12812:24:9;;:29;;12808:831;;13467:111;13474:6;13484:1;13474:11;13467:111;;-1:-1:-1;;;13544:6:9;13526:25;;;;:17;:25;;;;;;13467:111;;12808:831;12686:971;12660:997;13683:31;;-1:-1:-1;;;13683:31:9;;;;;;;;;;;10908:564:8;1239:19:2;:17;:19::i;:::-;11160:24:8::1;::::0;11118:114:::1;::::0;-1:-1:-1;;;11118:114:8;;11221:10:::1;11118:114;::::0;::::1;2048:51:15::0;11089:26:8::1;::::0;-1:-1:-1;;;;;11160:24:8::1;::::0;11118:102:::1;::::0;2021:18:15;;11118:114:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11263:28;::::0;11089:143;;-1:-1:-1;11263:28:8::1;;::::0;:90:::1;;-1:-1:-1::0;11312:41:8::1;::::0;;;:21:::1;:41;::::0;;;;;::::1;;11311:42;11263:90;11242:157;;;::::0;-1:-1:-1;;;11242:157:8;;24683:2:15;11242:157:8::1;::::0;::::1;24665:21:15::0;24722:2;24702:18;;;24695:30;-1:-1:-1;;;24741:18:15;;;24734:50;24801:18;;11242:157:8::1;24481:344:15::0;11242:157:8::1;11409:56;23525:388:9::0;2433:117:2;1486:16;:14;:16::i;:::-;2491:7:::1;:15:::0;;-1:-1:-1;;;;2491:15:2::1;::::0;;2521:22:::1;39008:10:9::0;2530:12:2::1;2521:22;::::0;-1:-1:-1;;;;;2066:32:15;;;2048:51;;2036:2;2021:18;2521:22:2::1;;;;;;;2433:117::o:0;:187:0:-;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;32908:110:9:-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;2186:115:2:-;1239:19;:17;:19::i;:::-;2245:7:::1;:14:::0;;-1:-1:-1;;;;2245:14:2::1;-1:-1:-1::0;;;2245:14:2::1;::::0;;2274:20:::1;2281:12;39008:10:9::0;;38922:103;11936:159;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12063:24:9;;;;:17;:24;;;;;;12044:44;;:18;:44::i;25939:697::-;26117:88;;-1:-1:-1;;;26117:88:9;;26097:4;;-1:-1:-1;;;;;26117:45:9;;;;;:88;;39008:10;;26184:4;;26190:7;;26199:5;;26117:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26117:88:9;;;;;;;;-1:-1:-1;;26117:88:9;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26395:6;:13;26412:1;26395:18;26391:229;;26440:40;;-1:-1:-1;;;26440:40:9;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;-1:-1:-1;;;;;;26273:64:9;-1:-1:-1;;;26273:64:9;;-1:-1:-1;25939:697:9;;;;;;:::o;11681:164::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11791:47:9;11810:27;11829:7;11810:18;:27::i;:::-;11791:18;:47::i;3249:111:8:-;3309:13;3341:12;3334:19;;;;;:::i;39122:1548:9:-;39599:4;39593:11;;39606:4;39589:22;39683:17;;;;39589:22;40033:5;40015:419;40080:1;40075:3;40071:11;40064:18;;40248:2;40242:4;40238:13;40234:2;40230:22;40225:3;40217:36;40340:2;40330:13;;40395:25;40015:419;40395:25;-1:-1:-1;40462:13:9;;;-1:-1:-1;;40575:14:9;;;40635:19;;;40575:14;39122:1548;-1:-1:-1;39122:1548:9:o;1767:106:2:-;1685:7;;-1:-1:-1;;;1685:7:2;;;;1836:9;1828:38;;;;-1:-1:-1;;;1828:38:2;;25780:2:15;1828:38:2;;;25762:21:15;25819:2;25799:18;;;25792:30;-1:-1:-1;;;25838:18:15;;;25831:46;25894:18;;1828:38:2;25578:340:15;1945:106:2;1685:7;;-1:-1:-1;;;1685:7:2;;;;2003:41;;;;-1:-1:-1;;;2003:41:2;;26125:2:15;2003:41:2;;;26107:21:15;26164:2;26144:18;;;26137:30;-1:-1:-1;;;26183:18:15;;;26176:50;26243:18;;2003:41:2;25923:344:15;32160:669:9;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;-1:-1:-1;;;;;32344:14:9;;;:19;32340:473;;32383:11;32397:13;32444:14;;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;-1:-1:-1;;;32603:40:9;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;13815:361;-1:-1:-1;;;;;;;;;;;;;13924:41:9;;;;1961:3;14009:33;;;-1:-1:-1;;;;;13975:68:9;-1:-1:-1;;;13975:68:9;-1:-1:-1;;;14072:24:9;;:29;;-1:-1:-1;;;14053:48:9;;;;2470:3;14140:28;;;;-1:-1:-1;;;14111:58:9;-1:-1:-1;13815:361:9:o;27082:2396::-;27154:20;27177:13;;;27204;;;27200:44;;27226:18;;-1:-1:-1;;;27226:18:9;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;-1:-1:-1;;;;;27719:22:9;;;;;;:18;:22;;;;1452:2;27719:22;;;:71;;27757:32;27745:45;;27719:71;;;28026:31;;;:17;:31;;;;;-1:-1:-1;15080:15:9;;15054:24;15050:46;14660:11;14635:23;14631:41;14628:52;14618:63;;28026:170;;28255:23;;;;28026:31;;27719:22;;28744:25;27719:22;;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29084:15;28946:339;;;28950:75;29316:8;29328:1;29316:13;29312:45;;29338:19;;-1:-1:-1;;;29338:19:9;;;;;;;;;;;29312:45;29372:13;:19;-1:-1:-1;22765:179:9;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:15;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;961:250::-;1046:1;1056:113;1070:6;1067:1;1064:13;1056:113;;;1146:11;;;1140:18;1127:11;;;1120:39;1092:2;1085:10;1056:113;;;-1:-1:-1;;1203:1:15;1185:16;;1178:27;961:250::o;1216:271::-;1258:3;1296:5;1290:12;1323:6;1318:3;1311:19;1339:76;1408:6;1401:4;1396:3;1392:14;1385:4;1378:5;1374:16;1339:76;:::i;:::-;1469:2;1448:15;-1:-1:-1;;1444:29:15;1435:39;;;;1476:4;1431:50;;1216:271;-1:-1:-1;;1216:271:15:o;1492:220::-;1641:2;1630:9;1623:21;1604:4;1661:45;1702:2;1691:9;1687:18;1679:6;1661:45;:::i;1717:180::-;1776:6;1829:2;1817:9;1808:7;1804:23;1800:32;1797:52;;;1845:1;1842;1835:12;1797:52;-1:-1:-1;1868:23:15;;1717:180;-1:-1:-1;1717:180:15:o;2110:254::-;2178:6;2186;2239:2;2227:9;2218:7;2214:23;2210:32;2207:52;;;2255:1;2252;2245:12;2207:52;2278:29;2297:9;2278:29;:::i;:::-;2268:39;2354:2;2339:18;;;;2326:32;;-1:-1:-1;;;2110:254:15:o;2551:328::-;2628:6;2636;2644;2697:2;2685:9;2676:7;2672:23;2668:32;2665:52;;;2713:1;2710;2703:12;2665:52;2736:29;2755:9;2736:29;:::i;:::-;2726:39;;2784:38;2818:2;2807:9;2803:18;2784:38;:::i;:::-;2774:48;;2869:2;2858:9;2854:18;2841:32;2831:42;;2551:328;;;;;:::o;2884:248::-;2952:6;2960;3013:2;3001:9;2992:7;2988:23;2984:32;2981:52;;;3029:1;3026;3019:12;2981:52;-1:-1:-1;;3052:23:15;;;3122:2;3107:18;;;3094:32;;-1:-1:-1;2884:248:15:o;3416:292::-;3474:6;3527:2;3515:9;3506:7;3502:23;3498:32;3495:52;;;3543:1;3540;3533:12;3495:52;3582:9;3569:23;-1:-1:-1;;;;;3625:5:15;3621:38;3614:5;3611:49;3601:77;;3674:1;3671;3664:12;3713:592;3784:6;3792;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3901:9;3888:23;-1:-1:-1;;;;;3971:2:15;3963:6;3960:14;3957:34;;;3987:1;3984;3977:12;3957:34;4025:6;4014:9;4010:22;4000:32;;4070:7;4063:4;4059:2;4055:13;4051:27;4041:55;;4092:1;4089;4082:12;4041:55;4132:2;4119:16;4158:2;4150:6;4147:14;4144:34;;;4174:1;4171;4164:12;4144:34;4219:7;4214:2;4205:6;4201:2;4197:15;4193:24;4190:37;4187:57;;;4240:1;4237;4230:12;4187:57;4271:2;4263:11;;;;;4293:6;;-1:-1:-1;3713:592:15;;-1:-1:-1;;;;3713:592:15:o;4310:367::-;4373:8;4383:6;4437:3;4430:4;4422:6;4418:17;4414:27;4404:55;;4455:1;4452;4445:12;4404:55;-1:-1:-1;4478:20:15;;-1:-1:-1;;;;;4510:30:15;;4507:50;;;4553:1;4550;4543:12;4507:50;4590:4;4582:6;4578:17;4566:29;;4650:3;4643:4;4633:6;4630:1;4626:14;4618:6;4614:27;4610:38;4607:47;4604:67;;;4667:1;4664;4657:12;4682:437;4768:6;4776;4829:2;4817:9;4808:7;4804:23;4800:32;4797:52;;;4845:1;4842;4835:12;4797:52;4885:9;4872:23;-1:-1:-1;;;;;4910:6:15;4907:30;4904:50;;;4950:1;4947;4940:12;4904:50;4989:70;5051:7;5042:6;5031:9;5027:22;4989:70;:::i;:::-;5078:8;;4963:96;;-1:-1:-1;4682:437:15;-1:-1:-1;;;;4682:437:15:o;5124:349::-;5208:12;;-1:-1:-1;;;;;5204:38:15;5192:51;;5296:4;5285:16;;;5279:23;-1:-1:-1;;;;;5275:48:15;5259:14;;;5252:72;5387:4;5376:16;;;5370:23;5363:31;5356:39;5340:14;;;5333:63;5449:4;5438:16;;;5432:23;5457:8;5428:38;5412:14;;5405:62;5124:349::o;5478:724::-;5713:2;5765:21;;;5835:13;;5738:18;;;5857:22;;;5684:4;;5713:2;5936:15;;;;5910:2;5895:18;;;5684:4;5979:197;5993:6;5990:1;5987:13;5979:197;;;6042:52;6090:3;6081:6;6075:13;6042:52;:::i;:::-;6151:15;;;;6123:4;6114:14;;;;;6015:1;6008:9;5979:197;;6207:773;6329:6;6337;6345;6353;6406:2;6394:9;6385:7;6381:23;6377:32;6374:52;;;6422:1;6419;6412:12;6374:52;6462:9;6449:23;-1:-1:-1;;;;;6532:2:15;6524:6;6521:14;6518:34;;;6548:1;6545;6538:12;6518:34;6587:70;6649:7;6640:6;6629:9;6625:22;6587:70;:::i;:::-;6676:8;;-1:-1:-1;6561:96:15;-1:-1:-1;6764:2:15;6749:18;;6736:32;;-1:-1:-1;6780:16:15;;;6777:36;;;6809:1;6806;6799:12;6777:36;;6848:72;6912:7;6901:8;6890:9;6886:24;6848:72;:::i;:::-;6207:773;;;;-1:-1:-1;6939:8:15;-1:-1:-1;;;;6207:773:15:o;6985:632::-;7156:2;7208:21;;;7278:13;;7181:18;;;7300:22;;;7127:4;;7156:2;7379:15;;;;7353:2;7338:18;;;7127:4;7422:169;7436:6;7433:1;7430:13;7422:169;;;7497:13;;7485:26;;7566:15;;;;7531:12;;;;7458:1;7451:9;7422:169;;7622:160;7687:20;;7743:13;;7736:21;7726:32;;7716:60;;7772:1;7769;7762:12;7787:180;7843:6;7896:2;7884:9;7875:7;7871:23;7867:32;7864:52;;;7912:1;7909;7902:12;7864:52;7935:26;7951:9;7935:26;:::i;8747:322::-;8824:6;8832;8840;8893:2;8881:9;8872:7;8868:23;8864:32;8861:52;;;8909:1;8906;8899:12;8861:52;8932:29;8951:9;8932:29;:::i;:::-;8922:39;9008:2;8993:18;;8980:32;;-1:-1:-1;9059:2:15;9044:18;;;9031:32;;8747:322;-1:-1:-1;;;8747:322:15:o;9074:254::-;9139:6;9147;9200:2;9188:9;9179:7;9175:23;9171:32;9168:52;;;9216:1;9213;9206:12;9168:52;9239:29;9258:9;9239:29;:::i;:::-;9229:39;;9287:35;9318:2;9307:9;9303:18;9287:35;:::i;:::-;9277:45;;9074:254;;;;;:::o;9333:127::-;9394:10;9389:3;9385:20;9382:1;9375:31;9425:4;9422:1;9415:15;9449:4;9446:1;9439:15;9465:1138;9560:6;9568;9576;9584;9637:3;9625:9;9616:7;9612:23;9608:33;9605:53;;;9654:1;9651;9644:12;9605:53;9677:29;9696:9;9677:29;:::i;:::-;9667:39;;9725:38;9759:2;9748:9;9744:18;9725:38;:::i;:::-;9715:48;;9810:2;9799:9;9795:18;9782:32;9772:42;;9865:2;9854:9;9850:18;9837:32;-1:-1:-1;;;;;9929:2:15;9921:6;9918:14;9915:34;;;9945:1;9942;9935:12;9915:34;9983:6;9972:9;9968:22;9958:32;;10028:7;10021:4;10017:2;10013:13;10009:27;9999:55;;10050:1;10047;10040:12;9999:55;10086:2;10073:16;10108:2;10104;10101:10;10098:36;;;10114:18;;:::i;:::-;10189:2;10183:9;10157:2;10243:13;;-1:-1:-1;;10239:22:15;;;10263:2;10235:31;10231:40;10219:53;;;10287:18;;;10307:22;;;10284:46;10281:72;;;10333:18;;:::i;:::-;10373:10;10369:2;10362:22;10408:2;10400:6;10393:18;10448:7;10443:2;10438;10434;10430:11;10426:20;10423:33;10420:53;;;10469:1;10466;10459:12;10420:53;10525:2;10520;10516;10512:11;10507:2;10499:6;10495:15;10482:46;10570:1;10565:2;10560;10552:6;10548:15;10544:24;10537:35;10591:6;10581:16;;;;;;;9465:1138;;;;;;;:::o;10821:268::-;11019:3;11004:19;;11032:51;11008:9;11065:6;11032:51;:::i;11094:426::-;11170:6;11178;11186;11239:2;11227:9;11218:7;11214:23;11210:32;11207:52;;;11255:1;11252;11245:12;11207:52;11291:9;11278:23;11268:33;;11320:38;11354:2;11343:9;11339:18;11320:38;:::i;:::-;11310:48;;11408:2;11397:9;11393:18;11380:32;-1:-1:-1;;;;;11445:5:15;11441:30;11434:5;11431:41;11421:69;;11486:1;11483;11476:12;11421:69;11509:5;11499:15;;;11094:426;;;;;:::o;11525:260::-;11593:6;11601;11654:2;11642:9;11633:7;11629:23;11625:32;11622:52;;;11670:1;11667;11660:12;11622:52;11693:29;11712:9;11693:29;:::i;:::-;11683:39;;11741:38;11775:2;11764:9;11760:18;11741:38;:::i;12150:380::-;12229:1;12225:12;;;;12272;;;12293:61;;12347:4;12339:6;12335:17;12325:27;;12293:61;12400:2;12392:6;12389:14;12369:18;12366:38;12363:161;;12446:10;12441:3;12437:20;12434:1;12427:31;12481:4;12478:1;12471:15;12509:4;12506:1;12499:15;12363:161;;12150:380;;;:::o;12890:127::-;12951:10;12946:3;12942:20;12939:1;12932:31;12982:4;12979:1;12972:15;13006:4;13003:1;12996:15;13022:168;13095:9;;;13126;;13143:15;;;13137:22;;13123:37;13113:71;;13164:18;;:::i;13195:217::-;13235:1;13261;13251:132;;13305:10;13300:3;13296:20;13293:1;13286:31;13340:4;13337:1;13330:15;13368:4;13365:1;13358:15;13251:132;-1:-1:-1;13397:9:15;;13195:217::o;14129:127::-;14190:10;14185:3;14181:20;14178:1;14171:31;14221:4;14218:1;14211:15;14245:4;14242:1;14235:15;14261:135;14300:3;14321:17;;;14318:43;;14341:18;;:::i;:::-;-1:-1:-1;14388:1:15;14377:13;;14261:135::o;14880:545::-;14982:2;14977:3;14974:11;14971:448;;;15018:1;15043:5;15039:2;15032:17;15088:4;15084:2;15074:19;15158:2;15146:10;15142:19;15139:1;15135:27;15129:4;15125:38;15194:4;15182:10;15179:20;15176:47;;;-1:-1:-1;15217:4:15;15176:47;15272:2;15267:3;15263:12;15260:1;15256:20;15250:4;15246:31;15236:41;;15327:82;15345:2;15338:5;15335:13;15327:82;;;15390:17;;;15371:1;15360:13;15327:82;;15601:1206;-1:-1:-1;;;;;15720:3:15;15717:27;15714:53;;;15747:18;;:::i;:::-;15776:94;15866:3;15826:38;15858:4;15852:11;15826:38;:::i;:::-;15820:4;15776:94;:::i;:::-;15896:1;15921:2;15916:3;15913:11;15938:1;15933:616;;;;16593:1;16610:3;16607:93;;;-1:-1:-1;16666:19:15;;;16653:33;16607:93;-1:-1:-1;;15558:1:15;15554:11;;;15550:24;15546:29;15536:40;15582:1;15578:11;;;15533:57;16713:78;;15906:895;;15933:616;14827:1;14820:14;;;14864:4;14851:18;;-1:-1:-1;;15969:17:15;;;16070:9;16092:229;16106:7;16103:1;16100:14;16092:229;;;16195:19;;;16182:33;16167:49;;16302:4;16287:20;;;;16255:1;16243:14;;;;16122:12;16092:229;;;16096:3;16349;16340:7;16337:16;16334:159;;;16473:1;16469:6;16463:3;16457;16454:1;16450:11;16446:21;16442:34;16438:39;16425:9;16420:3;16416:19;16403:33;16399:79;16391:6;16384:95;16334:159;;;16536:1;16530:3;16527:1;16523:11;16519:19;16513:4;16506:33;15906:895;;15601:1206;;;:::o;17227:125::-;17292:9;;;17313:10;;;17310:36;;;17326:18;;:::i;21692:496::-;21871:3;21909:6;21903:13;21925:66;21984:6;21979:3;21972:4;21964:6;21960:17;21925:66;:::i;:::-;22054:13;;22013:16;;;;22076:70;22054:13;22013:16;22123:4;22111:17;;22076:70;:::i;:::-;22162:20;;21692:496;-1:-1:-1;;;;21692:496:15:o;24292:184::-;24362:6;24415:2;24403:9;24394:7;24390:23;24386:32;24383:52;;;24431:1;24428;24421:12;24383:52;-1:-1:-1;24454:16:15;;24292:184;-1:-1:-1;24292:184:15:o;24830:489::-;-1:-1:-1;;;;;25099:15:15;;;25081:34;;25151:15;;25146:2;25131:18;;25124:43;25198:2;25183:18;;25176:34;;;25246:3;25241:2;25226:18;;25219:31;;;25024:4;;25267:46;;25293:19;;25285:6;25267:46;:::i;:::-;25259:54;24830:489;-1:-1:-1;;;;;;24830:489:15:o;25324:249::-;25393:6;25446:2;25434:9;25425:7;25421:23;25417:32;25414:52;;;25462:1;25459;25452:12;25414:52;25494:9;25488:16;25513:30;25537:5;25513:30;:::i

Swarm Source

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