ETH Price: $3,263.91 (-0.61%)
Gas: 2 Gwei

Token

Pastel Waves Abstraction (PastelWave)
 

Overview

Max Total Supply

222 PastelWave

Holders

89

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 PastelWave
0x6db4b5bA00144FB96099d830f73029C43BA44374
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:
PastelWaves

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-05
*/

// SPDX-License-Identifier: MIT

//██████╗░░█████╗░░██████╗████████╗███████╗██╗░░░░░  ░██╗░░░░░░░██╗░█████╗░██╗░░░██╗███████╗░██████╗
//██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██╔════╝██║░░░░░  ░██║░░██╗░░██║██╔══██╗██║░░░██║██╔════╝██╔════╝
//██████╔╝███████║╚█████╗░░░░██║░░░█████╗░░██║░░░░░  ░╚██╗████╗██╔╝███████║╚██╗░██╔╝█████╗░░╚█████╗░
//██╔═══╝░██╔══██║░╚═══██╗░░░██║░░░██╔══╝░░██║░░░░░  ░░████╔═████║░██╔══██║░╚████╔╝░██╔══╝░░░╚═══██╗
//██║░░░░░██║░░██║██████╔╝░░░██║░░░███████╗███████╗  ░░╚██╔╝░╚██╔╝░██║░░██║░░╚██╔╝░░███████╗██████╔╝
//╚═╝░░░░░╚═╝░░╚═╝╚═════╝░░░░╚═╝░░░╚══════╝╚══════╝  ░░░╚═╝░░░╚═╝░░╚═╝░░╚═╝░░░╚═╝░░░╚══════╝╚═════╝░

//░█████╗░██████╗░░██████╗████████╗██████╗░░█████╗░░█████╗░████████╗██╗░█████╗░███╗░░██╗
//██╔══██╗██╔══██╗██╔════╝╚══██╔══╝██╔══██╗██╔══██╗██╔══██╗╚══██╔══╝██║██╔══██╗████╗░██║
//███████║██████╦╝╚█████╗░░░░██║░░░██████╔╝███████║██║░░╚═╝░░░██║░░░██║██║░░██║██╔██╗██║
//██╔══██║██╔══██╗░╚═══██╗░░░██║░░░██╔══██╗██╔══██║██║░░██╗░░░██║░░░██║██║░░██║██║╚████║
//██║░░██║██████╦╝██████╔╝░░░██║░░░██║░░██║██║░░██║╚█████╔╝░░░██║░░░██║╚█████╔╝██║░╚███║

pragma solidity ^0.8.7;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

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

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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


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


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

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

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

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

/////////////////////////////////////////////////////////////////////////////////////////
///  ИЗМЕНЯТЬ ПРОЕКТ ЗДЕСЬ //////////////////////////////////////////////////////////////
///  ВВЕСТИ СУППЛАЙ, ЦЕНУ, МАКС МИНТОВ НА ТРАНЗАКЦИЮ, МАКС ФРИМИНТОВ ////////////////////
///  ЦЕНУ В ДВУХ ПОЛЯХ ВВЕСТИ////////////////////////////////////////////////////////////
/// ПОСЛЕ КОНТРАКТ ПИСАТЬ НАЗВАНИЕ КОНТРАКТА ////////////////////////////////////////////
contract PastelWaves is ERC721A, DefaultOperatorFilterer {
    uint256 public maxSupply = 222; 
    uint256 private price = 0.001 ether;
    string public ShowPrice = "0.001 ether";
    uint256 private maxPerTx = 10;
    string public baseURI;
    error LengthsDoNotMatch();

    function WaveMint(uint256 amount) payable public {
        require(totalSupply() + amount <= maxSupply);
        require(amount <= maxPerTx);
        require(msg.value >= amount * price);
        _safeMint(msg.sender, amount);
    }


    function batchMintForAddresses(address[] calldata addresses_, uint256[] calldata amounts_) external onlyOwner {
        if (addresses_.length != amounts_.length) revert LengthsDoNotMatch();
        unchecked {
            for (uint32 i = 0; i < addresses_.length; i++) {
                _mint(addresses_[i], amounts_[i]);
            }
        }
    }

    address public owner;
    modifier onlyOwner {
        require(owner == msg.sender);
        _;
    }
/////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////// ВНУТРИ ERC721A ПИСАТЬ НАЗВАНИЕ КОЛЛЕКЦИИ (ОПЕНСИ) И НАЗВАНИЕ ТОКЕНА ////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
    constructor() ERC721A("Pastel Waves Abstraction", "PastelWave") {
        owner = msg.sender;
    }
    
    function setPrice(uint256 newPrice, uint256 maxPerT) external onlyOwner {
        price = newPrice;
        maxPerTx = maxPerT;
    }

/////// ФУНКЦИЯ ДЛЯ ЗАГРУЗКИ МЕТАДАННЫХ, МЕТАДАННЫЕ СОЗДАВАТЬ НА mintplex.xyz, через NFT UP //////
    function setBaseURI(string memory newBaseURI_) external onlyOwner {
        baseURI = newBaseURI_;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(baseURI, _toString(tokenId), ".json"));
    }
    
    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function cutS(uint256 maxT) external onlyOwner {
        maxSupply = maxT;
    }

    /////////////////////////////
    // OPENSEA FILTER REGISTRY 
    /////////////////////////////

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"LengthsDoNotMatch","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ShowPrice","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaveMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"batchMintForAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxT","type":"uint256"}],"name":"cutS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerT","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260de60085566038d7ea4c680006009556040518060400160405280600b81526020017f302e303031206574686572000000000000000000000000000000000000000000815250600a90805190602001906200006192919062000389565b50600a600b553480156200007457600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601881526020017f50617374656c205761766573204162737472616374696f6e00000000000000008152506040518060400160405280600a81526020017f50617374656c576176650000000000000000000000000000000000000000000081525081600290805190602001906200011092919062000389565b5080600390805190602001906200012992919062000389565b506200013a6200038060201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000337578015620001fd576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001c392919062000467565b600060405180830381600087803b158015620001de57600080fd5b505af1158015620001f3573d6000803e3d6000fd5b5050505062000336565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002b7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200027d92919062000467565b600060405180830381600087803b1580156200029857600080fd5b505af1158015620002ad573d6000803e3d6000fd5b5050505062000335565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200030091906200044a565b600060405180830381600087803b1580156200031b57600080fd5b505af115801562000330573d6000803e3d6000fd5b505050505b5b5b505033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200052d565b60006001905090565b8280546200039790620004c8565b90600052602060002090601f016020900481019282620003bb576000855562000407565b82601f10620003d657805160ff191683800117855562000407565b8280016001018555821562000407579182015b8281111562000406578251825591602001919060010190620003e9565b5b5090506200041691906200041a565b5090565b5b80821115620004355760008160009055506001016200041b565b5090565b620004448162000494565b82525050565b600060208201905062000461600083018462000439565b92915050565b60006040820190506200047e600083018562000439565b6200048d602083018462000439565b9392505050565b6000620004a182620004a8565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004e157607f821691505b60208210811415620004f857620004f7620004fe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612e42806200053d6000396000f3fe6080604052600436106101665760003560e01c80636c0360eb116100d1578063b27fc69c1161008a578063d5abeb0111610064578063d5abeb01146104e7578063de53f38a14610512578063e985e9c51461053b578063f7d975771461057857610166565b8063b27fc69c14610472578063b88d4fde1461048e578063c87b56dd146104aa57610166565b80636c0360eb1461036257806370a082311461038d57806370f02af4146103ca5780638da5cb5b146103f357806395d89b411461041e578063a22cb4651461044957610166565b806323b872dd1161012357806323b872dd146102825780633ccfd60b1461029e57806341f43434146102b557806342842e0e146102e057806355f804b3146102fc5780636352211e1461032557610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c5780631b5a29c614610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125fb565b6105a1565b60405161019f919061294b565b60405180910390f35b3480156101b457600080fd5b506101bd610633565b6040516101ca9190612981565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061269e565b6106c5565b60405161020791906128bb565b60405180910390f35b61022a6004803603810190610225919061250d565b610744565b005b34801561023857600080fd5b5061024161085d565b60405161024e91906129a3565b60405180910390f35b34801561026357600080fd5b5061026c610874565b6040516102799190612981565b60405180910390f35b61029c600480360381019061029791906123f7565b610902565b005b3480156102aa57600080fd5b506102b3610a62565b005b3480156102c157600080fd5b506102ca610b05565b6040516102d79190612966565b60405180910390f35b6102fa60048036038101906102f591906123f7565b610b17565b005b34801561030857600080fd5b50610323600480360381019061031e9190612655565b610c77565b005b34801561033157600080fd5b5061034c6004803603810190610347919061269e565b610ceb565b60405161035991906128bb565b60405180910390f35b34801561036e57600080fd5b50610377610cfd565b6040516103849190612981565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061238a565b610d8b565b6040516103c191906129a3565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061269e565b610e44565b005b3480156103ff57600080fd5b50610408610ea8565b60405161041591906128bb565b60405180910390f35b34801561042a57600080fd5b50610433610ece565b6040516104409190612981565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906124cd565b610f60565b005b61048c6004803603810190610487919061269e565b611079565b005b6104a860048036038101906104a3919061244a565b6110d0565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061269e565b611233565b6040516104de9190612981565b60405180910390f35b3480156104f357600080fd5b506104fc611267565b60405161050991906129a3565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061254d565b61126d565b005b34801561054757600080fd5b50610562600480360381019061055d91906123b7565b611384565b60405161056f919061294b565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906126cb565b611418565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461064290612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90612c39565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b60006106d082611484565b610706576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561084e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016107bc9291906128d6565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c91906125ce565b61084d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161084491906128bb565b60405180910390fd5b5b61085883836114e3565b505050565b6000610867611627565b6001546000540303905090565b600a805461088190612c39565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90612c39565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a50573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097557610970848484611630565b610a5c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016109be9291906128d6565b60206040518083038186803b1580156109d657600080fd5b505afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906125ce565b610a4f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a4691906128bb565b60405180910390fd5b5b610a5b848484611630565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b02573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c65573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b8a57610b85848484611955565b610c71565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bd39291906128d6565b60206040518083038186803b158015610beb57600080fd5b505afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906125ce565b610c6457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c5b91906128bb565b60405180910390fd5b5b610c70848484611955565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd157600080fd5b80600c9080519060200190610ce79291906120dd565b5050565b6000610cf682611975565b9050919050565b600c8054610d0a90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3690612c39565b8015610d835780601f10610d5857610100808354040283529160200191610d83565b820191906000526020600020905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b8060088190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610edd90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990612c39565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561106a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fd89291906128d6565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102891906125ce565b61106957806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161106091906128bb565b60405180910390fd5b5b6110748383611a43565b505050565b6008548161108561085d565b61108f9190612a9d565b111561109a57600080fd5b600b548111156110a957600080fd5b600954816110b79190612af3565b3410156110c357600080fd5b6110cd3382611b4e565b50565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561121f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111445761113f85858585611b6c565b61122c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161118d9291906128d6565b60206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd91906125ce565b61121e57336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161121591906128bb565b60405180910390fd5b5b61122b85858585611b6c565b5b5050505050565b6060600c61124083611bdf565b60405160200161125192919061288c565b6040516020818303038152906040529050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c757600080fd5b818190508484905014611306576040517faa81c86100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508163ffffffff16101561137d5761137085858363ffffffff1681811061133657611335612cfa565b5b905060200201602081019061134b919061238a565b84848463ffffffff1681811061136457611363612cfa565b5b90506020020135611c38565b8080600101915050611309565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b8160098190555080600b819055505050565b60008161148f611627565b1115801561149e575060005482105b80156114dc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006114ee82610ceb565b90508073ffffffffffffffffffffffffffffffffffffffff1661150f611df5565b73ffffffffffffffffffffffffffffffffffffffff16146115725761153b81611536611df5565b611384565b611571576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061163b82611975565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116a2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116ae84611dfd565b915091506116c481876116bf611df5565b611e24565b611710576116d9866116d4611df5565b611384565b61170f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611777576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117848686866001611e68565b801561178f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185d85611839888887611e6e565b7c020000000000000000000000000000000000000000000000000000000017611e96565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156118e55760006001850190506000600460008381526020019081526020016000205414156118e35760005481146118e2578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194d8686866001611ec1565b505050505050565b611970838383604051806020016040528060008152506110d0565b505050565b60008082905080611984611627565b11611a0c57600054811015611a0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a09575b60008114156119ff5760046000836001900393508381526020019081526020016000205490506119d4565b8092505050611a3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060076000611a50611df5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd611df5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b42919061294b565b60405180910390a35050565b611b68828260405180602001604052806000815250611ec7565b5050565b611b77848484610902565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bd957611ba284848484611f64565b611bd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b600115611c2357600184039350600a81066030018453600a8104905080611c1e57611c23565b611bf8565b50828103602084039350808452505050919050565b6000805490506000821415611c79576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c866000848385611e68565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cfd83611cee6000866000611e6e565b611cf7856120c4565b17611e96565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611d9e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611d63565b506000821415611dda576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611df06000848385611ec1565b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e858686846120d4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ed18383611c38565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f5f57600080549050600083820390505b611f116000868380600101945086611f64565b611f47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611efe578160005414611f5c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f8a611df5565b8786866040518563ffffffff1660e01b8152600401611fac94939291906128ff565b602060405180830381600087803b158015611fc657600080fd5b505af1925050508015611ff757506040513d601f19601f82011682018060405250810190611ff49190612628565b60015b612071573d8060008114612027576040519150601f19603f3d011682016040523d82523d6000602084013e61202c565b606091505b50600081511415612069576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60006001821460e11b9050919050565b60009392505050565b8280546120e990612c39565b90600052602060002090601f01602090048101928261210b5760008555612152565b82601f1061212457805160ff1916838001178555612152565b82800160010185558215612152579182015b82811115612151578251825591602001919060010190612136565b5b50905061215f9190612163565b5090565b5b8082111561217c576000816000905550600101612164565b5090565b600061219361218e846129e3565b6129be565b9050828152602081018484840111156121af576121ae612d67565b5b6121ba848285612bf7565b509392505050565b60006121d56121d084612a14565b6129be565b9050828152602081018484840111156121f1576121f0612d67565b5b6121fc848285612bf7565b509392505050565b60008135905061221381612db0565b92915050565b60008083601f84011261222f5761222e612d5d565b5b8235905067ffffffffffffffff81111561224c5761224b612d58565b5b60208301915083602082028301111561226857612267612d62565b5b9250929050565b60008083601f84011261228557612284612d5d565b5b8235905067ffffffffffffffff8111156122a2576122a1612d58565b5b6020830191508360208202830111156122be576122bd612d62565b5b9250929050565b6000813590506122d481612dc7565b92915050565b6000815190506122e981612dc7565b92915050565b6000813590506122fe81612dde565b92915050565b60008151905061231381612dde565b92915050565b600082601f83011261232e5761232d612d5d565b5b813561233e848260208601612180565b91505092915050565b600082601f83011261235c5761235b612d5d565b5b813561236c8482602086016121c2565b91505092915050565b60008135905061238481612df5565b92915050565b6000602082840312156123a05761239f612d71565b5b60006123ae84828501612204565b91505092915050565b600080604083850312156123ce576123cd612d71565b5b60006123dc85828601612204565b92505060206123ed85828601612204565b9150509250929050565b6000806000606084860312156124105761240f612d71565b5b600061241e86828701612204565b935050602061242f86828701612204565b925050604061244086828701612375565b9150509250925092565b6000806000806080858703121561246457612463612d71565b5b600061247287828801612204565b945050602061248387828801612204565b935050604061249487828801612375565b925050606085013567ffffffffffffffff8111156124b5576124b4612d6c565b5b6124c187828801612319565b91505092959194509250565b600080604083850312156124e4576124e3612d71565b5b60006124f285828601612204565b9250506020612503858286016122c5565b9150509250929050565b6000806040838503121561252457612523612d71565b5b600061253285828601612204565b925050602061254385828601612375565b9150509250929050565b6000806000806040858703121561256757612566612d71565b5b600085013567ffffffffffffffff81111561258557612584612d6c565b5b61259187828801612219565b9450945050602085013567ffffffffffffffff8111156125b4576125b3612d6c565b5b6125c08782880161226f565b925092505092959194509250565b6000602082840312156125e4576125e3612d71565b5b60006125f2848285016122da565b91505092915050565b60006020828403121561261157612610612d71565b5b600061261f848285016122ef565b91505092915050565b60006020828403121561263e5761263d612d71565b5b600061264c84828501612304565b91505092915050565b60006020828403121561266b5761266a612d71565b5b600082013567ffffffffffffffff81111561268957612688612d6c565b5b61269584828501612347565b91505092915050565b6000602082840312156126b4576126b3612d71565b5b60006126c284828501612375565b91505092915050565b600080604083850312156126e2576126e1612d71565b5b60006126f085828601612375565b925050602061270185828601612375565b9150509250929050565b61271481612b4d565b82525050565b61272381612b5f565b82525050565b600061273482612a5a565b61273e8185612a70565b935061274e818560208601612c06565b61275781612d76565b840191505092915050565b61276b81612bc1565b82525050565b600061277c82612a65565b6127868185612a81565b9350612796818560208601612c06565b61279f81612d76565b840191505092915050565b60006127b582612a65565b6127bf8185612a92565b93506127cf818560208601612c06565b80840191505092915050565b600081546127e881612c39565b6127f28186612a92565b9450600182166000811461280d576001811461281e57612851565b60ff19831686528186019350612851565b61282785612a45565b60005b838110156128495781548189015260018201915060208101905061282a565b838801955050505b50505092915050565b6000612867600583612a92565b915061287282612d87565b600582019050919050565b61288681612bb7565b82525050565b600061289882856127db565b91506128a482846127aa565b91506128af8261285a565b91508190509392505050565b60006020820190506128d0600083018461270b565b92915050565b60006040820190506128eb600083018561270b565b6128f8602083018461270b565b9392505050565b6000608082019050612914600083018761270b565b612921602083018661270b565b61292e604083018561287d565b81810360608301526129408184612729565b905095945050505050565b6000602082019050612960600083018461271a565b92915050565b600060208201905061297b6000830184612762565b92915050565b6000602082019050818103600083015261299b8184612771565b905092915050565b60006020820190506129b8600083018461287d565b92915050565b60006129c86129d9565b90506129d48282612c6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156129fe576129fd612d29565b5b612a0782612d76565b9050602081019050919050565b600067ffffffffffffffff821115612a2f57612a2e612d29565b5b612a3882612d76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612aa882612bb7565b9150612ab383612bb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ae857612ae7612c9c565b5b828201905092915050565b6000612afe82612bb7565b9150612b0983612bb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4257612b41612c9c565b5b828202905092915050565b6000612b5882612b97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612bcc82612bd3565b9050919050565b6000612bde82612be5565b9050919050565b6000612bf082612b97565b9050919050565b82818337600083830152505050565b60005b83811015612c24578082015181840152602081019050612c09565b83811115612c33576000848401525b50505050565b60006002820490506001821680612c5157607f821691505b60208210811415612c6557612c64612ccb565b5b50919050565b612c7482612d76565b810181811067ffffffffffffffff82111715612c9357612c92612d29565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b612db981612b4d565b8114612dc457600080fd5b50565b612dd081612b5f565b8114612ddb57600080fd5b50565b612de781612b6b565b8114612df257600080fd5b50565b612dfe81612bb7565b8114612e0957600080fd5b5056fea2646970667358221220e68e09aeaad40d3989ce08bb85dcb3378cc56d31bfc93cac256b99a5005e653b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101665760003560e01c80636c0360eb116100d1578063b27fc69c1161008a578063d5abeb0111610064578063d5abeb01146104e7578063de53f38a14610512578063e985e9c51461053b578063f7d975771461057857610166565b8063b27fc69c14610472578063b88d4fde1461048e578063c87b56dd146104aa57610166565b80636c0360eb1461036257806370a082311461038d57806370f02af4146103ca5780638da5cb5b146103f357806395d89b411461041e578063a22cb4651461044957610166565b806323b872dd1161012357806323b872dd146102825780633ccfd60b1461029e57806341f43434146102b557806342842e0e146102e057806355f804b3146102fc5780636352211e1461032557610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c5780631b5a29c614610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d91906125fb565b6105a1565b60405161019f919061294b565b60405180910390f35b3480156101b457600080fd5b506101bd610633565b6040516101ca9190612981565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f5919061269e565b6106c5565b60405161020791906128bb565b60405180910390f35b61022a6004803603810190610225919061250d565b610744565b005b34801561023857600080fd5b5061024161085d565b60405161024e91906129a3565b60405180910390f35b34801561026357600080fd5b5061026c610874565b6040516102799190612981565b60405180910390f35b61029c600480360381019061029791906123f7565b610902565b005b3480156102aa57600080fd5b506102b3610a62565b005b3480156102c157600080fd5b506102ca610b05565b6040516102d79190612966565b60405180910390f35b6102fa60048036038101906102f591906123f7565b610b17565b005b34801561030857600080fd5b50610323600480360381019061031e9190612655565b610c77565b005b34801561033157600080fd5b5061034c6004803603810190610347919061269e565b610ceb565b60405161035991906128bb565b60405180910390f35b34801561036e57600080fd5b50610377610cfd565b6040516103849190612981565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061238a565b610d8b565b6040516103c191906129a3565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061269e565b610e44565b005b3480156103ff57600080fd5b50610408610ea8565b60405161041591906128bb565b60405180910390f35b34801561042a57600080fd5b50610433610ece565b6040516104409190612981565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906124cd565b610f60565b005b61048c6004803603810190610487919061269e565b611079565b005b6104a860048036038101906104a3919061244a565b6110d0565b005b3480156104b657600080fd5b506104d160048036038101906104cc919061269e565b611233565b6040516104de9190612981565b60405180910390f35b3480156104f357600080fd5b506104fc611267565b60405161050991906129a3565b60405180910390f35b34801561051e57600080fd5b506105396004803603810190610534919061254d565b61126d565b005b34801561054757600080fd5b50610562600480360381019061055d91906123b7565b611384565b60405161056f919061294b565b60405180910390f35b34801561058457600080fd5b5061059f600480360381019061059a91906126cb565b611418565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105fc57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061062c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461064290612c39565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90612c39565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050905090565b60006106d082611484565b610706576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561084e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016107bc9291906128d6565b60206040518083038186803b1580156107d457600080fd5b505afa1580156107e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080c91906125ce565b61084d57806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161084491906128bb565b60405180910390fd5b5b61085883836114e3565b505050565b6000610867611627565b6001546000540303905090565b600a805461088190612c39565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90612c39565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b505050505081565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610a50573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561097557610970848484611630565b610a5c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016109be9291906128d6565b60206040518083038186803b1580156109d657600080fd5b505afa1580156109ea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0e91906125ce565b610a4f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610a4691906128bb565b60405180910390fd5b5b610a5b848484611630565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610abc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b02573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c65573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b8a57610b85848484611955565b610c71565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610bd39291906128d6565b60206040518083038186803b158015610beb57600080fd5b505afa158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2391906125ce565b610c6457336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c5b91906128bb565b60405180910390fd5b5b610c70848484611955565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd157600080fd5b80600c9080519060200190610ce79291906120dd565b5050565b6000610cf682611975565b9050919050565b600c8054610d0a90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3690612c39565b8015610d835780601f10610d5857610100808354040283529160200191610d83565b820191906000526020600020905b815481529060010190602001808311610d6657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610df3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9e57600080fd5b8060088190555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054610edd90612c39565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990612c39565b8015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050505050905090565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561106a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610fd89291906128d6565b60206040518083038186803b158015610ff057600080fd5b505afa158015611004573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102891906125ce565b61106957806040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161106091906128bb565b60405180910390fd5b5b6110748383611a43565b505050565b6008548161108561085d565b61108f9190612a9d565b111561109a57600080fd5b600b548111156110a957600080fd5b600954816110b79190612af3565b3410156110c357600080fd5b6110cd3382611b4e565b50565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561121f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111445761113f85858585611b6c565b61122c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161118d9291906128d6565b60206040518083038186803b1580156111a557600080fd5b505afa1580156111b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dd91906125ce565b61121e57336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161121591906128bb565b60405180910390fd5b5b61122b85858585611b6c565b5b5050505050565b6060600c61124083611bdf565b60405160200161125192919061288c565b6040516020818303038152906040529050919050565b60085481565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112c757600080fd5b818190508484905014611306576040517faa81c86100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b848490508163ffffffff16101561137d5761137085858363ffffffff1681811061133657611335612cfa565b5b905060200201602081019061134b919061238a565b84848463ffffffff1681811061136457611363612cfa565b5b90506020020135611c38565b8080600101915050611309565b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b8160098190555080600b819055505050565b60008161148f611627565b1115801561149e575060005482105b80156114dc575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006114ee82610ceb565b90508073ffffffffffffffffffffffffffffffffffffffff1661150f611df5565b73ffffffffffffffffffffffffffffffffffffffff16146115725761153b81611536611df5565b611384565b611571576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061163b82611975565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116a2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116ae84611dfd565b915091506116c481876116bf611df5565b611e24565b611710576116d9866116d4611df5565b611384565b61170f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611777576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117848686866001611e68565b801561178f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185d85611839888887611e6e565b7c020000000000000000000000000000000000000000000000000000000017611e96565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156118e55760006001850190506000600460008381526020019081526020016000205414156118e35760005481146118e2578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194d8686866001611ec1565b505050505050565b611970838383604051806020016040528060008152506110d0565b505050565b60008082905080611984611627565b11611a0c57600054811015611a0b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611a09575b60008114156119ff5760046000836001900393508381526020019081526020016000205490506119d4565b8092505050611a3e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060076000611a50611df5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611afd611df5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b42919061294b565b60405180910390a35050565b611b68828260405180602001604052806000815250611ec7565b5050565b611b77848484610902565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bd957611ba284848484611f64565b611bd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060a060405101806040526020810391506000825281835b600115611c2357600184039350600a81066030018453600a8104905080611c1e57611c23565b611bf8565b50828103602084039350808452505050919050565b6000805490506000821415611c79576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c866000848385611e68565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611cfd83611cee6000866000611e6e565b611cf7856120c4565b17611e96565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611d9e57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611d63565b506000821415611dda576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611df06000848385611ec1565b505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611e858686846120d4565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611ed18383611c38565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f5f57600080549050600083820390505b611f116000868380600101945086611f64565b611f47576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611efe578160005414611f5c57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f8a611df5565b8786866040518563ffffffff1660e01b8152600401611fac94939291906128ff565b602060405180830381600087803b158015611fc657600080fd5b505af1925050508015611ff757506040513d601f19601f82011682018060405250810190611ff49190612628565b60015b612071573d8060008114612027576040519150601f19603f3d011682016040523d82523d6000602084013e61202c565b606091505b50600081511415612069576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60006001821460e11b9050919050565b60009392505050565b8280546120e990612c39565b90600052602060002090601f01602090048101928261210b5760008555612152565b82601f1061212457805160ff1916838001178555612152565b82800160010185558215612152579182015b82811115612151578251825591602001919060010190612136565b5b50905061215f9190612163565b5090565b5b8082111561217c576000816000905550600101612164565b5090565b600061219361218e846129e3565b6129be565b9050828152602081018484840111156121af576121ae612d67565b5b6121ba848285612bf7565b509392505050565b60006121d56121d084612a14565b6129be565b9050828152602081018484840111156121f1576121f0612d67565b5b6121fc848285612bf7565b509392505050565b60008135905061221381612db0565b92915050565b60008083601f84011261222f5761222e612d5d565b5b8235905067ffffffffffffffff81111561224c5761224b612d58565b5b60208301915083602082028301111561226857612267612d62565b5b9250929050565b60008083601f84011261228557612284612d5d565b5b8235905067ffffffffffffffff8111156122a2576122a1612d58565b5b6020830191508360208202830111156122be576122bd612d62565b5b9250929050565b6000813590506122d481612dc7565b92915050565b6000815190506122e981612dc7565b92915050565b6000813590506122fe81612dde565b92915050565b60008151905061231381612dde565b92915050565b600082601f83011261232e5761232d612d5d565b5b813561233e848260208601612180565b91505092915050565b600082601f83011261235c5761235b612d5d565b5b813561236c8482602086016121c2565b91505092915050565b60008135905061238481612df5565b92915050565b6000602082840312156123a05761239f612d71565b5b60006123ae84828501612204565b91505092915050565b600080604083850312156123ce576123cd612d71565b5b60006123dc85828601612204565b92505060206123ed85828601612204565b9150509250929050565b6000806000606084860312156124105761240f612d71565b5b600061241e86828701612204565b935050602061242f86828701612204565b925050604061244086828701612375565b9150509250925092565b6000806000806080858703121561246457612463612d71565b5b600061247287828801612204565b945050602061248387828801612204565b935050604061249487828801612375565b925050606085013567ffffffffffffffff8111156124b5576124b4612d6c565b5b6124c187828801612319565b91505092959194509250565b600080604083850312156124e4576124e3612d71565b5b60006124f285828601612204565b9250506020612503858286016122c5565b9150509250929050565b6000806040838503121561252457612523612d71565b5b600061253285828601612204565b925050602061254385828601612375565b9150509250929050565b6000806000806040858703121561256757612566612d71565b5b600085013567ffffffffffffffff81111561258557612584612d6c565b5b61259187828801612219565b9450945050602085013567ffffffffffffffff8111156125b4576125b3612d6c565b5b6125c08782880161226f565b925092505092959194509250565b6000602082840312156125e4576125e3612d71565b5b60006125f2848285016122da565b91505092915050565b60006020828403121561261157612610612d71565b5b600061261f848285016122ef565b91505092915050565b60006020828403121561263e5761263d612d71565b5b600061264c84828501612304565b91505092915050565b60006020828403121561266b5761266a612d71565b5b600082013567ffffffffffffffff81111561268957612688612d6c565b5b61269584828501612347565b91505092915050565b6000602082840312156126b4576126b3612d71565b5b60006126c284828501612375565b91505092915050565b600080604083850312156126e2576126e1612d71565b5b60006126f085828601612375565b925050602061270185828601612375565b9150509250929050565b61271481612b4d565b82525050565b61272381612b5f565b82525050565b600061273482612a5a565b61273e8185612a70565b935061274e818560208601612c06565b61275781612d76565b840191505092915050565b61276b81612bc1565b82525050565b600061277c82612a65565b6127868185612a81565b9350612796818560208601612c06565b61279f81612d76565b840191505092915050565b60006127b582612a65565b6127bf8185612a92565b93506127cf818560208601612c06565b80840191505092915050565b600081546127e881612c39565b6127f28186612a92565b9450600182166000811461280d576001811461281e57612851565b60ff19831686528186019350612851565b61282785612a45565b60005b838110156128495781548189015260018201915060208101905061282a565b838801955050505b50505092915050565b6000612867600583612a92565b915061287282612d87565b600582019050919050565b61288681612bb7565b82525050565b600061289882856127db565b91506128a482846127aa565b91506128af8261285a565b91508190509392505050565b60006020820190506128d0600083018461270b565b92915050565b60006040820190506128eb600083018561270b565b6128f8602083018461270b565b9392505050565b6000608082019050612914600083018761270b565b612921602083018661270b565b61292e604083018561287d565b81810360608301526129408184612729565b905095945050505050565b6000602082019050612960600083018461271a565b92915050565b600060208201905061297b6000830184612762565b92915050565b6000602082019050818103600083015261299b8184612771565b905092915050565b60006020820190506129b8600083018461287d565b92915050565b60006129c86129d9565b90506129d48282612c6b565b919050565b6000604051905090565b600067ffffffffffffffff8211156129fe576129fd612d29565b5b612a0782612d76565b9050602081019050919050565b600067ffffffffffffffff821115612a2f57612a2e612d29565b5b612a3882612d76565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612aa882612bb7565b9150612ab383612bb7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612ae857612ae7612c9c565b5b828201905092915050565b6000612afe82612bb7565b9150612b0983612bb7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b4257612b41612c9c565b5b828202905092915050565b6000612b5882612b97565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612bcc82612bd3565b9050919050565b6000612bde82612be5565b9050919050565b6000612bf082612b97565b9050919050565b82818337600083830152505050565b60005b83811015612c24578082015181840152602081019050612c09565b83811115612c33576000848401525b50505050565b60006002820490506001821680612c5157607f821691505b60208210811415612c6557612c64612ccb565b5b50919050565b612c7482612d76565b810181811067ffffffffffffffff82111715612c9357612c92612d29565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b612db981612b4d565b8114612dc457600080fd5b50565b612dd081612b5f565b8114612ddb57600080fd5b50565b612de781612b6b565b8114612df257600080fd5b50565b612dfe81612bb7565b8114612e0957600080fd5b5056fea2646970667358221220e68e09aeaad40d3989ce08bb85dcb3378cc56d31bfc93cac256b99a5005e653b64736f6c63430008070033

Deployed Bytecode Sourcemap

60760:3318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21776:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22678:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29169:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63332:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18429:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60904:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63505:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62836:109;;;;;;;;;;;;;:::i;:::-;;57545:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63684:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62542:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24071:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60986:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19613:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62953:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61661:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22854:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63148:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61048:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63871:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62656:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60824:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61295:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30118:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62244:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21776:639;21861:4;22200:10;22185:25;;:11;:25;;;;:102;;;;22277:10;22262:25;;:11;:25;;;;22185:102;:179;;;;22354:10;22339:25;;:11;:25;;;;22185:179;22165:199;;21776:639;;;:::o;22678:100::-;22732:13;22765:5;22758:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22678:100;:::o;29169:218::-;29245:7;29270:16;29278:7;29270;:16::i;:::-;29265:64;;29295:34;;;;;;;;;;;;;;29265:64;29349:15;:24;29365:7;29349:24;;;;;;;;;;;:30;;;;;;;;;;;;29342:37;;29169:218;;;:::o;63332:165::-;63436:8;59587:1;57645:42;59539:45;;;:49;59535:225;;;57645:42;59610;;;59661:4;59668:8;59610:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59605:144;;59724:8;59705:28;;;;;;;;;;;:::i;:::-;;;;;;;;59605:144;59535:225;63457:32:::1;63471:8;63481:7;63457:13;:32::i;:::-;63332:165:::0;;;:::o;18429:323::-;18490:7;18718:15;:13;:15::i;:::-;18703:12;;18687:13;;:28;:46;18680:53;;18429:323;:::o;60904:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63505:171::-;63614:4;58841:1;57645:42;58793:45;;;:49;58789:539;;;59082:10;59074:18;;:4;:18;;;59070:85;;;63631:37:::1;63650:4;63656:2;63660:7;63631:18;:37::i;:::-;59133:7:::0;;59070:85;57645:42;59174;;;59225:4;59232:10;59174:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59169:148;;59290:10;59271:30;;;;;;;;;;;:::i;:::-;;;;;;;;59169:148;58789:539;63631:37:::1;63650:4;63656:2;63660:7;63631:18;:37::i;:::-;63505:171:::0;;;;;:::o;62836:109::-;61735:10;61726:19;;:5;;;;;;;;;;;:19;;;61718:28;;;;;;62894:10:::1;62886:28;;:51;62915:21;62886:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;62836:109::o:0;57545:143::-;57645:42;57545:143;:::o;63684:179::-;63797:4;58841:1;57645:42;58793:45;;;:49;58789:539;;;59082:10;59074:18;;:4;:18;;;59070:85;;;63814:41:::1;63837:4;63843:2;63847:7;63814:22;:41::i;:::-;59133:7:::0;;59070:85;57645:42;59174;;;59225:4;59232:10;59174:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59169:148;;59290:10;59271:30;;;;;;;;;;;:::i;:::-;;;;;;;;59169:148;58789:539;63814:41:::1;63837:4;63843:2;63847:7;63814:22;:41::i;:::-;63684:179:::0;;;;;:::o;62542:106::-;61735:10;61726:19;;:5;;;;;;;;;;;:19;;;61718:28;;;;;;62629:11:::1;62619:7;:21;;;;;;;;;;;;:::i;:::-;;62542:106:::0;:::o;24071:152::-;24143:7;24186:27;24205:7;24186:18;:27::i;:::-;24163:52;;24071:152;;;:::o;60986:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19613:233::-;19685:7;19726:1;19709:19;;:5;:19;;;19705:60;;;19737:28;;;;;;;;;;;;;;19705:60;13772:13;19783:18;:25;19802:5;19783:25;;;;;;;;;;;;;;;;:55;19776:62;;19613:233;;;:::o;62953:82::-;61735:10;61726:19;;:5;;;;;;;;;;;:19;;;61718:28;;;;;;63023:4:::1;63011:9;:16;;;;62953:82:::0;:::o;61661:20::-;;;;;;;;;;;;;:::o;22854:104::-;22910:13;22943:7;22936:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22854:104;:::o;63148:176::-;63252:8;59587:1;57645:42;59539:45;;;:49;59535:225;;;57645:42;59610;;;59661:4;59668:8;59610:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59605:144;;59724:8;59705:28;;;;;;;;;;;:::i;:::-;;;;;;;;59605:144;59535:225;63273:43:::1;63297:8;63307;63273:23;:43::i;:::-;63148:176:::0;;;:::o;61048:237::-;61142:9;;61132:6;61116:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;61108:44;;;;;;61181:8;;61171:6;:18;;61163:27;;;;;;61231:5;;61222:6;:14;;;;:::i;:::-;61209:9;:27;;61201:36;;;;;;61248:29;61258:10;61270:6;61248:9;:29::i;:::-;61048:237;:::o;63871:204::-;64003:4;58841:1;57645:42;58793:45;;;:49;58789:539;;;59082:10;59074:18;;:4;:18;;;59070:85;;;64020:47:::1;64043:4;64049:2;64053:7;64062:4;64020:22;:47::i;:::-;59133:7:::0;;59070:85;57645:42;59174;;;59225:4;59232:10;59174:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59169:148;;59290:10;59271:30;;;;;;;;;;;:::i;:::-;;;;;;;;59169:148;58789:539;64020:47:::1;64043:4;64049:2;64053:7;64062:4;64020:22;:47::i;:::-;63871:204:::0;;;;;;:::o;62656:168::-;62721:13;62778:7;62787:18;62797:7;62787:9;:18::i;:::-;62761:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62747:69;;62656:168;;;:::o;60824:30::-;;;;:::o;61295:358::-;61735:10;61726:19;;:5;;;;;;;;;;;:19;;;61718:28;;;;;;61441:8:::1;;:15;;61420:10;;:17;;:36;61416:68;;61465:19;;;;;;;;;;;;;;61416:68;61525:8;61520:115;61543:10;;:17;;61539:1;:21;;;61520:115;;;61586:33;61592:10;;61603:1;61592:13;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;61607:8;;61616:1;61607:11;;;;;;;;;:::i;:::-;;;;;;;;61586:5;:33::i;:::-;61562:3;;;;;;;61520:115;;;;61295:358:::0;;;;:::o;30118:164::-;30215:4;30239:18;:25;30258:5;30239:25;;;;;;;;;;;;;;;:35;30265:8;30239:35;;;;;;;;;;;;;;;;;;;;;;;;;30232:42;;30118:164;;;;:::o;62244:136::-;61735:10;61726:19;;:5;;;;;;;;;;;:19;;;61718:28;;;;;;62335:8:::1;62327:5;:16;;;;62365:7;62354:8;:18;;;;62244:136:::0;;:::o;30540:282::-;30605:4;30661:7;30642:15;:13;:15::i;:::-;:26;;:66;;;;;30695:13;;30685:7;:23;30642:66;:153;;;;;30794:1;14548:8;30746:17;:26;30764:7;30746:26;;;;;;;;;;;;:44;:49;30642:153;30622:173;;30540:282;;;:::o;28602:408::-;28691:13;28707:16;28715:7;28707;:16::i;:::-;28691:32;;28763:5;28740:28;;:19;:17;:19::i;:::-;:28;;;28736:175;;28788:44;28805:5;28812:19;:17;:19::i;:::-;28788:16;:44::i;:::-;28783:128;;28860:35;;;;;;;;;;;;;;28783:128;28736:175;28956:2;28923:15;:24;28939:7;28923:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28994:7;28990:2;28974:28;;28983:5;28974:28;;;;;;;;;;;;28680:330;28602:408;;:::o;17945:92::-;18001:7;18028:1;18021:8;;17945:92;:::o;32808:2825::-;32950:27;32980;32999:7;32980:18;:27::i;:::-;32950:57;;33065:4;33024:45;;33040:19;33024:45;;;33020:86;;33078:28;;;;;;;;;;;;;;33020:86;33120:27;33149:23;33176:35;33203:7;33176:26;:35::i;:::-;33119:92;;;;33311:68;33336:15;33353:4;33359:19;:17;:19::i;:::-;33311:24;:68::i;:::-;33306:180;;33399:43;33416:4;33422:19;:17;:19::i;:::-;33399:16;:43::i;:::-;33394:92;;33451:35;;;;;;;;;;;;;;33394:92;33306:180;33517:1;33503:16;;:2;:16;;;33499:52;;;33528:23;;;;;;;;;;;;;;33499:52;33564:43;33586:4;33592:2;33596:7;33605:1;33564:21;:43::i;:::-;33700:15;33697:160;;;33840:1;33819:19;33812:30;33697:160;34237:18;:24;34256:4;34237:24;;;;;;;;;;;;;;;;34235:26;;;;;;;;;;;;34306:18;:22;34325:2;34306:22;;;;;;;;;;;;;;;;34304:24;;;;;;;;;;;34628:146;34665:2;34714:45;34729:4;34735:2;34739:19;34714:14;:45::i;:::-;14828:8;34686:73;34628:18;:146::i;:::-;34599:17;:26;34617:7;34599:26;;;;;;;;;;;:175;;;;34945:1;14828:8;34894:19;:47;:52;34890:627;;;34967:19;34999:1;34989:7;:11;34967:33;;35156:1;35122:17;:30;35140:11;35122:30;;;;;;;;;;;;:35;35118:384;;;35260:13;;35245:11;:28;35241:242;;35440:19;35407:17;:30;35425:11;35407:30;;;;;;;;;;;:52;;;;35241:242;35118:384;34948:569;34890:627;35564:7;35560:2;35545:27;;35554:4;35545:27;;;;;;;;;;;;35583:42;35604:4;35610:2;35614:7;35623:1;35583:20;:42::i;:::-;32939:2694;;;32808:2825;;;:::o;35729:193::-;35875:39;35892:4;35898:2;35902:7;35875:39;;;;;;;;;;;;:16;:39::i;:::-;35729:193;;;:::o;25226:1275::-;25293:7;25313:12;25328:7;25313:22;;25396:4;25377:15;:13;:15::i;:::-;:23;25373:1061;;25430:13;;25423:4;:20;25419:1015;;;25468:14;25485:17;:23;25503:4;25485:23;;;;;;;;;;;;25468:40;;25602:1;14548:8;25574:6;:24;:29;25570:845;;;26239:113;26256:1;26246:6;:11;26239:113;;;26299:17;:25;26317:6;;;;;;;26299:25;;;;;;;;;;;;26290:34;;26239:113;;;26385:6;26378:13;;;;;;25570:845;25445:989;25419:1015;25373:1061;26462:31;;;;;;;;;;;;;;25226:1275;;;;:::o;29727:234::-;29874:8;29822:18;:39;29841:19;:17;:19::i;:::-;29822:39;;;;;;;;;;;;;;;:49;29862:8;29822:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;29934:8;29898:55;;29913:19;:17;:19::i;:::-;29898:55;;;29944:8;29898:55;;;;;;:::i;:::-;;;;;;;;29727:234;;:::o;46680:112::-;46757:27;46767:2;46771:8;46757:27;;;;;;;;;;;;:9;:27::i;:::-;46680:112;;:::o;36520:407::-;36695:31;36708:4;36714:2;36718:7;36695:12;:31::i;:::-;36759:1;36741:2;:14;;;:19;36737:183;;36780:56;36811:4;36817:2;36821:7;36830:5;36780:30;:56::i;:::-;36775:145;;36864:40;;;;;;;;;;;;;;36775:145;36737:183;36520:407;;;;:::o;53055:1745::-;53120:17;53554:4;53547;53541:11;53537:22;53646:1;53640:4;53633:15;53721:4;53718:1;53714:12;53707:19;;53803:1;53798:3;53791:14;53907:3;54146:5;54128:428;54154:1;54128:428;;;54194:1;54189:3;54185:11;54178:18;;54365:2;54359:4;54355:13;54351:2;54347:22;54342:3;54334:36;54459:2;54453:4;54449:13;54441:21;;54526:4;54516:25;;54534:5;;54516:25;54128:428;;;54132:21;54595:3;54590;54586:13;54710:4;54705:3;54701:14;54694:21;;54775:6;54770:3;54763:19;53159:1634;;;53055:1745;;;:::o;40189:2966::-;40262:20;40285:13;;40262:36;;40325:1;40313:8;:13;40309:44;;;40335:18;;;;;;;;;;;;;;40309:44;40366:61;40396:1;40400:2;40404:12;40418:8;40366:21;:61::i;:::-;40910:1;13910:2;40880:1;:26;;40879:32;40867:8;:45;40841:18;:22;40860:2;40841:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;41189:139;41226:2;41280:33;41303:1;41307:2;41311:1;41280:14;:33::i;:::-;41247:30;41268:8;41247:20;:30::i;:::-;:66;41189:18;:139::i;:::-;41155:17;:31;41173:12;41155:31;;;;;;;;;;;:173;;;;41345:16;41376:11;41405:8;41390:12;:23;41376:37;;41926:16;41922:2;41918:25;41906:37;;42298:12;42258:8;42217:1;42155:25;42096:1;42035;42008:335;42669:1;42655:12;42651:20;42609:346;42710:3;42701:7;42698:16;42609:346;;42928:7;42918:8;42915:1;42888:25;42885:1;42882;42877:59;42763:1;42754:7;42750:15;42739:26;;42609:346;;;42613:77;43000:1;42988:8;:13;42984:45;;;43010:19;;;;;;;;;;;;;;42984:45;43062:3;43046:13;:19;;;;40615:2462;;43087:60;43116:1;43120:2;43124:12;43138:8;43087:20;:60::i;:::-;40251:2904;40189:2966;;:::o;52848:105::-;52908:7;52935:10;52928:17;;52848:105;:::o;31703:485::-;31805:27;31834:23;31875:38;31916:15;:24;31932:7;31916:24;;;;;;;;;;;31875:65;;32093:18;32070:41;;32150:19;32144:26;32125:45;;32055:126;31703:485;;;:::o;30931:659::-;31080:11;31245:16;31238:5;31234:28;31225:37;;31405:16;31394:9;31390:32;31377:45;;31555:15;31544:9;31541:30;31533:5;31522:9;31519:20;31516:56;31506:66;;30931:659;;;;;:::o;37589:159::-;;;;;:::o;52157:311::-;52292:7;52312:16;14952:3;52338:19;:41;;52312:68;;14952:3;52406:31;52417:4;52423:2;52427:9;52406:10;:31::i;:::-;52398:40;;:62;;52391:69;;;52157:311;;;;;:::o;27049:450::-;27129:14;27297:16;27290:5;27286:28;27277:37;;27474:5;27460:11;27435:23;27431:41;27428:52;27421:5;27418:63;27408:73;;27049:450;;;;:::o;38413:158::-;;;;;:::o;45907:689::-;46038:19;46044:2;46048:8;46038:5;:19::i;:::-;46117:1;46099:2;:14;;;:19;46095:483;;46139:11;46153:13;;46139:27;;46185:13;46207:8;46201:3;:14;46185:30;;46234:233;46265:62;46304:1;46308:2;46312:7;;;;;;46321:5;46265:30;:62::i;:::-;46260:167;;46363:40;;;;;;;;;;;;;;46260:167;46462:3;46454:5;:11;46234:233;;46549:3;46532:13;;:20;46528:34;;46554:8;;;46528:34;46120:458;;46095:483;45907:689;;;:::o;39011:716::-;39174:4;39220:2;39195:45;;;39241:19;:17;:19::i;:::-;39262:4;39268:7;39277:5;39195:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39191:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39495:1;39478:6;:13;:18;39474:235;;;39524:40;;;;;;;;;;;;;;39474:235;39667:6;39661:13;39652:6;39648:2;39644:15;39637:38;39191:529;39364:54;;;39354:64;;;:6;:64;;;;39347:71;;;39011:716;;;;;;:::o;27601:324::-;27671:14;27904:1;27894:8;27891:15;27865:24;27861:46;27851:56;;27601:324;;;:::o;51858:147::-;51995:6;51858:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2361:5;2392:6;2386:13;2377:22;;2408:30;2432:5;2408:30;:::i;:::-;2307:137;;;;:::o;2450:::-;2495:5;2533:6;2520:20;2511:29;;2549:32;2575:5;2549:32;:::i;:::-;2450:137;;;;:::o;2593:141::-;2649:5;2680:6;2674:13;2665:22;;2696:32;2722:5;2696:32;:::i;:::-;2593:141;;;;:::o;2753:338::-;2808:5;2857:3;2850:4;2842:6;2838:17;2834:27;2824:122;;2865:79;;:::i;:::-;2824:122;2982:6;2969:20;3007:78;3081:3;3073:6;3066:4;3058:6;3054:17;3007:78;:::i;:::-;2998:87;;2814:277;2753:338;;;;:::o;3111:340::-;3167:5;3216:3;3209:4;3201:6;3197:17;3193:27;3183:122;;3224:79;;:::i;:::-;3183:122;3341:6;3328:20;3366:79;3441:3;3433:6;3426:4;3418:6;3414:17;3366:79;:::i;:::-;3357:88;;3173:278;3111:340;;;;:::o;3457:139::-;3503:5;3541:6;3528:20;3519:29;;3557:33;3584:5;3557:33;:::i;:::-;3457:139;;;;:::o;3602:329::-;3661:6;3710:2;3698:9;3689:7;3685:23;3681:32;3678:119;;;3716:79;;:::i;:::-;3678:119;3836:1;3861:53;3906:7;3897:6;3886:9;3882:22;3861:53;:::i;:::-;3851:63;;3807:117;3602:329;;;;:::o;3937:474::-;4005:6;4013;4062:2;4050:9;4041:7;4037:23;4033:32;4030:119;;;4068:79;;:::i;:::-;4030:119;4188:1;4213:53;4258:7;4249:6;4238:9;4234:22;4213:53;:::i;:::-;4203:63;;4159:117;4315:2;4341:53;4386:7;4377:6;4366:9;4362:22;4341:53;:::i;:::-;4331:63;;4286:118;3937:474;;;;;:::o;4417:619::-;4494:6;4502;4510;4559:2;4547:9;4538:7;4534:23;4530:32;4527:119;;;4565:79;;:::i;:::-;4527:119;4685:1;4710:53;4755:7;4746:6;4735:9;4731:22;4710:53;:::i;:::-;4700:63;;4656:117;4812:2;4838:53;4883:7;4874:6;4863:9;4859:22;4838:53;:::i;:::-;4828:63;;4783:118;4940:2;4966:53;5011:7;5002:6;4991:9;4987:22;4966:53;:::i;:::-;4956:63;;4911:118;4417:619;;;;;:::o;5042:943::-;5137:6;5145;5153;5161;5210:3;5198:9;5189:7;5185:23;5181:33;5178:120;;;5217:79;;:::i;:::-;5178:120;5337:1;5362:53;5407:7;5398:6;5387:9;5383:22;5362:53;:::i;:::-;5352:63;;5308:117;5464:2;5490:53;5535:7;5526:6;5515:9;5511:22;5490:53;:::i;:::-;5480:63;;5435:118;5592:2;5618:53;5663:7;5654:6;5643:9;5639:22;5618:53;:::i;:::-;5608:63;;5563:118;5748:2;5737:9;5733:18;5720:32;5779:18;5771:6;5768:30;5765:117;;;5801:79;;:::i;:::-;5765:117;5906:62;5960:7;5951:6;5940:9;5936:22;5906:62;:::i;:::-;5896:72;;5691:287;5042:943;;;;;;;:::o;5991:468::-;6056:6;6064;6113:2;6101:9;6092:7;6088:23;6084:32;6081:119;;;6119:79;;:::i;:::-;6081:119;6239:1;6264:53;6309:7;6300:6;6289:9;6285:22;6264:53;:::i;:::-;6254:63;;6210:117;6366:2;6392:50;6434:7;6425:6;6414:9;6410:22;6392:50;:::i;:::-;6382:60;;6337:115;5991:468;;;;;:::o;6465:474::-;6533:6;6541;6590:2;6578:9;6569:7;6565:23;6561:32;6558:119;;;6596:79;;:::i;:::-;6558:119;6716:1;6741:53;6786:7;6777:6;6766:9;6762:22;6741:53;:::i;:::-;6731:63;;6687:117;6843:2;6869:53;6914:7;6905:6;6894:9;6890:22;6869:53;:::i;:::-;6859:63;;6814:118;6465:474;;;;;:::o;6945:934::-;7067:6;7075;7083;7091;7140:2;7128:9;7119:7;7115:23;7111:32;7108:119;;;7146:79;;:::i;:::-;7108:119;7294:1;7283:9;7279:17;7266:31;7324:18;7316:6;7313:30;7310:117;;;7346:79;;:::i;:::-;7310:117;7459:80;7531:7;7522:6;7511:9;7507:22;7459:80;:::i;:::-;7441:98;;;;7237:312;7616:2;7605:9;7601:18;7588:32;7647:18;7639:6;7636:30;7633:117;;;7669:79;;:::i;:::-;7633:117;7782:80;7854:7;7845:6;7834:9;7830:22;7782:80;:::i;:::-;7764:98;;;;7559:313;6945:934;;;;;;;:::o;7885:345::-;7952:6;8001:2;7989:9;7980:7;7976:23;7972:32;7969:119;;;8007:79;;:::i;:::-;7969:119;8127:1;8152:61;8205:7;8196:6;8185:9;8181:22;8152:61;:::i;:::-;8142:71;;8098:125;7885:345;;;;:::o;8236:327::-;8294:6;8343:2;8331:9;8322:7;8318:23;8314:32;8311:119;;;8349:79;;:::i;:::-;8311:119;8469:1;8494:52;8538:7;8529:6;8518:9;8514:22;8494:52;:::i;:::-;8484:62;;8440:116;8236:327;;;;:::o;8569:349::-;8638:6;8687:2;8675:9;8666:7;8662:23;8658:32;8655:119;;;8693:79;;:::i;:::-;8655:119;8813:1;8838:63;8893:7;8884:6;8873:9;8869:22;8838:63;:::i;:::-;8828:73;;8784:127;8569:349;;;;:::o;8924:509::-;8993:6;9042:2;9030:9;9021:7;9017:23;9013:32;9010:119;;;9048:79;;:::i;:::-;9010:119;9196:1;9185:9;9181:17;9168:31;9226:18;9218:6;9215:30;9212:117;;;9248:79;;:::i;:::-;9212:117;9353:63;9408:7;9399:6;9388:9;9384:22;9353:63;:::i;:::-;9343:73;;9139:287;8924:509;;;;:::o;9439:329::-;9498:6;9547:2;9535:9;9526:7;9522:23;9518:32;9515:119;;;9553:79;;:::i;:::-;9515:119;9673:1;9698:53;9743:7;9734:6;9723:9;9719:22;9698:53;:::i;:::-;9688:63;;9644:117;9439:329;;;;:::o;9774:474::-;9842:6;9850;9899:2;9887:9;9878:7;9874:23;9870:32;9867:119;;;9905:79;;:::i;:::-;9867:119;10025:1;10050:53;10095:7;10086:6;10075:9;10071:22;10050:53;:::i;:::-;10040:63;;9996:117;10152:2;10178:53;10223:7;10214:6;10203:9;10199:22;10178:53;:::i;:::-;10168:63;;10123:118;9774:474;;;;;:::o;10254:118::-;10341:24;10359:5;10341:24;:::i;:::-;10336:3;10329:37;10254:118;;:::o;10378:109::-;10459:21;10474:5;10459:21;:::i;:::-;10454:3;10447:34;10378:109;;:::o;10493:360::-;10579:3;10607:38;10639:5;10607:38;:::i;:::-;10661:70;10724:6;10719:3;10661:70;:::i;:::-;10654:77;;10740:52;10785:6;10780:3;10773:4;10766:5;10762:16;10740:52;:::i;:::-;10817:29;10839:6;10817:29;:::i;:::-;10812:3;10808:39;10801:46;;10583:270;10493:360;;;;:::o;10859:195::-;10978:69;11041:5;10978:69;:::i;:::-;10973:3;10966:82;10859:195;;:::o;11060:364::-;11148:3;11176:39;11209:5;11176:39;:::i;:::-;11231:71;11295:6;11290:3;11231:71;:::i;:::-;11224:78;;11311:52;11356:6;11351:3;11344:4;11337:5;11333:16;11311:52;:::i;:::-;11388:29;11410:6;11388:29;:::i;:::-;11383:3;11379:39;11372:46;;11152:272;11060:364;;;;:::o;11430:377::-;11536:3;11564:39;11597:5;11564:39;:::i;:::-;11619:89;11701:6;11696:3;11619:89;:::i;:::-;11612:96;;11717:52;11762:6;11757:3;11750:4;11743:5;11739:16;11717:52;:::i;:::-;11794:6;11789:3;11785:16;11778:23;;11540:267;11430:377;;;;:::o;11837:845::-;11940:3;11977:5;11971:12;12006:36;12032:9;12006:36;:::i;:::-;12058:89;12140:6;12135:3;12058:89;:::i;:::-;12051:96;;12178:1;12167:9;12163:17;12194:1;12189:137;;;;12340:1;12335:341;;;;12156:520;;12189:137;12273:4;12269:9;12258;12254:25;12249:3;12242:38;12309:6;12304:3;12300:16;12293:23;;12189:137;;12335:341;12402:38;12434:5;12402:38;:::i;:::-;12462:1;12476:154;12490:6;12487:1;12484:13;12476:154;;;12564:7;12558:14;12554:1;12549:3;12545:11;12538:35;12614:1;12605:7;12601:15;12590:26;;12512:4;12509:1;12505:12;12500:17;;12476:154;;;12659:6;12654:3;12650:16;12643:23;;12342:334;;12156:520;;11944:738;;11837:845;;;;:::o;12688:400::-;12848:3;12869:84;12951:1;12946:3;12869:84;:::i;:::-;12862:91;;12962:93;13051:3;12962:93;:::i;:::-;13080:1;13075:3;13071:11;13064:18;;12688:400;;;:::o;13094:118::-;13181:24;13199:5;13181:24;:::i;:::-;13176:3;13169:37;13094:118;;:::o;13218:695::-;13496:3;13518:92;13606:3;13597:6;13518:92;:::i;:::-;13511:99;;13627:95;13718:3;13709:6;13627:95;:::i;:::-;13620:102;;13739:148;13883:3;13739:148;:::i;:::-;13732:155;;13904:3;13897:10;;13218:695;;;;;:::o;13919:222::-;14012:4;14050:2;14039:9;14035:18;14027:26;;14063:71;14131:1;14120:9;14116:17;14107:6;14063:71;:::i;:::-;13919:222;;;;:::o;14147:332::-;14268:4;14306:2;14295:9;14291:18;14283:26;;14319:71;14387:1;14376:9;14372:17;14363:6;14319:71;:::i;:::-;14400:72;14468:2;14457:9;14453:18;14444:6;14400:72;:::i;:::-;14147:332;;;;;:::o;14485:640::-;14680:4;14718:3;14707:9;14703:19;14695:27;;14732:71;14800:1;14789:9;14785:17;14776:6;14732:71;:::i;:::-;14813:72;14881:2;14870:9;14866:18;14857:6;14813:72;:::i;:::-;14895;14963:2;14952:9;14948:18;14939:6;14895:72;:::i;:::-;15014:9;15008:4;15004:20;14999:2;14988:9;14984:18;14977:48;15042:76;15113:4;15104:6;15042:76;:::i;:::-;15034:84;;14485:640;;;;;;;:::o;15131:210::-;15218:4;15256:2;15245:9;15241:18;15233:26;;15269:65;15331:1;15320:9;15316:17;15307:6;15269:65;:::i;:::-;15131:210;;;;:::o;15347:286::-;15472:4;15510:2;15499:9;15495:18;15487:26;;15523:103;15623:1;15612:9;15608:17;15599:6;15523:103;:::i;:::-;15347:286;;;;:::o;15639:313::-;15752:4;15790:2;15779:9;15775:18;15767:26;;15839:9;15833:4;15829:20;15825:1;15814:9;15810:17;15803:47;15867:78;15940:4;15931:6;15867:78;:::i;:::-;15859:86;;15639:313;;;;:::o;15958:222::-;16051:4;16089:2;16078:9;16074:18;16066:26;;16102:71;16170:1;16159:9;16155:17;16146:6;16102:71;:::i;:::-;15958:222;;;;:::o;16186:129::-;16220:6;16247:20;;:::i;:::-;16237:30;;16276:33;16304:4;16296:6;16276:33;:::i;:::-;16186:129;;;:::o;16321:75::-;16354:6;16387:2;16381:9;16371:19;;16321:75;:::o;16402:307::-;16463:4;16553:18;16545:6;16542:30;16539:56;;;16575:18;;:::i;:::-;16539:56;16613:29;16635:6;16613:29;:::i;:::-;16605:37;;16697:4;16691;16687:15;16679:23;;16402:307;;;:::o;16715:308::-;16777:4;16867:18;16859:6;16856:30;16853:56;;;16889:18;;:::i;:::-;16853:56;16927:29;16949:6;16927:29;:::i;:::-;16919:37;;17011:4;17005;17001:15;16993:23;;16715:308;;;:::o;17029:141::-;17078:4;17101:3;17093:11;;17124:3;17121:1;17114:14;17158:4;17155:1;17145:18;17137:26;;17029:141;;;:::o;17176:98::-;17227:6;17261:5;17255:12;17245:22;;17176:98;;;:::o;17280:99::-;17332:6;17366:5;17360:12;17350:22;;17280:99;;;:::o;17385:168::-;17468:11;17502:6;17497:3;17490:19;17542:4;17537:3;17533:14;17518:29;;17385:168;;;;:::o;17559:169::-;17643:11;17677:6;17672:3;17665:19;17717:4;17712:3;17708:14;17693:29;;17559:169;;;;:::o;17734:148::-;17836:11;17873:3;17858:18;;17734:148;;;;:::o;17888:305::-;17928:3;17947:20;17965:1;17947:20;:::i;:::-;17942:25;;17981:20;17999:1;17981:20;:::i;:::-;17976:25;;18135:1;18067:66;18063:74;18060:1;18057:81;18054:107;;;18141:18;;:::i;:::-;18054:107;18185:1;18182;18178:9;18171:16;;17888:305;;;;:::o;18199:348::-;18239:7;18262:20;18280:1;18262:20;:::i;:::-;18257:25;;18296:20;18314:1;18296:20;:::i;:::-;18291:25;;18484:1;18416:66;18412:74;18409:1;18406:81;18401:1;18394:9;18387:17;18383:105;18380:131;;;18491:18;;:::i;:::-;18380:131;18539:1;18536;18532:9;18521:20;;18199:348;;;;:::o;18553:96::-;18590:7;18619:24;18637:5;18619:24;:::i;:::-;18608:35;;18553:96;;;:::o;18655:90::-;18689:7;18732:5;18725:13;18718:21;18707:32;;18655:90;;;:::o;18751:149::-;18787:7;18827:66;18820:5;18816:78;18805:89;;18751:149;;;:::o;18906:126::-;18943:7;18983:42;18976:5;18972:54;18961:65;;18906:126;;;:::o;19038:77::-;19075:7;19104:5;19093:16;;19038:77;;;:::o;19121:158::-;19203:9;19236:37;19267:5;19236:37;:::i;:::-;19223:50;;19121:158;;;:::o;19285:126::-;19335:9;19368:37;19399:5;19368:37;:::i;:::-;19355:50;;19285:126;;;:::o;19417:113::-;19467:9;19500:24;19518:5;19500:24;:::i;:::-;19487:37;;19417:113;;;:::o;19536:154::-;19620:6;19615:3;19610;19597:30;19682:1;19673:6;19668:3;19664:16;19657:27;19536:154;;;:::o;19696:307::-;19764:1;19774:113;19788:6;19785:1;19782:13;19774:113;;;19873:1;19868:3;19864:11;19858:18;19854:1;19849:3;19845:11;19838:39;19810:2;19807:1;19803:10;19798:15;;19774:113;;;19905:6;19902:1;19899:13;19896:101;;;19985:1;19976:6;19971:3;19967:16;19960:27;19896:101;19745:258;19696:307;;;:::o;20009:320::-;20053:6;20090:1;20084:4;20080:12;20070:22;;20137:1;20131:4;20127:12;20158:18;20148:81;;20214:4;20206:6;20202:17;20192:27;;20148:81;20276:2;20268:6;20265:14;20245:18;20242:38;20239:84;;;20295:18;;:::i;:::-;20239:84;20060:269;20009:320;;;:::o;20335:281::-;20418:27;20440:4;20418:27;:::i;:::-;20410:6;20406:40;20548:6;20536:10;20533:22;20512:18;20500:10;20497:34;20494:62;20491:88;;;20559:18;;:::i;:::-;20491:88;20599:10;20595:2;20588:22;20378:238;20335:281;;:::o;20622:180::-;20670:77;20667:1;20660:88;20767:4;20764:1;20757:15;20791:4;20788:1;20781:15;20808:180;20856:77;20853:1;20846:88;20953:4;20950:1;20943:15;20977:4;20974:1;20967:15;20994:180;21042:77;21039:1;21032:88;21139:4;21136:1;21129:15;21163:4;21160:1;21153:15;21180:180;21228:77;21225:1;21218:88;21325:4;21322:1;21315:15;21349:4;21346:1;21339:15;21366:117;21475:1;21472;21465:12;21489:117;21598:1;21595;21588:12;21612:117;21721:1;21718;21711:12;21735:117;21844:1;21841;21834:12;21858:117;21967:1;21964;21957:12;21981:117;22090:1;22087;22080:12;22104:102;22145:6;22196:2;22192:7;22187:2;22180:5;22176:14;22172:28;22162:38;;22104:102;;;:::o;22212:155::-;22352:7;22348:1;22340:6;22336:14;22329:31;22212:155;:::o;22373:122::-;22446:24;22464:5;22446:24;:::i;:::-;22439:5;22436:35;22426:63;;22485:1;22482;22475:12;22426:63;22373:122;:::o;22501:116::-;22571:21;22586:5;22571:21;:::i;:::-;22564:5;22561:32;22551:60;;22607:1;22604;22597:12;22551:60;22501:116;:::o;22623:120::-;22695:23;22712:5;22695:23;:::i;:::-;22688:5;22685:34;22675:62;;22733:1;22730;22723:12;22675:62;22623:120;:::o;22749:122::-;22822:24;22840:5;22822:24;:::i;:::-;22815:5;22812:35;22802:63;;22861:1;22858;22851:12;22802:63;22749:122;:::o

Swarm Source

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