ETH Price: $3,513.94 (+5.03%)

Token

CrazyRichYellows (CRY)
 

Overview

Max Total Supply

5,600 CRY

Holders

1,481

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CRY
0x9f7eFfBd44b978F1AEcEB955f6aD8A1F79F5ED25
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:
CrazyRichYellows

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-10-23
*/

// SPDX-License-Identifier: MIT

// File: erc721a/contracts/IERC721A.sol

// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

// File: erc721a/contracts/ERC721A.sol

// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        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)
        }
    }
}

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

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File: contract/CrazyRichYellows.sol

pragma solidity ^0.8.4;


contract CrazyRichYellows is ERC721A, Ownable {

    string private _baseTokenURI;

    constructor() ERC721A("CrazyRichYellows", "CRY") {
        _baseTokenURI = "ipfs://QmYCczt4PsA2vQ2JYwgaDXWEqgidYEtgYSoqnJPyJyCA7k/";
    }

    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    struct MintDatum {
        address to;
        uint256 quantity;
    }

    function bulkMint(MintDatum[] calldata mintData) external onlyOwner {

        for(uint i = 0; i < mintData.length; i++) {
            _mint(mintData[i].to, mintData[i].quantity);
        }
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

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

    function contractURI() public pure returns (string memory) 
    {
        return "ipfs://QmXoiTwZpugfjFq8BZJwKJrWp83t8NszYqVaJcpzaucDE1";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"internalType":"struct CrazyRichYellows.MintDatum[]","name":"mintData","type":"tuple[]"}],"name":"bulkMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"baseURI","type":"string"}],"name":"setBaseURI","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601081526020017f4372617a795269636859656c6c6f7773000000000000000000000000000000008152506040518060400160405280600381526020017f4352590000000000000000000000000000000000000000000000000000000000815250816002908051906020019062000096929190620001f7565b508060039080519060200190620000af929190620001f7565b50620000c06200012060201b60201c565b6000819055505050620000e8620000dc6200012960201b60201c565b6200013160201b60201c565b604051806060016040528060368152602001620026a9603691396009908051906020019062000119929190620001f7565b506200030c565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020590620002a7565b90600052602060002090601f01602090048101928262000229576000855562000275565b82601f106200024457805160ff191683800117855562000275565b8280016001018555821562000275579182015b828111156200027457825182559160200191906001019062000257565b5b50905062000284919062000288565b5090565b5b80821115620002a357600081600090555060010162000289565b5090565b60006002820490506001821680620002c057607f821691505b60208210811415620002d757620002d6620002dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61238d806200031c6000396000f3fe60806040526004361061011f5760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde146103aa578063c87b56dd146103c6578063e8a3d48514610403578063e985e9c51461042e578063f2fde38b1461046b5761011f565b806370a08231146102d7578063715018a6146103145780638da5cb5b1461032b57806395d89b4114610356578063a22cb465146103815761011f565b806323b872dd116100e757806323b872dd1461021057806333d98fd91461022c57806342842e0e1461025557806355f804b3146102715780636352211e1461029a5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806318160ddd146101e5575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190611c2e565b610494565b6040516101589190611e9f565b60405180910390f35b34801561016d57600080fd5b50610176610526565b6040516101839190611eba565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae9190611cd1565b6105b8565b6040516101c09190611e38565b60405180910390f35b6101e360048036038101906101de9190611ba1565b610637565b005b3480156101f157600080fd5b506101fa61077b565b6040516102079190611f1c565b60405180910390f35b61022a60048036038101906102259190611a8b565b610792565b005b34801561023857600080fd5b50610253600480360381019061024e9190611be1565b610ab7565b005b61026f600480360381019061026a9190611a8b565b610b35565b005b34801561027d57600080fd5b5061029860048036038101906102939190611c88565b610b55565b005b3480156102a657600080fd5b506102c160048036038101906102bc9190611cd1565b610b77565b6040516102ce9190611e38565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190611a1e565b610b89565b60405161030b9190611f1c565b60405180910390f35b34801561032057600080fd5b50610329610c42565b005b34801561033757600080fd5b50610340610c56565b60405161034d9190611e38565b60405180910390f35b34801561036257600080fd5b5061036b610c80565b6040516103789190611eba565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190611b61565b610d12565b005b6103c460048036038101906103bf9190611ade565b610e1d565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611cd1565b610e90565b6040516103fa9190611eba565b60405180910390f35b34801561040f57600080fd5b50610418610f2f565b6040516104259190611eba565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190611a4b565b610f4f565b6040516104629190611e9f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190611a1e565b610fe3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610535906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610561906120b7565b80156105ae5780601f10610583576101008083540402835291602001916105ae565b820191906000526020600020905b81548152906001019060200180831161059157829003601f168201915b5050505050905090565b60006105c382611067565b6105f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064282610b77565b90508073ffffffffffffffffffffffffffffffffffffffff166106636110c6565b73ffffffffffffffffffffffffffffffffffffffff16146106c65761068f8161068a6110c6565b610f4f565b6106c5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107856110ce565b6001546000540303905090565b600061079d826110d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610804576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610810846111a5565b9150915061082681876108216110c6565b6111cc565b6108725761083b866108366110c6565b610f4f565b610871576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156108d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e68686866001611210565b80156108f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109bf8561099b888887611216565b7c02000000000000000000000000000000000000000000000000000000001761123e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610a47576000600185019050600060046000838152602001908152602001600020541415610a45576000548114610a44578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610aaf8686866001611269565b505050505050565b610abf61126f565b60005b82829050811015610b3057610b1d838383818110610ae357610ae26121c1565b5b9050604002016000016020810190610afb9190611a1e565b848484818110610b0e57610b0d6121c1565b5b905060400201602001356112ed565b8080610b289061211a565b915050610ac2565b505050565b610b5083838360405180602001604052806000815250610e1d565b505050565b610b5d61126f565b8060099080519060200190610b739291906117dc565b5050565b6000610b82826110d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bf1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c4a61126f565b610c5460006114aa565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c8f906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906120b7565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b8060076000610d1f6110c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dcc6110c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e119190611e9f565b60405180910390a35050565b610e28848484610792565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610e8a57610e5384848484611570565b610e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610e9b82611067565b610ed1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610edb6116d0565b9050600081511415610efc5760405180602001604052806000815250610f27565b80610f0684611762565b604051602001610f17929190611e14565b6040516020818303038152906040525b915050919050565b606060405180606001604052806035815260200161232360359139905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610feb61126f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290611edc565b60405180910390fd5b611064816114aa565b50565b6000816110726110ce565b11158015611081575060005482105b80156110bf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806110e66110ce565b1161116e5760005481101561116d5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561116b575b6000811415611161576004600083600190039350838152602001908152602001600020549050611136565b80925050506111a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861122d8686846117bb565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6112776117c4565b73ffffffffffffffffffffffffffffffffffffffff16611295610c56565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290611efc565b60405180910390fd5b565b600080549050600082141561132e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61133b6000848385611210565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506113b2836113a36000866000611216565b6113ac856117cc565b1761123e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461145357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611418565b50600082141561148f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506114a56000848385611269565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026115966110c6565b8786866040518563ffffffff1660e01b81526004016115b89493929190611e53565b602060405180830381600087803b1580156115d257600080fd5b505af192505050801561160357506040513d601f19601f820116820180604052508101906116009190611c5b565b60015b61167d573d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b50600081511415611675576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546116df906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461170b906120b7565b80156117585780601f1061172d57610100808354040283529160200191611758565b820191906000526020600020905b81548152906001019060200180831161173b57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156117a657600184039350600a81066030018453600a81049050806117a1576117a6565b61177b565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b8280546117e8906120b7565b90600052602060002090601f01602090048101928261180a5760008555611851565b82601f1061182357805160ff1916838001178555611851565b82800160010185558215611851579182015b82811115611850578251825591602001919060010190611835565b5b50905061185e9190611862565b5090565b5b8082111561187b576000816000905550600101611863565b5090565b600061189261188d84611f5c565b611f37565b9050828152602081018484840111156118ae576118ad61222e565b5b6118b9848285612075565b509392505050565b60006118d46118cf84611f8d565b611f37565b9050828152602081018484840111156118f0576118ef61222e565b5b6118fb848285612075565b509392505050565b600081359050611912816122c6565b92915050565b60008083601f84011261192e5761192d612224565b5b8235905067ffffffffffffffff81111561194b5761194a61221f565b5b60208301915083604082028301111561196757611966612229565b5b9250929050565b60008135905061197d816122dd565b92915050565b600081359050611992816122f4565b92915050565b6000815190506119a7816122f4565b92915050565b600082601f8301126119c2576119c1612224565b5b81356119d284826020860161187f565b91505092915050565b600082601f8301126119f0576119ef612224565b5b8135611a008482602086016118c1565b91505092915050565b600081359050611a188161230b565b92915050565b600060208284031215611a3457611a33612238565b5b6000611a4284828501611903565b91505092915050565b60008060408385031215611a6257611a61612238565b5b6000611a7085828601611903565b9250506020611a8185828601611903565b9150509250929050565b600080600060608486031215611aa457611aa3612238565b5b6000611ab286828701611903565b9350506020611ac386828701611903565b9250506040611ad486828701611a09565b9150509250925092565b60008060008060808587031215611af857611af7612238565b5b6000611b0687828801611903565b9450506020611b1787828801611903565b9350506040611b2887828801611a09565b925050606085013567ffffffffffffffff811115611b4957611b48612233565b5b611b55878288016119ad565b91505092959194509250565b60008060408385031215611b7857611b77612238565b5b6000611b8685828601611903565b9250506020611b978582860161196e565b9150509250929050565b60008060408385031215611bb857611bb7612238565b5b6000611bc685828601611903565b9250506020611bd785828601611a09565b9150509250929050565b60008060208385031215611bf857611bf7612238565b5b600083013567ffffffffffffffff811115611c1657611c15612233565b5b611c2285828601611918565b92509250509250929050565b600060208284031215611c4457611c43612238565b5b6000611c5284828501611983565b91505092915050565b600060208284031215611c7157611c70612238565b5b6000611c7f84828501611998565b91505092915050565b600060208284031215611c9e57611c9d612238565b5b600082013567ffffffffffffffff811115611cbc57611cbb612233565b5b611cc8848285016119db565b91505092915050565b600060208284031215611ce757611ce6612238565b5b6000611cf584828501611a09565b91505092915050565b611d0781612001565b82525050565b611d1681612013565b82525050565b6000611d2782611fbe565b611d318185611fd4565b9350611d41818560208601612084565b611d4a8161223d565b840191505092915050565b6000611d6082611fc9565b611d6a8185611fe5565b9350611d7a818560208601612084565b611d838161223d565b840191505092915050565b6000611d9982611fc9565b611da38185611ff6565b9350611db3818560208601612084565b80840191505092915050565b6000611dcc602683611fe5565b9150611dd78261224e565b604082019050919050565b6000611def602083611fe5565b9150611dfa8261229d565b602082019050919050565b611e0e8161206b565b82525050565b6000611e208285611d8e565b9150611e2c8284611d8e565b91508190509392505050565b6000602082019050611e4d6000830184611cfe565b92915050565b6000608082019050611e686000830187611cfe565b611e756020830186611cfe565b611e826040830185611e05565b8181036060830152611e948184611d1c565b905095945050505050565b6000602082019050611eb46000830184611d0d565b92915050565b60006020820190508181036000830152611ed48184611d55565b905092915050565b60006020820190508181036000830152611ef581611dbf565b9050919050565b60006020820190508181036000830152611f1581611de2565b9050919050565b6000602082019050611f316000830184611e05565b92915050565b6000611f41611f52565b9050611f4d82826120e9565b919050565b6000604051905090565b600067ffffffffffffffff821115611f7757611f766121f0565b5b611f808261223d565b9050602081019050919050565b600067ffffffffffffffff821115611fa857611fa76121f0565b5b611fb18261223d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061200c8261204b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120a2578082015181840152602081019050612087565b838111156120b1576000848401525b50505050565b600060028204905060018216806120cf57607f821691505b602082108114156120e3576120e2612192565b5b50919050565b6120f28261223d565b810181811067ffffffffffffffff82111715612111576121106121f0565b5b80604052505050565b60006121258261206b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561215857612157612163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6122cf81612001565b81146122da57600080fd5b50565b6122e681612013565b81146122f157600080fd5b50565b6122fd8161201f565b811461230857600080fd5b50565b6123148161206b565b811461231f57600080fd5b5056fe697066733a2f2f516d586f6954775a707567666a467138425a4a774b4a725770383374384e737a597156614a63707a617563444531a26469706673582212200c5a83bccaa500a409f822f88414b0da1b738e47a95b933a8696c57c1afaed9264736f6c63430008070033697066733a2f2f516d5943637a7434507341327651324a5977676144585745716769645945746759536f716e4a50794a794341376b2f

Deployed Bytecode

0x60806040526004361061011f5760003560e01c806370a08231116100a0578063b88d4fde11610064578063b88d4fde146103aa578063c87b56dd146103c6578063e8a3d48514610403578063e985e9c51461042e578063f2fde38b1461046b5761011f565b806370a08231146102d7578063715018a6146103145780638da5cb5b1461032b57806395d89b4114610356578063a22cb465146103815761011f565b806323b872dd116100e757806323b872dd1461021057806333d98fd91461022c57806342842e0e1461025557806355f804b3146102715780636352211e1461029a5761011f565b806301ffc9a71461012457806306fdde0314610161578063081812fc1461018c578063095ea7b3146101c957806318160ddd146101e5575b600080fd5b34801561013057600080fd5b5061014b60048036038101906101469190611c2e565b610494565b6040516101589190611e9f565b60405180910390f35b34801561016d57600080fd5b50610176610526565b6040516101839190611eba565b60405180910390f35b34801561019857600080fd5b506101b360048036038101906101ae9190611cd1565b6105b8565b6040516101c09190611e38565b60405180910390f35b6101e360048036038101906101de9190611ba1565b610637565b005b3480156101f157600080fd5b506101fa61077b565b6040516102079190611f1c565b60405180910390f35b61022a60048036038101906102259190611a8b565b610792565b005b34801561023857600080fd5b50610253600480360381019061024e9190611be1565b610ab7565b005b61026f600480360381019061026a9190611a8b565b610b35565b005b34801561027d57600080fd5b5061029860048036038101906102939190611c88565b610b55565b005b3480156102a657600080fd5b506102c160048036038101906102bc9190611cd1565b610b77565b6040516102ce9190611e38565b60405180910390f35b3480156102e357600080fd5b506102fe60048036038101906102f99190611a1e565b610b89565b60405161030b9190611f1c565b60405180910390f35b34801561032057600080fd5b50610329610c42565b005b34801561033757600080fd5b50610340610c56565b60405161034d9190611e38565b60405180910390f35b34801561036257600080fd5b5061036b610c80565b6040516103789190611eba565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a39190611b61565b610d12565b005b6103c460048036038101906103bf9190611ade565b610e1d565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190611cd1565b610e90565b6040516103fa9190611eba565b60405180910390f35b34801561040f57600080fd5b50610418610f2f565b6040516104259190611eba565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190611a4b565b610f4f565b6040516104629190611e9f565b60405180910390f35b34801561047757600080fd5b50610492600480360381019061048d9190611a1e565b610fe3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104ef57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061051f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610535906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610561906120b7565b80156105ae5780601f10610583576101008083540402835291602001916105ae565b820191906000526020600020905b81548152906001019060200180831161059157829003601f168201915b5050505050905090565b60006105c382611067565b6105f9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064282610b77565b90508073ffffffffffffffffffffffffffffffffffffffff166106636110c6565b73ffffffffffffffffffffffffffffffffffffffff16146106c65761068f8161068a6110c6565b610f4f565b6106c5576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107856110ce565b6001546000540303905090565b600061079d826110d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610804576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610810846111a5565b9150915061082681876108216110c6565b6111cc565b6108725761083b866108366110c6565b610f4f565b610871576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156108d9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e68686866001611210565b80156108f157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109bf8561099b888887611216565b7c02000000000000000000000000000000000000000000000000000000001761123e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610a47576000600185019050600060046000838152602001908152602001600020541415610a45576000548114610a44578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610aaf8686866001611269565b505050505050565b610abf61126f565b60005b82829050811015610b3057610b1d838383818110610ae357610ae26121c1565b5b9050604002016000016020810190610afb9190611a1e565b848484818110610b0e57610b0d6121c1565b5b905060400201602001356112ed565b8080610b289061211a565b915050610ac2565b505050565b610b5083838360405180602001604052806000815250610e1d565b505050565b610b5d61126f565b8060099080519060200190610b739291906117dc565b5050565b6000610b82826110d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bf1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610c4a61126f565b610c5460006114aa565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610c8f906120b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbb906120b7565b8015610d085780601f10610cdd57610100808354040283529160200191610d08565b820191906000526020600020905b815481529060010190602001808311610ceb57829003601f168201915b5050505050905090565b8060076000610d1f6110c6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610dcc6110c6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e119190611e9f565b60405180910390a35050565b610e28848484610792565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610e8a57610e5384848484611570565b610e89576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610e9b82611067565b610ed1576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610edb6116d0565b9050600081511415610efc5760405180602001604052806000815250610f27565b80610f0684611762565b604051602001610f17929190611e14565b6040516020818303038152906040525b915050919050565b606060405180606001604052806035815260200161232360359139905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610feb61126f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290611edc565b60405180910390fd5b611064816114aa565b50565b6000816110726110ce565b11158015611081575060005482105b80156110bf575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806110e66110ce565b1161116e5760005481101561116d5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561116b575b6000811415611161576004600083600190039350838152602001908152602001600020549050611136565b80925050506111a0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861122d8686846117bb565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6112776117c4565b73ffffffffffffffffffffffffffffffffffffffff16611295610c56565b73ffffffffffffffffffffffffffffffffffffffff16146112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e290611efc565b60405180910390fd5b565b600080549050600082141561132e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61133b6000848385611210565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506113b2836113a36000866000611216565b6113ac856117cc565b1761123e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461145357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611418565b50600082141561148f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506114a56000848385611269565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026115966110c6565b8786866040518563ffffffff1660e01b81526004016115b89493929190611e53565b602060405180830381600087803b1580156115d257600080fd5b505af192505050801561160357506040513d601f19601f820116820180604052508101906116009190611c5b565b60015b61167d573d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b50600081511415611675576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600980546116df906120b7565b80601f016020809104026020016040519081016040528092919081815260200182805461170b906120b7565b80156117585780601f1061172d57610100808354040283529160200191611758565b820191906000526020600020905b81548152906001019060200180831161173b57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156117a657600184039350600a81066030018453600a81049050806117a1576117a6565b61177b565b50828103602084039350808452505050919050565b60009392505050565b600033905090565b60006001821460e11b9050919050565b8280546117e8906120b7565b90600052602060002090601f01602090048101928261180a5760008555611851565b82601f1061182357805160ff1916838001178555611851565b82800160010185558215611851579182015b82811115611850578251825591602001919060010190611835565b5b50905061185e9190611862565b5090565b5b8082111561187b576000816000905550600101611863565b5090565b600061189261188d84611f5c565b611f37565b9050828152602081018484840111156118ae576118ad61222e565b5b6118b9848285612075565b509392505050565b60006118d46118cf84611f8d565b611f37565b9050828152602081018484840111156118f0576118ef61222e565b5b6118fb848285612075565b509392505050565b600081359050611912816122c6565b92915050565b60008083601f84011261192e5761192d612224565b5b8235905067ffffffffffffffff81111561194b5761194a61221f565b5b60208301915083604082028301111561196757611966612229565b5b9250929050565b60008135905061197d816122dd565b92915050565b600081359050611992816122f4565b92915050565b6000815190506119a7816122f4565b92915050565b600082601f8301126119c2576119c1612224565b5b81356119d284826020860161187f565b91505092915050565b600082601f8301126119f0576119ef612224565b5b8135611a008482602086016118c1565b91505092915050565b600081359050611a188161230b565b92915050565b600060208284031215611a3457611a33612238565b5b6000611a4284828501611903565b91505092915050565b60008060408385031215611a6257611a61612238565b5b6000611a7085828601611903565b9250506020611a8185828601611903565b9150509250929050565b600080600060608486031215611aa457611aa3612238565b5b6000611ab286828701611903565b9350506020611ac386828701611903565b9250506040611ad486828701611a09565b9150509250925092565b60008060008060808587031215611af857611af7612238565b5b6000611b0687828801611903565b9450506020611b1787828801611903565b9350506040611b2887828801611a09565b925050606085013567ffffffffffffffff811115611b4957611b48612233565b5b611b55878288016119ad565b91505092959194509250565b60008060408385031215611b7857611b77612238565b5b6000611b8685828601611903565b9250506020611b978582860161196e565b9150509250929050565b60008060408385031215611bb857611bb7612238565b5b6000611bc685828601611903565b9250506020611bd785828601611a09565b9150509250929050565b60008060208385031215611bf857611bf7612238565b5b600083013567ffffffffffffffff811115611c1657611c15612233565b5b611c2285828601611918565b92509250509250929050565b600060208284031215611c4457611c43612238565b5b6000611c5284828501611983565b91505092915050565b600060208284031215611c7157611c70612238565b5b6000611c7f84828501611998565b91505092915050565b600060208284031215611c9e57611c9d612238565b5b600082013567ffffffffffffffff811115611cbc57611cbb612233565b5b611cc8848285016119db565b91505092915050565b600060208284031215611ce757611ce6612238565b5b6000611cf584828501611a09565b91505092915050565b611d0781612001565b82525050565b611d1681612013565b82525050565b6000611d2782611fbe565b611d318185611fd4565b9350611d41818560208601612084565b611d4a8161223d565b840191505092915050565b6000611d6082611fc9565b611d6a8185611fe5565b9350611d7a818560208601612084565b611d838161223d565b840191505092915050565b6000611d9982611fc9565b611da38185611ff6565b9350611db3818560208601612084565b80840191505092915050565b6000611dcc602683611fe5565b9150611dd78261224e565b604082019050919050565b6000611def602083611fe5565b9150611dfa8261229d565b602082019050919050565b611e0e8161206b565b82525050565b6000611e208285611d8e565b9150611e2c8284611d8e565b91508190509392505050565b6000602082019050611e4d6000830184611cfe565b92915050565b6000608082019050611e686000830187611cfe565b611e756020830186611cfe565b611e826040830185611e05565b8181036060830152611e948184611d1c565b905095945050505050565b6000602082019050611eb46000830184611d0d565b92915050565b60006020820190508181036000830152611ed48184611d55565b905092915050565b60006020820190508181036000830152611ef581611dbf565b9050919050565b60006020820190508181036000830152611f1581611de2565b9050919050565b6000602082019050611f316000830184611e05565b92915050565b6000611f41611f52565b9050611f4d82826120e9565b919050565b6000604051905090565b600067ffffffffffffffff821115611f7757611f766121f0565b5b611f808261223d565b9050602081019050919050565b600067ffffffffffffffff821115611fa857611fa76121f0565b5b611fb18261223d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061200c8261204b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156120a2578082015181840152602081019050612087565b838111156120b1576000848401525b50505050565b600060028204905060018216806120cf57607f821691505b602082108114156120e3576120e2612192565b5b50919050565b6120f28261223d565b810181811067ffffffffffffffff82111715612111576121106121f0565b5b80604052505050565b60006121258261206b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561215857612157612163565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6122cf81612001565b81146122da57600080fd5b50565b6122e681612013565b81146122f157600080fd5b50565b6122fd8161201f565b811461230857600080fd5b50565b6123148161206b565b811461231f57600080fd5b5056fe697066733a2f2f516d586f6954775a707567666a467138425a4a774b4a725770383374384e737a597156614a63707a617563444531a26469706673582212200c5a83bccaa500a409f822f88414b0da1b738e47a95b933a8696c57c1afaed9264736f6c63430008070033

Deployed Bytecode Sourcemap

55122:1019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18433:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19335:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25826:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25259:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15086:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29465:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55552:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32386:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55760:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20728:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16270:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54234:103;;;;;;;;;;;;;:::i;:::-;;53586:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19511:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26384:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33177:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19721:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55992:146;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54492:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18433:639;18518:4;18857:10;18842:25;;:11;:25;;;;:102;;;;18934:10;18919:25;;:11;:25;;;;18842:102;:179;;;;19011:10;18996:25;;:11;:25;;;;18842:179;18822:199;;18433:639;;;:::o;19335:100::-;19389:13;19422:5;19415:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19335:100;:::o;25826:218::-;25902:7;25927:16;25935:7;25927;:16::i;:::-;25922:64;;25952:34;;;;;;;;;;;;;;25922:64;26006:15;:24;26022:7;26006:24;;;;;;;;;;;:30;;;;;;;;;;;;25999:37;;25826:218;;;:::o;25259:408::-;25348:13;25364:16;25372:7;25364;:16::i;:::-;25348:32;;25420:5;25397:28;;:19;:17;:19::i;:::-;:28;;;25393:175;;25445:44;25462:5;25469:19;:17;:19::i;:::-;25445:16;:44::i;:::-;25440:128;;25517:35;;;;;;;;;;;;;;25440:128;25393:175;25613:2;25580:15;:24;25596:7;25580:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25651:7;25647:2;25631:28;;25640:5;25631:28;;;;;;;;;;;;25337:330;25259:408;;:::o;15086:323::-;15147:7;15375:15;:13;:15::i;:::-;15360:12;;15344:13;;:28;:46;15337:53;;15086:323;:::o;29465:2825::-;29607:27;29637;29656:7;29637:18;:27::i;:::-;29607:57;;29722:4;29681:45;;29697:19;29681:45;;;29677:86;;29735:28;;;;;;;;;;;;;;29677:86;29777:27;29806:23;29833:35;29860:7;29833:26;:35::i;:::-;29776:92;;;;29968:68;29993:15;30010:4;30016:19;:17;:19::i;:::-;29968:24;:68::i;:::-;29963:180;;30056:43;30073:4;30079:19;:17;:19::i;:::-;30056:16;:43::i;:::-;30051:92;;30108:35;;;;;;;;;;;;;;30051:92;29963:180;30174:1;30160:16;;:2;:16;;;30156:52;;;30185:23;;;;;;;;;;;;;;30156:52;30221:43;30243:4;30249:2;30253:7;30262:1;30221:21;:43::i;:::-;30357:15;30354:160;;;30497:1;30476:19;30469:30;30354:160;30894:18;:24;30913:4;30894:24;;;;;;;;;;;;;;;;30892:26;;;;;;;;;;;;30963:18;:22;30982:2;30963:22;;;;;;;;;;;;;;;;30961:24;;;;;;;;;;;31285:146;31322:2;31371:45;31386:4;31392:2;31396:19;31371:14;:45::i;:::-;11485:8;31343:73;31285:18;:146::i;:::-;31256:17;:26;31274:7;31256:26;;;;;;;;;;;:175;;;;31602:1;11485:8;31551:19;:47;:52;31547:627;;;31624:19;31656:1;31646:7;:11;31624:33;;31813:1;31779:17;:30;31797:11;31779:30;;;;;;;;;;;;:35;31775:384;;;31917:13;;31902:11;:28;31898:242;;32097:19;32064:17;:30;32082:11;32064:30;;;;;;;;;;;:52;;;;31898:242;31775:384;31605:569;31547:627;32221:7;32217:2;32202:27;;32211:4;32202:27;;;;;;;;;;;;32240:42;32261:4;32267:2;32271:7;32280:1;32240:20;:42::i;:::-;29596:2694;;;29465:2825;;;:::o;55552:200::-;53472:13;:11;:13::i;:::-;55637:6:::1;55633:112;55653:8;;:15;;55649:1;:19;55633:112;;;55690:43;55696:8;;55705:1;55696:11;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;:::i;:::-;55712:8;;55721:1;55712:11;;;;;;;:::i;:::-;;;;;;;:20;;;55690:5;:43::i;:::-;55670:3;;;;;:::i;:::-;;;;55633:112;;;;55552:200:::0;;:::o;32386:193::-;32532:39;32549:4;32555:2;32559:7;32532:39;;;;;;;;;;;;:16;:39::i;:::-;32386:193;;;:::o;55760:102::-;53472:13;:11;:13::i;:::-;55847:7:::1;55831:13;:23;;;;;;;;;;;;:::i;:::-;;55760:102:::0;:::o;20728:152::-;20800:7;20843:27;20862:7;20843:18;:27::i;:::-;20820:52;;20728:152;;;:::o;16270:233::-;16342:7;16383:1;16366:19;;:5;:19;;;16362:60;;;16394:28;;;;;;;;;;;;;;16362:60;10429:13;16440:18;:25;16459:5;16440:25;;;;;;;;;;;;;;;;:55;16433:62;;16270:233;;;:::o;54234:103::-;53472:13;:11;:13::i;:::-;54299:30:::1;54326:1;54299:18;:30::i;:::-;54234:103::o:0;53586:87::-;53632:7;53659:6;;;;;;;;;;;53652:13;;53586:87;:::o;19511:104::-;19567:13;19600:7;19593:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19511:104;:::o;26384:234::-;26531:8;26479:18;:39;26498:19;:17;:19::i;:::-;26479:39;;;;;;;;;;;;;;;:49;26519:8;26479:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26591:8;26555:55;;26570:19;:17;:19::i;:::-;26555:55;;;26601:8;26555:55;;;;;;:::i;:::-;;;;;;;;26384:234;;:::o;33177:407::-;33352:31;33365:4;33371:2;33375:7;33352:12;:31::i;:::-;33416:1;33398:2;:14;;;:19;33394:183;;33437:56;33468:4;33474:2;33478:7;33487:5;33437:30;:56::i;:::-;33432:145;;33521:40;;;;;;;;;;;;;;33432:145;33394:183;33177:407;;;;:::o;19721:318::-;19794:13;19825:16;19833:7;19825;:16::i;:::-;19820:59;;19850:29;;;;;;;;;;;;;;19820:59;19892:21;19916:10;:8;:10::i;:::-;19892:34;;19969:1;19950:7;19944:21;:26;;:87;;;;;;;;;;;;;;;;;19997:7;20006:18;20016:7;20006:9;:18::i;:::-;19980:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19944:87;19937:94;;;19721:318;;;:::o;55992:146::-;56036:13;56068:62;;;;;;;;;;;;;;;;;;;55992:146;:::o;26775:164::-;26872:4;26896:18;:25;26915:5;26896:25;;;;;;;;;;;;;;;:35;26922:8;26896:35;;;;;;;;;;;;;;;;;;;;;;;;;26889:42;;26775:164;;;;:::o;54492:201::-;53472:13;:11;:13::i;:::-;54601:1:::1;54581:22;;:8;:22;;;;54573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54657:28;54676:8;54657:18;:28::i;:::-;54492:201:::0;:::o;27197:282::-;27262:4;27318:7;27299:15;:13;:15::i;:::-;:26;;:66;;;;;27352:13;;27342:7;:23;27299:66;:153;;;;;27451:1;11205:8;27403:17;:26;27421:7;27403:26;;;;;;;;;;;;:44;:49;27299:153;27279:173;;27197:282;;;:::o;49505:105::-;49565:7;49592:10;49585:17;;49505:105;:::o;55362:101::-;55427:7;55454:1;55447:8;;55362:101;:::o;21883:1275::-;21950:7;21970:12;21985:7;21970:22;;22053:4;22034:15;:13;:15::i;:::-;:23;22030:1061;;22087:13;;22080:4;:20;22076:1015;;;22125:14;22142:17;:23;22160:4;22142:23;;;;;;;;;;;;22125:40;;22259:1;11205:8;22231:6;:24;:29;22227:845;;;22896:113;22913:1;22903:6;:11;22896:113;;;22956:17;:25;22974:6;;;;;;;22956:25;;;;;;;;;;;;22947:34;;22896:113;;;23042:6;23035:13;;;;;;22227:845;22102:989;22076:1015;22030:1061;23119:31;;;;;;;;;;;;;;21883:1275;;;;:::o;28360:485::-;28462:27;28491:23;28532:38;28573:15;:24;28589:7;28573:24;;;;;;;;;;;28532:65;;28750:18;28727:41;;28807:19;28801:26;28782:45;;28712:126;28360:485;;;:::o;27588:659::-;27737:11;27902:16;27895:5;27891:28;27882:37;;28062:16;28051:9;28047:32;28034:45;;28212:15;28201:9;28198:30;28190:5;28179:9;28176:20;28173:56;28163:66;;27588:659;;;;;:::o;34246:159::-;;;;;:::o;48814:311::-;48949:7;48969:16;11609:3;48995:19;:41;;48969:68;;11609:3;49063:31;49074:4;49080:2;49084:9;49063:10;:31::i;:::-;49055:40;;:62;;49048:69;;;48814:311;;;;;:::o;23706:450::-;23786:14;23954:16;23947:5;23943:28;23934:37;;24131:5;24117:11;24092:23;24088:41;24085:52;24078:5;24075:63;24065:73;;23706:450;;;;:::o;35070:158::-;;;;;:::o;53751:132::-;53826:12;:10;:12::i;:::-;53815:23;;:7;:5;:7::i;:::-;:23;;;53807:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53751:132::o;36846:2966::-;36919:20;36942:13;;36919:36;;36982:1;36970:8;:13;36966:44;;;36992:18;;;;;;;;;;;;;;36966:44;37023:61;37053:1;37057:2;37061:12;37075:8;37023:21;:61::i;:::-;37567:1;10567:2;37537:1;:26;;37536:32;37524:8;:45;37498:18;:22;37517:2;37498:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37846:139;37883:2;37937:33;37960:1;37964:2;37968:1;37937:14;:33::i;:::-;37904:30;37925:8;37904:20;:30::i;:::-;:66;37846:18;:139::i;:::-;37812:17;:31;37830:12;37812:31;;;;;;;;;;;:173;;;;38002:16;38033:11;38062:8;38047:12;:23;38033:37;;38583:16;38579:2;38575:25;38563:37;;38955:12;38915:8;38874:1;38812:25;38753:1;38692;38665:335;39326:1;39312:12;39308:20;39266:346;39367:3;39358:7;39355:16;39266:346;;39585:7;39575:8;39572:1;39545:25;39542:1;39539;39534:59;39420:1;39411:7;39407:15;39396:26;;39266:346;;;39270:77;39657:1;39645:8;:13;39641:45;;;39667:19;;;;;;;;;;;;;;39641:45;39719:3;39703:13;:19;;;;37272:2462;;39744:60;39773:1;39777:2;39781:12;39795:8;39744:20;:60::i;:::-;36908:2904;36846:2966;;:::o;54853:191::-;54927:16;54946:6;;;;;;;;;;;54927:25;;54972:8;54963:6;;:17;;;;;;;;;;;;;;;;;;55027:8;54996:40;;55017:8;54996:40;;;;;;;;;;;;54916:128;54853:191;:::o;35668:716::-;35831:4;35877:2;35852:45;;;35898:19;:17;:19::i;:::-;35919:4;35925:7;35934:5;35852:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35848:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36152:1;36135:6;:13;:18;36131:235;;;36181:40;;;;;;;;;;;;;;36131:235;36324:6;36318:13;36309:6;36305:2;36301:15;36294:38;35848:529;36021:54;;;36011:64;;;:6;:64;;;;36004:71;;;35668:716;;;;;;:::o;55870:114::-;55930:13;55963;55956:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55870:114;:::o;49712:1745::-;49777:17;50211:4;50204;50198:11;50194:22;50303:1;50297:4;50290:15;50378:4;50375:1;50371:12;50364:19;;50460:1;50455:3;50448:14;50564:3;50803:5;50785:428;50811:1;50785:428;;;50851:1;50846:3;50842:11;50835:18;;51022:2;51016:4;51012:13;51008:2;51004:22;50999:3;50991:36;51116:2;51110:4;51106:13;51098:21;;51183:4;51173:25;;51191:5;;51173:25;50785:428;;;50789:21;51252:3;51247;51243:13;51367:4;51362:3;51358:14;51351:21;;51432:6;51427:3;51420:19;49816:1634;;;49712:1745;;;:::o;48515:147::-;48652:6;48515:147;;;;;:::o;52141:98::-;52194:7;52221:10;52214:17;;52141:98;:::o;24258:324::-;24328:14;24561:1;24551:8;24548:15;24522:24;24518:46;24508:56;;24258:324;;;:::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;1029:597::-;1131:8;1141:6;1191:3;1184:4;1176:6;1172:17;1168:27;1158:122;;1199:79;;:::i;:::-;1158:122;1312:6;1299:20;1289:30;;1342:18;1334:6;1331:30;1328:117;;;1364:79;;:::i;:::-;1328:117;1478:4;1470:6;1466:17;1454:29;;1532:3;1524:4;1516:6;1512:17;1502:8;1498:32;1495:41;1492:128;;;1539:79;;:::i;:::-;1492:128;1029:597;;;;;:::o;1632:133::-;1675:5;1713:6;1700:20;1691:29;;1729:30;1753:5;1729:30;:::i;:::-;1632:133;;;;:::o;1771:137::-;1816:5;1854:6;1841:20;1832:29;;1870:32;1896:5;1870:32;:::i;:::-;1771:137;;;;:::o;1914:141::-;1970:5;2001:6;1995:13;1986:22;;2017:32;2043:5;2017:32;:::i;:::-;1914:141;;;;:::o;2074:338::-;2129:5;2178:3;2171:4;2163:6;2159:17;2155:27;2145:122;;2186:79;;:::i;:::-;2145:122;2303:6;2290:20;2328:78;2402:3;2394:6;2387:4;2379:6;2375:17;2328:78;:::i;:::-;2319:87;;2135:277;2074:338;;;;:::o;2432:340::-;2488:5;2537:3;2530:4;2522:6;2518:17;2514:27;2504:122;;2545:79;;:::i;:::-;2504:122;2662:6;2649:20;2687:79;2762:3;2754:6;2747:4;2739:6;2735:17;2687:79;:::i;:::-;2678:88;;2494:278;2432:340;;;;:::o;2778:139::-;2824:5;2862:6;2849:20;2840:29;;2878:33;2905:5;2878:33;:::i;:::-;2778:139;;;;:::o;2923:329::-;2982:6;3031:2;3019:9;3010:7;3006:23;3002:32;2999:119;;;3037:79;;:::i;:::-;2999:119;3157:1;3182:53;3227:7;3218:6;3207:9;3203:22;3182:53;:::i;:::-;3172:63;;3128:117;2923:329;;;;:::o;3258:474::-;3326:6;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3258:474;;;;;:::o;3738:619::-;3815:6;3823;3831;3880:2;3868:9;3859:7;3855:23;3851:32;3848:119;;;3886:79;;:::i;:::-;3848:119;4006:1;4031:53;4076:7;4067:6;4056:9;4052:22;4031:53;:::i;:::-;4021:63;;3977:117;4133:2;4159:53;4204:7;4195:6;4184:9;4180:22;4159:53;:::i;:::-;4149:63;;4104:118;4261:2;4287:53;4332:7;4323:6;4312:9;4308:22;4287:53;:::i;:::-;4277:63;;4232:118;3738:619;;;;;:::o;4363:943::-;4458:6;4466;4474;4482;4531:3;4519:9;4510:7;4506:23;4502:33;4499:120;;;4538:79;;:::i;:::-;4499:120;4658:1;4683:53;4728:7;4719:6;4708:9;4704:22;4683:53;:::i;:::-;4673:63;;4629:117;4785:2;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4756:118;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5069:2;5058:9;5054:18;5041:32;5100:18;5092:6;5089:30;5086:117;;;5122:79;;:::i;:::-;5086:117;5227:62;5281:7;5272:6;5261:9;5257:22;5227:62;:::i;:::-;5217:72;;5012:287;4363:943;;;;;;;:::o;5312:468::-;5377:6;5385;5434:2;5422:9;5413:7;5409:23;5405:32;5402:119;;;5440:79;;:::i;:::-;5402:119;5560:1;5585:53;5630:7;5621:6;5610:9;5606:22;5585:53;:::i;:::-;5575:63;;5531:117;5687:2;5713:50;5755:7;5746:6;5735:9;5731:22;5713:50;:::i;:::-;5703:60;;5658:115;5312:468;;;;;:::o;5786:474::-;5854:6;5862;5911:2;5899:9;5890:7;5886:23;5882:32;5879:119;;;5917:79;;:::i;:::-;5879:119;6037:1;6062:53;6107:7;6098:6;6087:9;6083:22;6062:53;:::i;:::-;6052:63;;6008:117;6164:2;6190:53;6235:7;6226:6;6215:9;6211:22;6190:53;:::i;:::-;6180:63;;6135:118;5786:474;;;;;:::o;6266:617::-;6381:6;6389;6438:2;6426:9;6417:7;6413:23;6409:32;6406:119;;;6444:79;;:::i;:::-;6406:119;6592:1;6581:9;6577:17;6564:31;6622:18;6614:6;6611:30;6608:117;;;6644:79;;:::i;:::-;6608:117;6757:109;6858:7;6849:6;6838:9;6834:22;6757:109;:::i;:::-;6739:127;;;;6535:341;6266:617;;;;;:::o;6889:327::-;6947:6;6996:2;6984:9;6975:7;6971:23;6967:32;6964:119;;;7002:79;;:::i;:::-;6964:119;7122:1;7147:52;7191:7;7182:6;7171:9;7167:22;7147:52;:::i;:::-;7137:62;;7093:116;6889:327;;;;:::o;7222:349::-;7291:6;7340:2;7328:9;7319:7;7315:23;7311:32;7308:119;;;7346:79;;:::i;:::-;7308:119;7466:1;7491:63;7546:7;7537:6;7526:9;7522:22;7491:63;:::i;:::-;7481:73;;7437:127;7222:349;;;;:::o;7577:509::-;7646:6;7695:2;7683:9;7674:7;7670:23;7666:32;7663:119;;;7701:79;;:::i;:::-;7663:119;7849:1;7838:9;7834:17;7821:31;7879:18;7871:6;7868:30;7865:117;;;7901:79;;:::i;:::-;7865:117;8006:63;8061:7;8052:6;8041:9;8037:22;8006:63;:::i;:::-;7996:73;;7792:287;7577:509;;;;:::o;8092:329::-;8151:6;8200:2;8188:9;8179:7;8175:23;8171:32;8168:119;;;8206:79;;:::i;:::-;8168:119;8326:1;8351:53;8396:7;8387:6;8376:9;8372:22;8351:53;:::i;:::-;8341:63;;8297:117;8092:329;;;;:::o;8427:118::-;8514:24;8532:5;8514:24;:::i;:::-;8509:3;8502:37;8427:118;;:::o;8551:109::-;8632:21;8647:5;8632:21;:::i;:::-;8627:3;8620:34;8551:109;;:::o;8666:360::-;8752:3;8780:38;8812:5;8780:38;:::i;:::-;8834:70;8897:6;8892:3;8834:70;:::i;:::-;8827:77;;8913:52;8958:6;8953:3;8946:4;8939:5;8935:16;8913:52;:::i;:::-;8990:29;9012:6;8990:29;:::i;:::-;8985:3;8981:39;8974:46;;8756:270;8666:360;;;;:::o;9032:364::-;9120:3;9148:39;9181:5;9148:39;:::i;:::-;9203:71;9267:6;9262:3;9203:71;:::i;:::-;9196:78;;9283:52;9328:6;9323:3;9316:4;9309:5;9305:16;9283:52;:::i;:::-;9360:29;9382:6;9360:29;:::i;:::-;9355:3;9351:39;9344:46;;9124:272;9032:364;;;;:::o;9402:377::-;9508:3;9536:39;9569:5;9536:39;:::i;:::-;9591:89;9673:6;9668:3;9591:89;:::i;:::-;9584:96;;9689:52;9734:6;9729:3;9722:4;9715:5;9711:16;9689:52;:::i;:::-;9766:6;9761:3;9757:16;9750:23;;9512:267;9402:377;;;;:::o;9785:366::-;9927:3;9948:67;10012:2;10007:3;9948:67;:::i;:::-;9941:74;;10024:93;10113:3;10024:93;:::i;:::-;10142:2;10137:3;10133:12;10126:19;;9785:366;;;:::o;10157:::-;10299:3;10320:67;10384:2;10379:3;10320:67;:::i;:::-;10313:74;;10396:93;10485:3;10396:93;:::i;:::-;10514:2;10509:3;10505:12;10498:19;;10157:366;;;:::o;10529:118::-;10616:24;10634:5;10616:24;:::i;:::-;10611:3;10604:37;10529:118;;:::o;10653:435::-;10833:3;10855:95;10946:3;10937:6;10855:95;:::i;:::-;10848:102;;10967:95;11058:3;11049:6;10967:95;:::i;:::-;10960:102;;11079:3;11072:10;;10653:435;;;;;:::o;11094:222::-;11187:4;11225:2;11214:9;11210:18;11202:26;;11238:71;11306:1;11295:9;11291:17;11282:6;11238:71;:::i;:::-;11094:222;;;;:::o;11322:640::-;11517:4;11555:3;11544:9;11540:19;11532:27;;11569:71;11637:1;11626:9;11622:17;11613:6;11569:71;:::i;:::-;11650:72;11718:2;11707:9;11703:18;11694:6;11650:72;:::i;:::-;11732;11800:2;11789:9;11785:18;11776:6;11732:72;:::i;:::-;11851:9;11845:4;11841:20;11836:2;11825:9;11821:18;11814:48;11879:76;11950:4;11941:6;11879:76;:::i;:::-;11871:84;;11322:640;;;;;;;:::o;11968:210::-;12055:4;12093:2;12082:9;12078:18;12070:26;;12106:65;12168:1;12157:9;12153:17;12144:6;12106:65;:::i;:::-;11968:210;;;;:::o;12184:313::-;12297:4;12335:2;12324:9;12320:18;12312:26;;12384:9;12378:4;12374:20;12370:1;12359:9;12355:17;12348:47;12412:78;12485:4;12476:6;12412:78;:::i;:::-;12404:86;;12184:313;;;;:::o;12503:419::-;12669:4;12707:2;12696:9;12692:18;12684:26;;12756:9;12750:4;12746:20;12742:1;12731:9;12727:17;12720:47;12784:131;12910:4;12784:131;:::i;:::-;12776:139;;12503:419;;;:::o;12928:::-;13094:4;13132:2;13121:9;13117:18;13109:26;;13181:9;13175:4;13171:20;13167:1;13156:9;13152:17;13145:47;13209:131;13335:4;13209:131;:::i;:::-;13201:139;;12928:419;;;:::o;13353:222::-;13446:4;13484:2;13473:9;13469:18;13461:26;;13497:71;13565:1;13554:9;13550:17;13541:6;13497:71;:::i;:::-;13353:222;;;;:::o;13581:129::-;13615:6;13642:20;;:::i;:::-;13632:30;;13671:33;13699:4;13691:6;13671:33;:::i;:::-;13581:129;;;:::o;13716:75::-;13749:6;13782:2;13776:9;13766:19;;13716:75;:::o;13797:307::-;13858:4;13948:18;13940:6;13937:30;13934:56;;;13970:18;;:::i;:::-;13934:56;14008:29;14030:6;14008:29;:::i;:::-;14000:37;;14092:4;14086;14082:15;14074:23;;13797:307;;;:::o;14110:308::-;14172:4;14262:18;14254:6;14251:30;14248:56;;;14284:18;;:::i;:::-;14248:56;14322:29;14344:6;14322:29;:::i;:::-;14314:37;;14406:4;14400;14396:15;14388:23;;14110:308;;;:::o;14424:98::-;14475:6;14509:5;14503:12;14493:22;;14424:98;;;:::o;14528:99::-;14580:6;14614:5;14608:12;14598:22;;14528:99;;;:::o;14633:168::-;14716:11;14750:6;14745:3;14738:19;14790:4;14785:3;14781:14;14766:29;;14633:168;;;;:::o;14807:169::-;14891:11;14925:6;14920:3;14913:19;14965:4;14960:3;14956:14;14941:29;;14807:169;;;;:::o;14982:148::-;15084:11;15121:3;15106:18;;14982:148;;;;:::o;15136:96::-;15173:7;15202:24;15220:5;15202:24;:::i;:::-;15191:35;;15136:96;;;:::o;15238:90::-;15272:7;15315:5;15308:13;15301:21;15290:32;;15238:90;;;:::o;15334:149::-;15370:7;15410:66;15403:5;15399:78;15388:89;;15334:149;;;:::o;15489:126::-;15526:7;15566:42;15559:5;15555:54;15544:65;;15489:126;;;:::o;15621:77::-;15658:7;15687:5;15676:16;;15621:77;;;:::o;15704:154::-;15788:6;15783:3;15778;15765:30;15850:1;15841:6;15836:3;15832:16;15825:27;15704:154;;;:::o;15864:307::-;15932:1;15942:113;15956:6;15953:1;15950:13;15942:113;;;16041:1;16036:3;16032:11;16026:18;16022:1;16017:3;16013:11;16006:39;15978:2;15975:1;15971:10;15966:15;;15942:113;;;16073:6;16070:1;16067:13;16064:101;;;16153:1;16144:6;16139:3;16135:16;16128:27;16064:101;15913:258;15864:307;;;:::o;16177:320::-;16221:6;16258:1;16252:4;16248:12;16238:22;;16305:1;16299:4;16295:12;16326:18;16316:81;;16382:4;16374:6;16370:17;16360:27;;16316:81;16444:2;16436:6;16433:14;16413:18;16410:38;16407:84;;;16463:18;;:::i;:::-;16407:84;16228:269;16177:320;;;:::o;16503:281::-;16586:27;16608:4;16586:27;:::i;:::-;16578:6;16574:40;16716:6;16704:10;16701:22;16680:18;16668:10;16665:34;16662:62;16659:88;;;16727:18;;:::i;:::-;16659:88;16767:10;16763:2;16756:22;16546:238;16503:281;;:::o;16790:233::-;16829:3;16852:24;16870:5;16852:24;:::i;:::-;16843:33;;16898:66;16891:5;16888:77;16885:103;;;16968:18;;:::i;:::-;16885:103;17015:1;17008:5;17004:13;16997:20;;16790:233;;;:::o;17029:180::-;17077:77;17074:1;17067:88;17174:4;17171:1;17164:15;17198:4;17195:1;17188:15;17215:180;17263:77;17260:1;17253:88;17360:4;17357:1;17350:15;17384:4;17381:1;17374:15;17401:180;17449:77;17446:1;17439:88;17546:4;17543:1;17536:15;17570:4;17567:1;17560:15;17587:180;17635:77;17632:1;17625:88;17732:4;17729:1;17722:15;17756:4;17753:1;17746:15;17773:117;17882:1;17879;17872:12;17896:117;18005:1;18002;17995:12;18019:117;18128:1;18125;18118:12;18142:117;18251:1;18248;18241:12;18265:117;18374:1;18371;18364:12;18388:117;18497:1;18494;18487:12;18511:102;18552:6;18603:2;18599:7;18594:2;18587:5;18583:14;18579:28;18569:38;;18511:102;;;:::o;18619:225::-;18759:34;18755:1;18747:6;18743:14;18736:58;18828:8;18823:2;18815:6;18811:15;18804:33;18619:225;:::o;18850:182::-;18990:34;18986:1;18978:6;18974:14;18967:58;18850:182;:::o;19038:122::-;19111:24;19129:5;19111:24;:::i;:::-;19104:5;19101:35;19091:63;;19150:1;19147;19140:12;19091:63;19038:122;:::o;19166:116::-;19236:21;19251:5;19236:21;:::i;:::-;19229:5;19226:32;19216:60;;19272:1;19269;19262:12;19216:60;19166:116;:::o;19288:120::-;19360:23;19377:5;19360:23;:::i;:::-;19353:5;19350:34;19340:62;;19398:1;19395;19388:12;19340:62;19288:120;:::o;19414:122::-;19487:24;19505:5;19487:24;:::i;:::-;19480:5;19477:35;19467:63;;19526:1;19523;19516:12;19467:63;19414:122;:::o

Swarm Source

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