ETH Price: $2,966.24 (-0.80%)
Gas: 7 Gwei

CreationBabies (CREATIONBABIES)
 

Overview

TokenID

101

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
CreationBabies

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// File: IOperatorFilterRegistry.sol


pragma solidity ^0.8.7;

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

// File: OperatorFilterer.sol


pragma solidity ^0.8.7;


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

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

// File: DefaultOperatorFilterer.sol


pragma solidity ^0.8.7;


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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

        return (royalty.receiver, royaltyAmount);
    }

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

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

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// 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: contracts/CreationBabies.sol

//SPDX-License-Identifier: UNLICENSED 
pragma solidity ^0.8.7;  










contract CreationBabies is ERC721A, DefaultOperatorFilterer, Ownable, ReentrancyGuard, ERC2981 {  
    using Counters for Counters.Counter;

    address public pieContractAddress = 0xfb5aceff3117ac013a387D383fD1643D573bd5b4;
    address public cakeContractAddress = 0xd5027B602B50F18Ee2A5D95Dd141Ee7bDe5AA476;
    
    string public baseURI;

    mapping (address => bool) private gifters; 

    bytes32 public whitelistMerkleRoot;

    address public split;

    uint256 public mintStartTime;

    mapping (uint256 => uint256) public mintedAt;

    mapping (uint256 => uint256) public quantityToDiscountPct;
    mapping (uint256 => bool) public quantityHasDiscount;

    bool public mintPaused = true;
    bool public baseURILocked = false;

    uint256 private maxSupply = 111;

    uint96 private royaltyBps = 1000;

    uint256 private basePrice = 0.088 ether;
    uint256 private cakeBasePrice = 0.066 ether;
    uint256 private pieBasePrice = 0.055 ether;
    uint256 private cakeAndPieBasePrice = 0.044 ether;

    function updateRoyalty(uint96 _royaltyBps) public onlyOwner {
        require(split!=address(0), "split address not set, please set split address before updating royalty");
        royaltyBps = _royaltyBps;
        _setDefaultRoyalty(split, royaltyBps);
    }

    function getTokenInfo() public view returns (address[] memory, uint256[] memory) {
        address[] memory owners = new address[](totalSupply());
        uint256[] memory mintedAts = new uint256[](totalSupply());

        for (uint256 i = 0; i < totalSupply(); i++) {
            owners[i] = ownerOf(i);
            mintedAts[i] = mintedAt[i];
        }
        return (owners, mintedAts);
    }

    function updateMerkleRoot(bytes32 _whitelistMerkleRoot) public onlyOwner {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function updatePieContractAddress(address _address) public onlyOwner {
        pieContractAddress = _address;
    }

    function updateCakeContractAddress(address _address) public onlyOwner {
        cakeContractAddress = _address;
    }

    function updateBasePrice(uint256 _basePrice) public onlyOwner {
        basePrice = _basePrice;
    }

    function updateCakeBasePrice(uint256 _cakeBasePrice) public onlyOwner {
        cakeBasePrice = _cakeBasePrice;
    }

    function updatePieBasePrice(uint256 _pieBasePrice) public onlyOwner {
        pieBasePrice = _pieBasePrice;
    }

    function updateCakeAndPieBasePrice(uint256 _cakeAndPieBasePrice) public onlyOwner {
        cakeAndPieBasePrice = _cakeAndPieBasePrice;
    }

    function updateMintPaused(bool _mintPaused) public onlyOwner {
        mintPaused = _mintPaused;

        if(!mintPaused) {
            mintStartTime = block.timestamp;
        }
    }

    function updateBaseURI(string calldata givenBaseURI) public onlyOwner {
        require(!baseURILocked, "base uri locked");
        baseURI = givenBaseURI;
    }

    function tokenURI(uint256 tokenID) public view override returns (string memory) {
        require(_exists(tokenID), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(baseURI, Strings.toString(tokenID)));
    }

    function lockBaseURI() public onlyOwner {
        baseURILocked = true;
    }

    function updateGifters(address _address, bool canGift) public onlyOwner {
        gifters[_address] = canGift;
    }

    modifier onlyGifter() {
        require(gifters[msg.sender] == true, "only gifters can gift");
        _;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "the caller is another contract.");
        _;
    }

    function addQuantityDiscount(uint256 _quantity, uint256 _discountPct) public onlyOwner {
        quantityToDiscountPct[_quantity] = _discountPct;
        quantityHasDiscount[_quantity] = true;
    }

    function checkPieHolder(address user) public view returns (bool) {
        IERC721 pieContract = IERC721(pieContractAddress);
        bool hasPie = pieContract.balanceOf(user) > 0;
        return hasPie;
    }

    function checkCakeHolder(address user) public view returns (bool) {
        IERC721 cakeContract = IERC721(cakeContractAddress);
        bool hasCake = cakeContract.balanceOf(user) > 0;
        return hasCake;
    }
 
    constructor() ERC721A("CreationBabies", "CREATIONBABIES") {
        gifters[msg.sender] = true;

        mintStartTime = block.timestamp;

        addQuantityDiscount(5, 5);
        addQuantityDiscount(10, 10);
        addQuantityDiscount(15, 15);
    } 

    function checkPrice(uint256 quantity, address user, bool whitelisted) public view returns (uint256) {
        bool hasPie = checkPieHolder(user);
        bool hasCake = checkCakeHolder(user);

        uint256 price = basePrice;

        if(hasPie && (hasCake || whitelisted)) {
            price = cakeAndPieBasePrice;
        }

        else if(hasPie) {
            price = pieBasePrice;
        }

        else if(hasCake || whitelisted) {
            price = cakeBasePrice;
        }

        uint256 total = price * quantity;

        if(quantityHasDiscount[quantity]) {
            uint256 discountPct = quantityToDiscountPct[quantity];

            uint256 discountAmt = (basePrice * quantity) * (discountPct / 100);
            total = total - discountAmt;
        }

        return total;
    }

    function mintWhitelisted(uint256 quantity, bytes32[] calldata merkleProof) public payable nonReentrant callerIsUser {
        require(!mintPaused, "minting paused");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(merkleProof, whitelistMerkleRoot, leaf), "invalid proof");

        uint256 totalPrice = checkPrice(quantity, msg.sender, true);

        require(msg.value == totalPrice, "did not send correct amount of eth");
        require(totalSupply() + quantity <= maxSupply, "not enough supply");

        uint256 minTokenID = totalSupply();
        uint256 maxTokenID = totalSupply() + quantity - 1;

        _safeMint(msg.sender, quantity);

        for (uint256 id = minTokenID; id <= maxTokenID; id++) {
            mintedAt[id] = block.timestamp;
        }
    }

    function mint(uint256 quantity) public payable nonReentrant callerIsUser {
        require(!mintPaused, "minting paused");

        uint256 totalPrice = checkPrice(quantity, msg.sender, false);

        require(msg.value == totalPrice, "did not send correct amount of eth");

        require(totalSupply() + quantity <= maxSupply, "not enough supply");

        uint256 minTokenID = totalSupply();
        uint256 maxTokenID = totalSupply() + quantity - 1;

        _safeMint(msg.sender, quantity);

        for (uint256 id = minTokenID; id <= maxTokenID; id++) {
            mintedAt[id] = block.timestamp;
        }
    }

    function gift(uint256 quantity, address to) public onlyGifter {
        require(totalSupply() + quantity <= maxSupply, "not enough supply");

        uint256 minTokenID = totalSupply();
        uint256 maxTokenID = totalSupply() + quantity - 1;

        _safeMint(to, quantity);

        for (uint256 id = minTokenID; id <= maxTokenID; id++) {
            mintedAt[id] = block.timestamp;
        }
    }

    function setSplitAddress(address _address) public onlyOwner {
        split = _address;
        _setDefaultRoyalty(split, royaltyBps);
    }

    function withdraw() public onlyOwner {
        require(split != address(0), "split address not set");

        (bool success, ) = split.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    // Opensea Operator filter registry
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

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

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

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

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

    function supportsInterface(
    bytes4 interfaceId
    ) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return 
            ERC721A.supportsInterface(interfaceId) || 
            ERC2981.supportsInterface(interfaceId);
    }
}

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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_discountPct","type":"uint256"}],"name":"addQuantityDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cakeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkCakeHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkPieHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"checkPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenInfo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWhitelisted","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pieContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quantityHasDiscount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quantityToDiscountPct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"address","name":"_address","type":"address"}],"name":"setSplitAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"split","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"updateBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"givenBaseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cakeAndPieBasePrice","type":"uint256"}],"name":"updateCakeAndPieBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cakeBasePrice","type":"uint256"}],"name":"updateCakeBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateCakeContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"canGift","type":"bool"}],"name":"updateGifters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintPaused","type":"bool"}],"name":"updateMintPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pieBasePrice","type":"uint256"}],"name":"updatePieBasePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updatePieContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_royaltyBps","type":"uint96"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600c80546001600160a01b031990811673fb5aceff3117ac013a387d383fd1643d573bd5b417909155600d805490911673d5027b602b50f18ee2a5d95dd141ee7bde5aa4761790556016805461ffff19166001179055606f601755601880546001600160601b0319166103e8179055670138a388a43c000060195566ea7aa67b2d0000601a5566c3663566a58000601b55669c51c4521e0000601c55348015620000ad57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020016d4372656174696f6e42616269657360901b8152506040518060400160405280600e81526020016d4352454154494f4e42414249455360901b81525081600290816200012491906200045d565b5060036200013382826200045d565b506000805550506daaeb6d7670e522a718067333cd4e3b156200027f578015620001cd57604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620001ae57600080fd5b505af1158015620001c3573d6000803e3d6000fd5b505050506200027f565b6001600160a01b038216156200021e5760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af29039060440162000193565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200026557600080fd5b505af11580156200027a573d6000803e3d6000fd5b505050505b506200028d905033620002df565b60016009819055336000908152600f60205260409020805460ff1916909117905542601255620002bf60058062000331565b620002cc600a8062000331565b620002d9600f8062000331565b62000529565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620003905760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003e357607f821691505b6020821081036200040457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045857600081815260208120601f850160051c81016020861015620004335750805b601f850160051c820191505b8181101562000454578281556001016200043f565b5050505b505050565b81516001600160401b03811115620004795762000479620003b8565b62000491816200048a8454620003ce565b846200040a565b602080601f831160018114620004c95760008415620004b05750858301515b600019600386901b1c1916600185901b17855562000454565b600085815260208120601f198616915b82811015620004fa57888601518255948401946001909101908401620004d9565b5085821015620005195787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612f0880620005396000396000f3fe6080604052600436106102ff5760003560e01c80638da5cb5b11610190578063b9e35574116100dc578063e775920c11610095578063f1b0aa151161006f578063f1b0aa15146108d7578063f2fde38b14610904578063f765417614610924578063fd5baa881461094457600080fd5b8063e775920c14610877578063e985e9c514610897578063f0ee9b9e146108b757600080fd5b8063b9e35574146107b4578063bb30ac49146107c7578063c4c6be75146107e7578063c7d0db0414610817578063c87b56dd14610837578063e5ad0b2b1461085757600080fd5b8063a44acf1e11610149578063aa98e0c611610123578063aa98e0c614610748578063aab4ece51461075e578063abb1dc441461077e578063b88d4fde146107a157600080fd5b8063a44acf1e146106db578063a79c00e314610708578063a91657b71461072857600080fd5b80638da5cb5b1461063f578063931688cb1461065d578063931e2e491461067d57806395d89b4114610693578063a0712d68146106a8578063a22cb465146106bb57600080fd5b806353df5c7c1161024f57806370a08231116102085780637e4831d3116101e25780637e4831d3146105c557806383a076be146105df578063847e3d0d146105ff578063856e05041461061f57600080fd5b806370a0823114610570578063715018a6146105905780637a7aa287146105a557600080fd5b806353df5c7c146104c75780635d148e5c146104dc5780636352211e146104fb57806364c1caf81461051b57806369b2f16e1461053b5780636c0360eb1461055b57600080fd5b806323b872dd116102bc57806341f434341161029657806341f434341461045257806342842e0e146104745780634783f0ef146104875780635273ca15146104a757600080fd5b806323b872dd146103eb5780632a55205a146103fe5780633ccfd60b1461043d57600080fd5b806301ffc9a71461030457806302acd0881461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806318160ddd146103c8575b600080fd5b34801561031057600080fd5b5061032461031f366004612639565b610964565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612680565b610984565b005b34801561036757600080fd5b506103706109e2565b6040516103309190612707565b34801561038957600080fd5b5061039d61039836600461271a565b610a74565b6040516001600160a01b039091168152602001610330565b6103596103c3366004612733565b610ab8565b3480156103d457600080fd5b50600154600054035b604051908152602001610330565b6103596103f936600461275d565b610ad1565b34801561040a57600080fd5b5061041e610419366004612799565b610afc565b604080516001600160a01b039093168352602083019190915201610330565b34801561044957600080fd5b50610359610ba8565b34801561045e57600080fd5b5061039d6daaeb6d7670e522a718067333cd4e81565b61035961048236600461275d565b610cbb565b34801561049357600080fd5b506103596104a236600461271a565b610ce0565b3480156104b357600080fd5b506103246104c23660046127bb565b610d0f565b3480156104d357600080fd5b50610359610d8e565b3480156104e857600080fd5b5060165461032490610100900460ff1681565b34801561050757600080fd5b5061039d61051636600461271a565b610dc9565b34801561052757600080fd5b50600c5461039d906001600160a01b031681565b34801561054757600080fd5b50600d5461039d906001600160a01b031681565b34801561056757600080fd5b50610370610dd4565b34801561057c57600080fd5b506103dd61058b3660046127bb565b610e62565b34801561059c57600080fd5b50610359610eb1565b3480156105b157600080fd5b506103596105c036600461271a565b610ee7565b3480156105d157600080fd5b506016546103249060ff1681565b3480156105eb57600080fd5b506103596105fa3660046127d6565b610f16565b34801561060b57600080fd5b5061032461061a3660046127bb565b611021565b34801561062b57600080fd5b5061035961063a3660046127bb565b61105a565b34801561064b57600080fd5b506008546001600160a01b031661039d565b34801561066957600080fd5b50610359610678366004612802565b6110b8565b34801561068957600080fd5b506103dd60125481565b34801561069f57600080fd5b50610370611139565b6103596106b636600461271a565b611148565b3480156106c757600080fd5b506103596106d6366004612680565b611315565b3480156106e757600080fd5b506103dd6106f636600461271a565b60146020526000908152604090205481565b34801561071457600080fd5b506103596107233660046127bb565b611329565b34801561073457600080fd5b5061035961074336600461271a565b611375565b34801561075457600080fd5b506103dd60105481565b34801561076a57600080fd5b5061035961077936600461271a565b6113a4565b34801561078a57600080fd5b506107936113d3565b604051610330929190612874565b6103596107af36600461290e565b611509565b6103596107c23660046129ea565b61152f565b3480156107d357600080fd5b506103596107e2366004612799565b6117b5565b3480156107f357600080fd5b5061032461080236600461271a565b60156020526000908152604090205460ff1681565b34801561082357600080fd5b50610359610832366004612a69565b611807565b34801561084357600080fd5b5061037061085236600461271a565b611850565b34801561086357600080fd5b50610359610872366004612a86565b6118f1565b34801561088357600080fd5b506103596108923660046127bb565b6119e4565b3480156108a357600080fd5b506103246108b2366004612aaf565b611a30565b3480156108c357600080fd5b506103dd6108d2366004612ad9565b611a5e565b3480156108e357600080fd5b506103dd6108f236600461271a565b60136020526000908152604090205481565b34801561091057600080fd5b5061035961091f3660046127bb565b611b33565b34801561093057600080fd5b5060115461039d906001600160a01b031681565b34801561095057600080fd5b5061035961095f36600461271a565b611bcb565b600061096f82611bfa565b8061097e575061097e82611c48565b92915050565b6008546001600160a01b031633146109b75760405162461bcd60e51b81526004016109ae90612b19565b60405180910390fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600280546109f190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90612b4e565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b6000610a7f82611c7d565b610a9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610ac281611ca4565b610acc8383611d5d565b505050565b826001600160a01b0381163314610aeb57610aeb33611ca4565b610af6848484611dfd565b50505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b71575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b90906001600160601b031687612b9e565b610b9a9190612bcb565b915196919550909350505050565b6008546001600160a01b03163314610bd25760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b0316610c225760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081859191c995cdcc81b9bdd081cd95d605a1b60448201526064016109ae565b6011546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c6f576040519150601f19603f3d011682016040523d82523d6000602084013e610c74565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109ae565b50565b826001600160a01b0381163314610cd557610cd533611ca4565b610af6848484611f96565b6008546001600160a01b03163314610d0a5760405162461bcd60e51b81526004016109ae90612b19565b601055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a08231906024015b602060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d859190612bdf565b11949350505050565b6008546001600160a01b03163314610db85760405162461bcd60e51b81526004016109ae90612b19565b6016805461ff001916610100179055565b600061097e82611fb1565b600e8054610de190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d90612b4e565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b60006001600160a01b038216610e8b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610edb5760405162461bcd60e51b81526004016109ae90612b19565b610ee5600061201f565b565b6008546001600160a01b03163314610f115760405162461bcd60e51b81526004016109ae90612b19565b601a55565b336000908152600f602052604090205460ff161515600114610f725760405162461bcd60e51b81526020600482015260156024820152741bdb9b1e4819da599d195c9cc818d85b8819da599d605a1b60448201526064016109ae565b60175482610f836001546000540390565b610f8d9190612bf8565b1115610fab5760405162461bcd60e51b81526004016109ae90612c0b565b6000610fba6001546000540390565b90506000600184610fce6001546000540390565b610fd89190612bf8565b610fe29190612c36565b9050610fee8385612071565b815b81811161101a5760008181526013602052604090204290558061101281612c49565b915050610ff0565b5050505050565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a0823190602401610d44565b6008546001600160a01b031633146110845760405162461bcd60e51b81526004016109ae90612b19565b601180546001600160a01b0319166001600160a01b038316908117909155601854610cb891906001600160601b031661208f565b6008546001600160a01b031633146110e25760405162461bcd60e51b81526004016109ae90612b19565b601654610100900460ff161561112c5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9481d5c9a481b1bd8dad959608a1b60448201526064016109ae565b600e610acc828483612ca8565b6060600380546109f190612b4e565b60026009540361119a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146111ee5760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156112325760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b600061124082336000611a5e565b90508034146112615760405162461bcd60e51b81526004016109ae90612d68565b601754826112726001546000540390565b61127c9190612bf8565b111561129a5760405162461bcd60e51b81526004016109ae90612c0b565b60006112a96001546000540390565b905060006001846112bd6001546000540390565b6112c79190612bf8565b6112d19190612c36565b90506112dd3385612071565b815b8181116113095760008181526013602052604090204290558061130181612c49565b9150506112df565b50506001600955505050565b8161131f81611ca4565b610acc838361218c565b6008546001600160a01b031633146113535760405162461bcd60e51b81526004016109ae90612b19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109ae90612b19565b601c55565b6008546001600160a01b031633146113ce5760405162461bcd60e51b81526004016109ae90612b19565b601b55565b60608060006113e56001546000540390565b67ffffffffffffffff8111156113fd576113fd6128f8565b604051908082528060200260200182016040528015611426578160200160208202803683370190505b50905060006114386001546000540390565b67ffffffffffffffff811115611450576114506128f8565b604051908082528060200260200182016040528015611479578160200160208202803683370190505b50905060005b600154600054038110156114ff5761149681610dc9565b8382815181106114a8576114a8612daa565b6001600160a01b0390921660209283029190910182015260008281526013909152604090205482518390839081106114e2576114e2612daa565b6020908102919091010152806114f781612c49565b91505061147f565b5090939092509050565b836001600160a01b03811633146115235761152333611ca4565b61101a858585856121f8565b6002600954036115815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146115d55760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156116195760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061169383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061223c565b6116cf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016109ae565b60006116dd85336001611a5e565b90508034146116fe5760405162461bcd60e51b81526004016109ae90612d68565b6017548561170f6001546000540390565b6117199190612bf8565b11156117375760405162461bcd60e51b81526004016109ae90612c0b565b60006117466001546000540390565b9050600060018761175a6001546000540390565b6117649190612bf8565b61176e9190612c36565b905061177a3388612071565b815b8181116117a65760008181526013602052604090204290558061179e81612c49565b91505061177c565b50506001600955505050505050565b6008546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ae90612b19565b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b6008546001600160a01b031633146118315760405162461bcd60e51b81526004016109ae90612b19565b6016805460ff191682151590811790915560ff16610cb8574260125550565b606061185b82611c7d565b6118bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ae565b600e6118ca83612252565b6040516020016118db929190612dc0565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461191b5760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b03166119a95760405162461bcd60e51b815260206004820152604760248201527f73706c69742061646472657373206e6f74207365742c20706c6561736520736560448201527f742073706c69742061646472657373206265666f7265207570646174696e6720606482015266726f79616c747960c81b608482015260a4016109ae565b601880546bffffffffffffffffffffffff19166001600160601b038316908117909155601154610cb8916001600160a01b039091169061208f565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109ae90612b19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600080611a6a84611021565b90506000611a7785610d0f565b601954909150828015611a8e57508180611a8e5750845b15611a9c5750601c54611abe565b8215611aab5750601b54611abe565b8180611ab45750845b15611abe5750601a545b6000611aca8883612b9e565b60008981526015602052604090205490915060ff1615611b285760008881526014602052604081205490611aff606483612bcb565b8a601954611b0d9190612b9e565b611b179190612b9e565b9050611b238184612c36565b925050505b979650505050505050565b6008546001600160a01b03163314611b5d5760405162461bcd60e51b81526004016109ae90612b19565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ae565b610cb88161201f565b6008546001600160a01b03163314611bf55760405162461bcd60e51b81526004016109ae90612b19565b601955565b60006301ffc9a760e01b6001600160e01b031983161480611c2b57506380ac58cd60e01b6001600160e01b03198316145b8061097e5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061097e57506301ffc9a760e01b6001600160e01b031983161461097e565b600080548210801561097e575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15610cb857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190612e47565b610cb857604051633b79c77360e21b81526001600160a01b03821660048201526024016109ae565b6000611d6882610dc9565b9050336001600160a01b03821614611da157611d848133611a30565b611da1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e0882611fb1565b9050836001600160a01b0316816001600160a01b031614611e3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611e8857611e6b8633611a30565b611e8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611eaf57604051633a954ecd60e21b815260040160405180910390fd5b8015611eba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611f4c57600184016000818152600460205260408120549003611f4a576000548114611f4a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610acc83838360405180602001604052806000815250611509565b6000816000548110156120065760008181526004602052604081205490600160e01b82169003612004575b80600003611ffd575060001901600081815260046020526040902054611fdc565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61208b82826040518060200160405280600081525061235b565b5050565b6127106001600160601b03821611156120fd5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109ae565b6001600160a01b0382166121535760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109ae565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612203848484610ad1565b6001600160a01b0383163b15610af65761221f848484846123c1565b610af6576040516368d2bf6b60e11b815260040160405180910390fd5b60008261224985846124ac565b14949350505050565b6060816000036122795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122a3578061228d81612c49565b915061229c9050600a83612bcb565b915061227d565b60008167ffffffffffffffff8111156122be576122be6128f8565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090505b8415612353576122fd600183612c36565b915061230a600a86612e64565b612315906030612bf8565b60f81b81838151811061232a5761232a612daa565b60200101906001600160f81b031916908160001a90535061234c600a86612bcb565b94506122ec565b949350505050565b61236583836124f9565b6001600160a01b0383163b15610acc576000548281035b61238f60008683806001019450866123c1565b6123ac576040516368d2bf6b60e11b815260040160405180910390fd5b81811061237c57816000541461101a57600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123f6903390899088908890600401612e78565b6020604051808303816000875af1925050508015612431575060408051601f3d908101601f1916820190925261242e91810190612eb5565b60015b61248f573d80801561245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b508051600003612487576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081815b84518110156124f1576124dd828683815181106124d0576124d0612daa565b60200260200101516125f7565b9150806124e981612c49565b9150506124b1565b509392505050565b600080549082900361251e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146125cd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612595565b50816000036125ee57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000818310612613576000828152602084905260409020611ffd565b5060009182526020526040902090565b6001600160e01b031981168114610cb857600080fd5b60006020828403121561264b57600080fd5b8135611ffd81612623565b80356001600160a01b038116811461266d57600080fd5b919050565b8015158114610cb857600080fd5b6000806040838503121561269357600080fd5b61269c83612656565b915060208301356126ac81612672565b809150509250929050565b60005b838110156126d25781810151838201526020016126ba565b50506000910152565b600081518084526126f38160208601602086016126b7565b601f01601f19169290920160200192915050565b602081526000611ffd60208301846126db565b60006020828403121561272c57600080fd5b5035919050565b6000806040838503121561274657600080fd5b61274f83612656565b946020939093013593505050565b60008060006060848603121561277257600080fd5b61277b84612656565b925061278960208501612656565b9150604084013590509250925092565b600080604083850312156127ac57600080fd5b50508035926020909101359150565b6000602082840312156127cd57600080fd5b611ffd82612656565b600080604083850312156127e957600080fd5b823591506127f960208401612656565b90509250929050565b6000806020838503121561281557600080fd5b823567ffffffffffffffff8082111561282d57600080fd5b818501915085601f83011261284157600080fd5b81358181111561285057600080fd5b86602082850101111561286257600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b828110156128b65781516001600160a01b031684529284019290840190600101612891565b5050508381038285015284518082528583019183019060005b818110156128eb578351835292840192918401916001016128cf565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561292457600080fd5b61292d85612656565b935061293b60208601612656565b925060408501359150606085013567ffffffffffffffff8082111561295f57600080fd5b818701915087601f83011261297357600080fd5b813581811115612985576129856128f8565b604051601f8201601f19908116603f011681019083821181831017156129ad576129ad6128f8565b816040528281528a60208487010111156129c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156129ff57600080fd5b83359250602084013567ffffffffffffffff80821115612a1e57600080fd5b818601915086601f830112612a3257600080fd5b813581811115612a4157600080fd5b8760208260051b8501011115612a5657600080fd5b6020830194508093505050509250925092565b600060208284031215612a7b57600080fd5b8135611ffd81612672565b600060208284031215612a9857600080fd5b81356001600160601b0381168114611ffd57600080fd5b60008060408385031215612ac257600080fd5b612acb83612656565b91506127f960208401612656565b600080600060608486031215612aee57600080fd5b83359250612afe60208501612656565b91506040840135612b0e81612672565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6257607f821691505b602082108103612b8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097e5761097e612b88565b634e487b7160e01b600052601260045260246000fd5b600082612bda57612bda612bb5565b500490565b600060208284031215612bf157600080fd5b5051919050565b8082018082111561097e5761097e612b88565b6020808252601190820152706e6f7420656e6f75676820737570706c7960781b604082015260600190565b8181038181111561097e5761097e612b88565b600060018201612c5b57612c5b612b88565b5060010190565b601f821115610acc57600081815260208120601f850160051c81016020861015612c895750805b601f850160051c820191505b81811015611f8e57828155600101612c95565b67ffffffffffffffff831115612cc057612cc06128f8565b612cd483612cce8354612b4e565b83612c62565b6000601f841160018114612d085760008515612cf05750838201355b600019600387901b1c1916600186901b17835561101a565b600083815260209020601f19861690835b82811015612d395786850135825560209485019460019092019101612d19565b5086821015612d565760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526022908201527f646964206e6f742073656e6420636f727265637420616d6f756e74206f6620656040820152610e8d60f31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000808454612dce81612b4e565b60018281168015612de65760018114612dfb57612e2a565b60ff1984168752821515830287019450612e2a565b8860005260208060002060005b85811015612e215781548a820152908401908201612e08565b50505082870194505b505050508351612e3e8183602088016126b7565b01949350505050565b600060208284031215612e5957600080fd5b8151611ffd81612672565b600082612e7357612e73612bb5565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eab908301846126db565b9695505050505050565b600060208284031215612ec757600080fd5b8151611ffd8161262356fea264697066735822122025e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e064736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80638da5cb5b11610190578063b9e35574116100dc578063e775920c11610095578063f1b0aa151161006f578063f1b0aa15146108d7578063f2fde38b14610904578063f765417614610924578063fd5baa881461094457600080fd5b8063e775920c14610877578063e985e9c514610897578063f0ee9b9e146108b757600080fd5b8063b9e35574146107b4578063bb30ac49146107c7578063c4c6be75146107e7578063c7d0db0414610817578063c87b56dd14610837578063e5ad0b2b1461085757600080fd5b8063a44acf1e11610149578063aa98e0c611610123578063aa98e0c614610748578063aab4ece51461075e578063abb1dc441461077e578063b88d4fde146107a157600080fd5b8063a44acf1e146106db578063a79c00e314610708578063a91657b71461072857600080fd5b80638da5cb5b1461063f578063931688cb1461065d578063931e2e491461067d57806395d89b4114610693578063a0712d68146106a8578063a22cb465146106bb57600080fd5b806353df5c7c1161024f57806370a08231116102085780637e4831d3116101e25780637e4831d3146105c557806383a076be146105df578063847e3d0d146105ff578063856e05041461061f57600080fd5b806370a0823114610570578063715018a6146105905780637a7aa287146105a557600080fd5b806353df5c7c146104c75780635d148e5c146104dc5780636352211e146104fb57806364c1caf81461051b57806369b2f16e1461053b5780636c0360eb1461055b57600080fd5b806323b872dd116102bc57806341f434341161029657806341f434341461045257806342842e0e146104745780634783f0ef146104875780635273ca15146104a757600080fd5b806323b872dd146103eb5780632a55205a146103fe5780633ccfd60b1461043d57600080fd5b806301ffc9a71461030457806302acd0881461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b557806318160ddd146103c8575b600080fd5b34801561031057600080fd5b5061032461031f366004612639565b610964565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612680565b610984565b005b34801561036757600080fd5b506103706109e2565b6040516103309190612707565b34801561038957600080fd5b5061039d61039836600461271a565b610a74565b6040516001600160a01b039091168152602001610330565b6103596103c3366004612733565b610ab8565b3480156103d457600080fd5b50600154600054035b604051908152602001610330565b6103596103f936600461275d565b610ad1565b34801561040a57600080fd5b5061041e610419366004612799565b610afc565b604080516001600160a01b039093168352602083019190915201610330565b34801561044957600080fd5b50610359610ba8565b34801561045e57600080fd5b5061039d6daaeb6d7670e522a718067333cd4e81565b61035961048236600461275d565b610cbb565b34801561049357600080fd5b506103596104a236600461271a565b610ce0565b3480156104b357600080fd5b506103246104c23660046127bb565b610d0f565b3480156104d357600080fd5b50610359610d8e565b3480156104e857600080fd5b5060165461032490610100900460ff1681565b34801561050757600080fd5b5061039d61051636600461271a565b610dc9565b34801561052757600080fd5b50600c5461039d906001600160a01b031681565b34801561054757600080fd5b50600d5461039d906001600160a01b031681565b34801561056757600080fd5b50610370610dd4565b34801561057c57600080fd5b506103dd61058b3660046127bb565b610e62565b34801561059c57600080fd5b50610359610eb1565b3480156105b157600080fd5b506103596105c036600461271a565b610ee7565b3480156105d157600080fd5b506016546103249060ff1681565b3480156105eb57600080fd5b506103596105fa3660046127d6565b610f16565b34801561060b57600080fd5b5061032461061a3660046127bb565b611021565b34801561062b57600080fd5b5061035961063a3660046127bb565b61105a565b34801561064b57600080fd5b506008546001600160a01b031661039d565b34801561066957600080fd5b50610359610678366004612802565b6110b8565b34801561068957600080fd5b506103dd60125481565b34801561069f57600080fd5b50610370611139565b6103596106b636600461271a565b611148565b3480156106c757600080fd5b506103596106d6366004612680565b611315565b3480156106e757600080fd5b506103dd6106f636600461271a565b60146020526000908152604090205481565b34801561071457600080fd5b506103596107233660046127bb565b611329565b34801561073457600080fd5b5061035961074336600461271a565b611375565b34801561075457600080fd5b506103dd60105481565b34801561076a57600080fd5b5061035961077936600461271a565b6113a4565b34801561078a57600080fd5b506107936113d3565b604051610330929190612874565b6103596107af36600461290e565b611509565b6103596107c23660046129ea565b61152f565b3480156107d357600080fd5b506103596107e2366004612799565b6117b5565b3480156107f357600080fd5b5061032461080236600461271a565b60156020526000908152604090205460ff1681565b34801561082357600080fd5b50610359610832366004612a69565b611807565b34801561084357600080fd5b5061037061085236600461271a565b611850565b34801561086357600080fd5b50610359610872366004612a86565b6118f1565b34801561088357600080fd5b506103596108923660046127bb565b6119e4565b3480156108a357600080fd5b506103246108b2366004612aaf565b611a30565b3480156108c357600080fd5b506103dd6108d2366004612ad9565b611a5e565b3480156108e357600080fd5b506103dd6108f236600461271a565b60136020526000908152604090205481565b34801561091057600080fd5b5061035961091f3660046127bb565b611b33565b34801561093057600080fd5b5060115461039d906001600160a01b031681565b34801561095057600080fd5b5061035961095f36600461271a565b611bcb565b600061096f82611bfa565b8061097e575061097e82611c48565b92915050565b6008546001600160a01b031633146109b75760405162461bcd60e51b81526004016109ae90612b19565b60405180910390fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6060600280546109f190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1d90612b4e565b8015610a6a5780601f10610a3f57610100808354040283529160200191610a6a565b820191906000526020600020905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b6000610a7f82611c7d565b610a9c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610ac281611ca4565b610acc8383611d5d565b505050565b826001600160a01b0381163314610aeb57610aeb33611ca4565b610af6848484611dfd565b50505050565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b71575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b90906001600160601b031687612b9e565b610b9a9190612bcb565b915196919550909350505050565b6008546001600160a01b03163314610bd25760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b0316610c225760405162461bcd60e51b81526020600482015260156024820152741cdc1b1a5d081859191c995cdcc81b9bdd081cd95d605a1b60448201526064016109ae565b6011546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c6f576040519150601f19603f3d011682016040523d82523d6000602084013e610c74565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109ae565b50565b826001600160a01b0381163314610cd557610cd533611ca4565b610af6848484611f96565b6008546001600160a01b03163314610d0a5760405162461bcd60e51b81526004016109ae90612b19565b601055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a08231906024015b602060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d859190612bdf565b11949350505050565b6008546001600160a01b03163314610db85760405162461bcd60e51b81526004016109ae90612b19565b6016805461ff001916610100179055565b600061097e82611fb1565b600e8054610de190612b4e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d90612b4e565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b60006001600160a01b038216610e8b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610edb5760405162461bcd60e51b81526004016109ae90612b19565b610ee5600061201f565b565b6008546001600160a01b03163314610f115760405162461bcd60e51b81526004016109ae90612b19565b601a55565b336000908152600f602052604090205460ff161515600114610f725760405162461bcd60e51b81526020600482015260156024820152741bdb9b1e4819da599d195c9cc818d85b8819da599d605a1b60448201526064016109ae565b60175482610f836001546000540390565b610f8d9190612bf8565b1115610fab5760405162461bcd60e51b81526004016109ae90612c0b565b6000610fba6001546000540390565b90506000600184610fce6001546000540390565b610fd89190612bf8565b610fe29190612c36565b9050610fee8385612071565b815b81811161101a5760008181526013602052604090204290558061101281612c49565b915050610ff0565b5050505050565b600c546040516370a0823160e01b81526001600160a01b03838116600483015260009216908290819083906370a0823190602401610d44565b6008546001600160a01b031633146110845760405162461bcd60e51b81526004016109ae90612b19565b601180546001600160a01b0319166001600160a01b038316908117909155601854610cb891906001600160601b031661208f565b6008546001600160a01b031633146110e25760405162461bcd60e51b81526004016109ae90612b19565b601654610100900460ff161561112c5760405162461bcd60e51b815260206004820152600f60248201526e18985cd9481d5c9a481b1bd8dad959608a1b60448201526064016109ae565b600e610acc828483612ca8565b6060600380546109f190612b4e565b60026009540361119a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146111ee5760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156112325760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b600061124082336000611a5e565b90508034146112615760405162461bcd60e51b81526004016109ae90612d68565b601754826112726001546000540390565b61127c9190612bf8565b111561129a5760405162461bcd60e51b81526004016109ae90612c0b565b60006112a96001546000540390565b905060006001846112bd6001546000540390565b6112c79190612bf8565b6112d19190612c36565b90506112dd3385612071565b815b8181116113095760008181526013602052604090204290558061130181612c49565b9150506112df565b50506001600955505050565b8161131f81611ca4565b610acc838361218c565b6008546001600160a01b031633146113535760405162461bcd60e51b81526004016109ae90612b19565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546001600160a01b0316331461139f5760405162461bcd60e51b81526004016109ae90612b19565b601c55565b6008546001600160a01b031633146113ce5760405162461bcd60e51b81526004016109ae90612b19565b601b55565b60608060006113e56001546000540390565b67ffffffffffffffff8111156113fd576113fd6128f8565b604051908082528060200260200182016040528015611426578160200160208202803683370190505b50905060006114386001546000540390565b67ffffffffffffffff811115611450576114506128f8565b604051908082528060200260200182016040528015611479578160200160208202803683370190505b50905060005b600154600054038110156114ff5761149681610dc9565b8382815181106114a8576114a8612daa565b6001600160a01b0390921660209283029190910182015260008281526013909152604090205482518390839081106114e2576114e2612daa565b6020908102919091010152806114f781612c49565b91505061147f565b5090939092509050565b836001600160a01b03811633146115235761152333611ca4565b61101a858585856121f8565b6002600954036115815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ae565b60026009553233146115d55760405162461bcd60e51b815260206004820152601f60248201527f7468652063616c6c657220697320616e6f7468657220636f6e74726163742e0060448201526064016109ae565b60165460ff16156116195760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d1a5b99c81c185d5cd95960921b60448201526064016109ae565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061169383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061223c565b6116cf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016109ae565b60006116dd85336001611a5e565b90508034146116fe5760405162461bcd60e51b81526004016109ae90612d68565b6017548561170f6001546000540390565b6117199190612bf8565b11156117375760405162461bcd60e51b81526004016109ae90612c0b565b60006117466001546000540390565b9050600060018761175a6001546000540390565b6117649190612bf8565b61176e9190612c36565b905061177a3388612071565b815b8181116117a65760008181526013602052604090204290558061179e81612c49565b91505061177c565b50506001600955505050505050565b6008546001600160a01b031633146117df5760405162461bcd60e51b81526004016109ae90612b19565b600091825260146020908152604080842092909255601590529020805460ff19166001179055565b6008546001600160a01b031633146118315760405162461bcd60e51b81526004016109ae90612b19565b6016805460ff191682151590811790915560ff16610cb8574260125550565b606061185b82611c7d565b6118bf5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ae565b600e6118ca83612252565b6040516020016118db929190612dc0565b6040516020818303038152906040529050919050565b6008546001600160a01b0316331461191b5760405162461bcd60e51b81526004016109ae90612b19565b6011546001600160a01b03166119a95760405162461bcd60e51b815260206004820152604760248201527f73706c69742061646472657373206e6f74207365742c20706c6561736520736560448201527f742073706c69742061646472657373206265666f7265207570646174696e6720606482015266726f79616c747960c81b608482015260a4016109ae565b601880546bffffffffffffffffffffffff19166001600160601b038316908117909155601154610cb8916001600160a01b039091169061208f565b6008546001600160a01b03163314611a0e5760405162461bcd60e51b81526004016109ae90612b19565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b600080611a6a84611021565b90506000611a7785610d0f565b601954909150828015611a8e57508180611a8e5750845b15611a9c5750601c54611abe565b8215611aab5750601b54611abe565b8180611ab45750845b15611abe5750601a545b6000611aca8883612b9e565b60008981526015602052604090205490915060ff1615611b285760008881526014602052604081205490611aff606483612bcb565b8a601954611b0d9190612b9e565b611b179190612b9e565b9050611b238184612c36565b925050505b979650505050505050565b6008546001600160a01b03163314611b5d5760405162461bcd60e51b81526004016109ae90612b19565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ae565b610cb88161201f565b6008546001600160a01b03163314611bf55760405162461bcd60e51b81526004016109ae90612b19565b601955565b60006301ffc9a760e01b6001600160e01b031983161480611c2b57506380ac58cd60e01b6001600160e01b03198316145b8061097e5750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061097e57506301ffc9a760e01b6001600160e01b031983161461097e565b600080548210801561097e575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15610cb857604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611d11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d359190612e47565b610cb857604051633b79c77360e21b81526001600160a01b03821660048201526024016109ae565b6000611d6882610dc9565b9050336001600160a01b03821614611da157611d848133611a30565b611da1576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e0882611fb1565b9050836001600160a01b0316816001600160a01b031614611e3b5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417611e8857611e6b8633611a30565b611e8857604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516611eaf57604051633a954ecd60e21b815260040160405180910390fd5b8015611eba57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003611f4c57600184016000818152600460205260408120549003611f4a576000548114611f4a5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b610acc83838360405180602001604052806000815250611509565b6000816000548110156120065760008181526004602052604081205490600160e01b82169003612004575b80600003611ffd575060001901600081815260046020526040902054611fdc565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61208b82826040518060200160405280600081525061235b565b5050565b6127106001600160601b03821611156120fd5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109ae565b6001600160a01b0382166121535760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109ae565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612203848484610ad1565b6001600160a01b0383163b15610af65761221f848484846123c1565b610af6576040516368d2bf6b60e11b815260040160405180910390fd5b60008261224985846124ac565b14949350505050565b6060816000036122795750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122a3578061228d81612c49565b915061229c9050600a83612bcb565b915061227d565b60008167ffffffffffffffff8111156122be576122be6128f8565b6040519080825280601f01601f1916602001820160405280156122e8576020820181803683370190505b5090505b8415612353576122fd600183612c36565b915061230a600a86612e64565b612315906030612bf8565b60f81b81838151811061232a5761232a612daa565b60200101906001600160f81b031916908160001a90535061234c600a86612bcb565b94506122ec565b949350505050565b61236583836124f9565b6001600160a01b0383163b15610acc576000548281035b61238f60008683806001019450866123c1565b6123ac576040516368d2bf6b60e11b815260040160405180910390fd5b81811061237c57816000541461101a57600080fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906123f6903390899088908890600401612e78565b6020604051808303816000875af1925050508015612431575060408051601f3d908101601f1916820190925261242e91810190612eb5565b60015b61248f573d80801561245f576040519150601f19603f3d011682016040523d82523d6000602084013e612464565b606091505b508051600003612487576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b600081815b84518110156124f1576124dd828683815181106124d0576124d0612daa565b60200260200101516125f7565b9150806124e981612c49565b9150506124b1565b509392505050565b600080549082900361251e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146125cd57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612595565b50816000036125ee57604051622e076360e81b815260040160405180910390fd5b60005550505050565b6000818310612613576000828152602084905260409020611ffd565b5060009182526020526040902090565b6001600160e01b031981168114610cb857600080fd5b60006020828403121561264b57600080fd5b8135611ffd81612623565b80356001600160a01b038116811461266d57600080fd5b919050565b8015158114610cb857600080fd5b6000806040838503121561269357600080fd5b61269c83612656565b915060208301356126ac81612672565b809150509250929050565b60005b838110156126d25781810151838201526020016126ba565b50506000910152565b600081518084526126f38160208601602086016126b7565b601f01601f19169290920160200192915050565b602081526000611ffd60208301846126db565b60006020828403121561272c57600080fd5b5035919050565b6000806040838503121561274657600080fd5b61274f83612656565b946020939093013593505050565b60008060006060848603121561277257600080fd5b61277b84612656565b925061278960208501612656565b9150604084013590509250925092565b600080604083850312156127ac57600080fd5b50508035926020909101359150565b6000602082840312156127cd57600080fd5b611ffd82612656565b600080604083850312156127e957600080fd5b823591506127f960208401612656565b90509250929050565b6000806020838503121561281557600080fd5b823567ffffffffffffffff8082111561282d57600080fd5b818501915085601f83011261284157600080fd5b81358181111561285057600080fd5b86602082850101111561286257600080fd5b60209290920196919550909350505050565b604080825283519082018190526000906020906060840190828701845b828110156128b65781516001600160a01b031684529284019290840190600101612891565b5050508381038285015284518082528583019183019060005b818110156128eb578351835292840192918401916001016128cf565b5090979650505050505050565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561292457600080fd5b61292d85612656565b935061293b60208601612656565b925060408501359150606085013567ffffffffffffffff8082111561295f57600080fd5b818701915087601f83011261297357600080fd5b813581811115612985576129856128f8565b604051601f8201601f19908116603f011681019083821181831017156129ad576129ad6128f8565b816040528281528a60208487010111156129c657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000604084860312156129ff57600080fd5b83359250602084013567ffffffffffffffff80821115612a1e57600080fd5b818601915086601f830112612a3257600080fd5b813581811115612a4157600080fd5b8760208260051b8501011115612a5657600080fd5b6020830194508093505050509250925092565b600060208284031215612a7b57600080fd5b8135611ffd81612672565b600060208284031215612a9857600080fd5b81356001600160601b0381168114611ffd57600080fd5b60008060408385031215612ac257600080fd5b612acb83612656565b91506127f960208401612656565b600080600060608486031215612aee57600080fd5b83359250612afe60208501612656565b91506040840135612b0e81612672565b809150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6257607f821691505b602082108103612b8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761097e5761097e612b88565b634e487b7160e01b600052601260045260246000fd5b600082612bda57612bda612bb5565b500490565b600060208284031215612bf157600080fd5b5051919050565b8082018082111561097e5761097e612b88565b6020808252601190820152706e6f7420656e6f75676820737570706c7960781b604082015260600190565b8181038181111561097e5761097e612b88565b600060018201612c5b57612c5b612b88565b5060010190565b601f821115610acc57600081815260208120601f850160051c81016020861015612c895750805b601f850160051c820191505b81811015611f8e57828155600101612c95565b67ffffffffffffffff831115612cc057612cc06128f8565b612cd483612cce8354612b4e565b83612c62565b6000601f841160018114612d085760008515612cf05750838201355b600019600387901b1c1916600186901b17835561101a565b600083815260209020601f19861690835b82811015612d395786850135825560209485019460019092019101612d19565b5086821015612d565760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60208082526022908201527f646964206e6f742073656e6420636f727265637420616d6f756e74206f6620656040820152610e8d60f31b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000808454612dce81612b4e565b60018281168015612de65760018114612dfb57612e2a565b60ff1984168752821515830287019450612e2a565b8860005260208060002060005b85811015612e215781548a820152908401908201612e08565b50505082870194505b505050508351612e3e8183602088016126b7565b01949350505050565b600060208284031215612e5957600080fd5b8151611ffd81612672565b600082612e7357612e73612bb5565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612eab908301846126db565b9695505050505050565b600060208284031215612ec757600080fd5b8151611ffd8161262356fea264697066735822122025e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e064736f6c63430008110033

Deployed Bytecode Sourcemap

87268:9096:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96106:255;;;;;;;;;;-1:-1:-1;96106:255:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;96106:255:0;;;;;;;;90633:118;;;;;;;;;;-1:-1:-1;90633:118:0;;;;;:::i;:::-;;:::i;:::-;;55011:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61502:218::-;;;;;;;;;;-1:-1:-1;61502:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2318:32:1;;;2300:51;;2288:2;2273:18;61502:218:0;2154:203:1;95314:165:0;;;;;;:::i;:::-;;:::i;50762:323::-;;;;;;;;;;-1:-1:-1;51036:12:0;;50823:7;51020:13;:28;50762:323;;;2767:25:1;;;2755:2;2740:18;50762:323:0;2621:177:1;95487:171:0;;;;;;:::i;:::-;;:::i;18141:442::-;;;;;;;;;;-1:-1:-1;18141:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3581:32:1;;;3563:51;;3645:2;3630:18;;3623:34;;;;3536:18;18141:442:0;3389:274:1;94849:232:0;;;;;;;;;;;;;:::i;2867:143::-;;;;;;;;;;;;2967:42;2867:143;;95666:179;;;;;;:::i;:::-;;:::i;89007:134::-;;;;;;;;;;-1:-1:-1;89007:134:0;;;;;:::i;:::-;;:::i;91441:219::-;;;;;;;;;;-1:-1:-1;91441:219:0;;;;;:::i;:::-;;:::i;90546:79::-;;;;;;;;;;;;;:::i;87997:33::-;;;;;;;;;;-1:-1:-1;87997:33:0;;;;;;;;;;;56404:152;;;;;;;;;;-1:-1:-1;56404:152:0;;;;;:::i;:::-;;:::i;87416:78::-;;;;;;;;;;-1:-1:-1;87416:78:0;;;;-1:-1:-1;;;;;87416:78:0;;;87501:79;;;;;;;;;;-1:-1:-1;87501:79:0;;;;-1:-1:-1;;;;;87501:79:0;;;87593:21;;;;;;;;;;;;;:::i;51946:233::-;;;;;;;;;;-1:-1:-1;51946:233:0;;;;;:::i;:::-;;:::i;12824:103::-;;;;;;;;;;;;;:::i;89512:119::-;;;;;;;;;;-1:-1:-1;89512:119:0;;;;;:::i;:::-;;:::i;87961:29::-;;;;;;;;;;-1:-1:-1;87961:29:0;;;;;;;;94276:414;;;;;;;;;;-1:-1:-1;94276:414:0;;;;;:::i;:::-;;:::i;91220:213::-;;;;;;;;;;-1:-1:-1;91220:213:0;;;;;:::i;:::-;;:::i;94698:143::-;;;;;;;;;;-1:-1:-1;94698:143:0;;;;;:::i;:::-;;:::i;12173:87::-;;;;;;;;;;-1:-1:-1;12246:6:0;;-1:-1:-1;;;;;12246:6:0;12173:87;;90111:164;;;;;;;;;;-1:-1:-1;90111:164:0;;;;;:::i;:::-;;:::i;87746:28::-;;;;;;;;;;;;;;;;55187:104;;;;;;;;;;;;;:::i;93628:640::-;;;;;;:::i;:::-;;:::i;95130:176::-;;;;;;;;;;-1:-1:-1;95130:176:0;;;;;:::i;:::-;;:::i;87836:57::-;;;;;;;;;;-1:-1:-1;87836:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;89274:119;;;;;;;;;;-1:-1:-1;89274:119:0;;;;;:::i;:::-;;:::i;89762:143::-;;;;;;;;;;-1:-1:-1;89762:143:0;;;;;:::i;:::-;;:::i;87674:34::-;;;;;;;;;;;;;;;;89639:115;;;;;;;;;;-1:-1:-1;89639:115:0;;;;;:::i;:::-;;:::i;88594:405::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;95853:245::-;;;;;;:::i;:::-;;:::i;92778:842::-;;;;;;:::i;:::-;;:::i;91011:201::-;;;;;;;;;;-1:-1:-1;91011:201:0;;;;;:::i;:::-;;:::i;87900:52::-;;;;;;;;;;-1:-1:-1;87900:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;89913:190;;;;;;;;;;-1:-1:-1;89913:190:0;;;;;:::i;:::-;;:::i;90283:255::-;;;;;;;;;;-1:-1:-1;90283:255:0;;;;;:::i;:::-;;:::i;88323:263::-;;;;;;;;;;-1:-1:-1;88323:263:0;;;;;:::i;:::-;;:::i;89149:117::-;;;;;;;;;;-1:-1:-1;89149:117:0;;;;;:::i;:::-;;:::i;62451:164::-;;;;;;;;;;-1:-1:-1;62451:164:0;;;;;:::i;:::-;;:::i;91939:831::-;;;;;;;;;;-1:-1:-1;91939:831:0;;;;;:::i;:::-;;:::i;87783:44::-;;;;;;;;;;-1:-1:-1;87783:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;13082:201;;;;;;;;;;-1:-1:-1;13082:201:0;;;;;:::i;:::-;;:::i;87717:20::-;;;;;;;;;;-1:-1:-1;87717:20:0;;;;-1:-1:-1;;;;;87717:20:0;;;89401:103;;;;;;;;;;-1:-1:-1;89401:103:0;;;;;:::i;:::-;;:::i;96106:255::-;96221:4;96259:38;96285:11;96259:25;:38::i;:::-;:94;;;;96315:38;96341:11;96315:25;:38::i;:::-;96238:115;96106:255;-1:-1:-1;;96106:255:0:o;90633:118::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;90716:17:0;;;::::1;;::::0;;;:7:::1;:17;::::0;;;;:27;;-1:-1:-1;;90716:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;90633:118::o;55011:100::-;55065:13;55098:5;55091:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55011:100;:::o;61502:218::-;61578:7;61603:16;61611:7;61603;:16::i;:::-;61598:64;;61628:34;;-1:-1:-1;;;61628:34:0;;;;;;;;;;;61598:64;-1:-1:-1;61682:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;61682:30:0;;61502:218::o;95314:165::-;95418:8;4388:30;4409:8;4388:20;:30::i;:::-;95439:32:::1;95453:8;95463:7;95439:13;:32::i;:::-;95314:165:::0;;;:::o;95487:171::-;95596:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;95613:37:::1;95632:4;95638:2;95642:7;95613:18;:37::i;:::-;95487:171:::0;;;;:::o;18141:442::-;18238:7;18296:27;;;:17;:27;;;;;;;;18267:56;;;;;;;;;-1:-1:-1;;;;;18267:56:0;;;;;-1:-1:-1;;;18267:56:0;;;-1:-1:-1;;;;;18267:56:0;;;;;;;;18238:7;;18336:92;;-1:-1:-1;18387:29:0;;;;;;;;;18397:19;18387:29;-1:-1:-1;;;;;18387:29:0;;;;-1:-1:-1;;;18387:29:0;;-1:-1:-1;;;;;18387:29:0;;;;;18336:92;18478:23;;;;18440:21;;18949:5;;18465:36;;-1:-1:-1;;;;;18465:36:0;:10;:36;:::i;:::-;18464:58;;;;:::i;:::-;18543:16;;;;;-1:-1:-1;18141:442:0;;-1:-1:-1;;;;18141:442:0:o;94849:232::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;94905:5:::1;::::0;-1:-1:-1;;;;;94905:5:0::1;94897:53;;;::::0;-1:-1:-1;;;94897:53:0;;11173:2:1;94897:53:0::1;::::0;::::1;11155:21:1::0;11212:2;11192:18;;;11185:30;-1:-1:-1;;;11231:18:1;;;11224:51;11292:18;;94897:53:0::1;10971:345:1::0;94897:53:0::1;94982:5;::::0;:44:::1;::::0;94964:12:::1;::::0;-1:-1:-1;;;;;94982:5:0::1;::::0;95000:21:::1;::::0;94964:12;94982:44;94964:12;94982:44;95000:21;94982:5;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94963:63;;;95045:7;95037:36;;;::::0;-1:-1:-1;;;95037:36:0;;11733:2:1;95037:36:0::1;::::0;::::1;11715:21:1::0;11772:2;11752:18;;;11745:30;-1:-1:-1;;;11791:18:1;;;11784:46;11847:18;;95037:36:0::1;11531:340:1::0;95037:36:0::1;94886:195;94849:232::o:0;95666:179::-;95779:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;95796:41:::1;95819:4;95825:2;95829:7;95796:22;:41::i;89007:134::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89091:19:::1;:42:::0;89007:134::o;91441:219::-;91549:19;;91595:28;;-1:-1:-1;;;91595:28:0;;-1:-1:-1;;;;;2318:32:1;;;91595:28:0;;;2300:51:1;91501:4:0;;91549:19;;91501:4;;;;91549:19;;91595:22;;2273:18:1;;91595:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;;91441:219;-1:-1:-1;;;;91441:219:0:o;90546:79::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;90597:13:::1;:20:::0;;-1:-1:-1;;90597:20:0::1;;;::::0;;90546:79::o;56404:152::-;56476:7;56519:27;56538:7;56519:18;:27::i;87593:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51946:233::-;52018:7;-1:-1:-1;;;;;52042:19:0;;52038:60;;52070:28;;-1:-1:-1;;;52070:28:0;;;;;;;;;;;52038:60;-1:-1:-1;;;;;;52116:25:0;;;;;:18;:25;;;;;;46105:13;52116:55;;51946:233::o;12824:103::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;12889:30:::1;12916:1;12889:18;:30::i;:::-;12824:103::o:0;89512:119::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89593:13:::1;:30:::0;89512:119::o;94276:414::-;90808:10;90800:19;;;;:7;:19;;;;;;;;:27;;:19;:27;90792:61;;;;-1:-1:-1;;;90792:61:0;;12267:2:1;90792:61:0;;;12249:21:1;12306:2;12286:18;;;12279:30;-1:-1:-1;;;12325:18:1;;;12318:51;12386:18;;90792:61:0;12065:345:1;90792:61:0;94385:9:::1;;94373:8;94357:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94357:13:::1;:24;;;;:::i;:::-;:37;;94349:67;;;;-1:-1:-1::0;;;94349:67:0::1;;;;;;;:::i;:::-;94429:18;94450:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94450:13:::1;94429:34;;94474:18;94522:1;94511:8;94495:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94495:13:::1;:24;;;;:::i;:::-;:28;;;;:::i;:::-;94474:49;;94536:23;94546:2;94550:8;94536:9;:23::i;:::-;94590:10:::0;94572:111:::1;94608:10;94602:2;:16;94572:111;;94641:12;::::0;;;:8:::1;:12;::::0;;;;94656:15:::1;94641:30:::0;;94650:2;94620:4:::1;94650:2:::0;94620:4:::1;:::i;:::-;;;;94572:111;;;;94338:352;;94276:414:::0;;:::o;91220:213::-;91326:18;;91370:27;;-1:-1:-1;;;91370:27:0;;-1:-1:-1;;;;;2318:32:1;;;91370:27:0;;;2300:51:1;91279:4:0;;91326:18;;91279:4;;;;91326:18;;91370:21;;2273:18:1;;91370:27:0;2154:203:1;94698:143:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;94769:5:::1;:16:::0;;-1:-1:-1;;;;;;94769:16:0::1;-1:-1:-1::0;;;;;94769:16:0;::::1;::::0;;::::1;::::0;;;94822:10:::1;::::0;94796:37:::1;::::0;94769:16;-1:-1:-1;;;;;94822:10:0::1;94796:18;:37::i;90111:164::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;90201:13:::1;::::0;::::1;::::0;::::1;;;90200:14;90192:42;;;::::0;-1:-1:-1;;;90192:42:0;;13366:2:1;90192:42:0::1;::::0;::::1;13348:21:1::0;13405:2;13385:18;;;13378:30;-1:-1:-1;;;13424:18:1;;;13417:45;13479:18;;90192:42:0::1;13164:339:1::0;90192:42:0::1;90245:7;:22;90255:12:::0;;90245:7;:22:::1;:::i;55187:104::-:0;55243:13;55276:7;55269:14;;;;;:::i;93628:640::-;9271:1;9869:7;;:19;9861:63;;;;-1:-1:-1;;;9861:63:0;;15768:2:1;9861:63:0;;;15750:21:1;15807:2;15787:18;;;15780:30;15846:33;15826:18;;;15819:61;15897:18;;9861:63:0;15566:355:1;9861:63:0;9271:1;10002:7;:18;90924:9:::1;90937:10;90924:23;90916:67;;;::::0;-1:-1:-1;;;90916:67:0;;16128:2:1;90916:67:0::1;::::0;::::1;16110:21:1::0;16167:2;16147:18;;;16140:30;16206:33;16186:18;;;16179:61;16257:18;;90916:67:0::1;15926:355:1::0;90916:67:0::1;93721:10:::2;::::0;::::2;;93720:11;93712:38;;;::::0;-1:-1:-1;;;93712:38:0;;16488:2:1;93712:38:0::2;::::0;::::2;16470:21:1::0;16527:2;16507:18;;;16500:30;-1:-1:-1;;;16546:18:1;;;16539:44;16600:18;;93712:38:0::2;16286:338:1::0;93712:38:0::2;93763:18;93784:39;93795:8;93805:10;93817:5;93784:10;:39::i;:::-;93763:60;;93857:10;93844:9;:23;93836:70;;;;-1:-1:-1::0;;;93836:70:0::2;;;;;;;:::i;:::-;93955:9;;93943:8;93927:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93927:13:::2;:24;;;;:::i;:::-;:37;;93919:67;;;;-1:-1:-1::0;;;93919:67:0::2;;;;;;;:::i;:::-;93999:18;94020:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94020:13:::2;93999:34;;94044:18;94092:1;94081:8;94065:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;94065:13:::2;:24;;;;:::i;:::-;:28;;;;:::i;:::-;94044:49;;94106:31;94116:10;94128:8;94106:9;:31::i;:::-;94168:10:::0;94150:111:::2;94186:10;94180:2;:16;94150:111;;94219:12;::::0;;;:8:::2;:12;::::0;;;;94234:15:::2;94219:30:::0;;94228:2;94198:4:::2;94228:2:::0;94198:4:::2;:::i;:::-;;;;94150:111;;;-1:-1:-1::0;;9227:1:0;10181:7;:22;-1:-1:-1;;;93628:640:0:o;95130:176::-;95234:8;4388:30;4409:8;4388:20;:30::i;:::-;95255:43:::1;95279:8;95289;95255:23;:43::i;89274:119::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89355:19:::1;:30:::0;;-1:-1:-1;;;;;;89355:30:0::1;-1:-1:-1::0;;;;;89355:30:0;;;::::1;::::0;;;::::1;::::0;;89274:119::o;89762:143::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89855:19:::1;:42:::0;89762:143::o;89639:115::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89718:12:::1;:28:::0;89639:115::o;88594:405::-;88639:16;88657;88686:23;88726:13;51036:12;;50823:7;51020:13;:28;;50762:323;88726:13;88712:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88712:28:0;;88686:54;;88751:26;88794:13;51036:12;;50823:7;51020:13;:28;;50762:323;88794:13;88780:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;88780:28:0;;88751:57;;88826:9;88821:134;51036:12;;50823:7;51020:13;:28;88841:1;:17;88821:134;;;88892:10;88900:1;88892:7;:10::i;:::-;88880:6;88887:1;88880:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;88880:22:0;;;:9;;;;;;;;;;:22;88932:11;;;;:8;:11;;;;;;;88917:12;;:9;;88941:1;;88917:12;;;;;;:::i;:::-;;;;;;;;;;:26;88860:3;;;;:::i;:::-;;;;88821:134;;;-1:-1:-1;88973:6:0;;88981:9;;-1:-1:-1;88594:405:0;-1:-1:-1;88594:405:0:o;95853:245::-;96021:4;-1:-1:-1;;;;;4208:18:0;;4216:10;4208:18;4204:83;;4243:32;4264:10;4243:20;:32::i;:::-;96043:47:::1;96066:4;96072:2;96076:7;96085:4;96043:22;:47::i;92778:842::-:0;9271:1;9869:7;;:19;9861:63;;;;-1:-1:-1;;;9861:63:0;;15768:2:1;9861:63:0;;;15750:21:1;15807:2;15787:18;;;15780:30;15846:33;15826:18;;;15819:61;15897:18;;9861:63:0;15566:355:1;9861:63:0;9271:1;10002:7;:18;90924:9:::1;90937:10;90924:23;90916:67;;;::::0;-1:-1:-1;;;90916:67:0;;16128:2:1;90916:67:0::1;::::0;::::1;16110:21:1::0;16167:2;16147:18;;;16140:30;16206:33;16186:18;;;16179:61;16257:18;;90916:67:0::1;15926:355:1::0;90916:67:0::1;92914:10:::2;::::0;::::2;;92913:11;92905:38;;;::::0;-1:-1:-1;;;92905:38:0;;16488:2:1;92905:38:0::2;::::0;::::2;16470:21:1::0;16527:2;16507:18;;;16500:30;-1:-1:-1;;;16546:18:1;;;16539:44;16600:18;;92905:38:0::2;16286:338:1::0;92905:38:0::2;92981:28;::::0;-1:-1:-1;;92998:10:0::2;17313:2:1::0;17309:15;17305:53;92981:28:0::2;::::0;::::2;17293:66:1::0;92956:12:0::2;::::0;17375::1;;92981:28:0::2;;;;;;;;;;;;92971:39;;;;;;92956:54;;93029:58;93048:11;;93029:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;93061:19:0::2;::::0;;-1:-1:-1;93082:4:0;;-1:-1:-1;93029:18:0::2;:58::i;:::-;93021:84;;;::::0;-1:-1:-1;;;93021:84:0;;17600:2:1;93021:84:0::2;::::0;::::2;17582:21:1::0;17639:2;17619:18;;;17612:30;-1:-1:-1;;;17658:18:1;;;17651:43;17711:18;;93021:84:0::2;17398:337:1::0;93021:84:0::2;93118:18;93139:38;93150:8;93160:10;93172:4;93139:10;:38::i;:::-;93118:59;;93211:10;93198:9;:23;93190:70;;;;-1:-1:-1::0;;;93190:70:0::2;;;;;;;:::i;:::-;93307:9;;93295:8;93279:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93279:13:::2;:24;;;;:::i;:::-;:37;;93271:67;;;;-1:-1:-1::0;;;93271:67:0::2;;;;;;;:::i;:::-;93351:18;93372:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93372:13:::2;93351:34;;93396:18;93444:1;93433:8;93417:13;51036:12:::0;;50823:7;51020:13;:28;;50762:323;93417:13:::2;:24;;;;:::i;:::-;:28;;;;:::i;:::-;93396:49;;93458:31;93468:10;93480:8;93458:9;:31::i;:::-;93520:10:::0;93502:111:::2;93538:10;93532:2;:16;93502:111;;93571:12;::::0;;;:8:::2;:12;::::0;;;;93586:15:::2;93571:30:::0;;93580:2;93550:4:::2;93580:2:::0;93550:4:::2;:::i;:::-;;;;93502:111;;;-1:-1:-1::0;;9227:1:0;10181:7;:22;-1:-1:-1;;;;;;92778:842:0:o;91011:201::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;91109:32:::1;::::0;;;:21:::1;:32;::::0;;;;;;;:47;;;;91167:19:::1;:30:::0;;;;:37;;-1:-1:-1;;91167:37:0::1;91200:4;91167:37;::::0;;91011:201::o;89913:190::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89985:10:::1;:24:::0;;-1:-1:-1;;89985:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;::::1;90026:10:::0;90022:74:::1;;90069:15;90053:13;:31:::0;89913:190;:::o;90283:255::-;90348:13;90382:16;90390:7;90382;:16::i;:::-;90374:76;;;;-1:-1:-1;;;90374:76:0;;17942:2:1;90374:76:0;;;17924:21:1;17981:2;17961:18;;;17954:30;18020:34;18000:18;;;17993:62;-1:-1:-1;;;18071:18:1;;;18064:45;18126:19;;90374:76:0;17740:411:1;90374:76:0;90494:7;90503:25;90520:7;90503:16;:25::i;:::-;90477:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;90463:67;;90283:255;;;:::o;88323:263::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;88402:5:::1;::::0;-1:-1:-1;;;;;88402:5:0::1;88394:101;;;::::0;-1:-1:-1;;;88394:101:0;;19383:2:1;88394:101:0::1;::::0;::::1;19365:21:1::0;19422:2;19402:18;;;19395:30;19461:34;19441:18;;;19434:62;19532:34;19512:18;;;19505:62;-1:-1:-1;;;19583:19:1;;;19576:38;19631:19;;88394:101:0::1;19181:475:1::0;88394:101:0::1;88506:10;:24:::0;;-1:-1:-1;;88506:24:0::1;-1:-1:-1::0;;;;;88506:24:0;::::1;::::0;;::::1;::::0;;;88560:5:::1;::::0;88541:37:::1;::::0;-1:-1:-1;;;;;88560:5:0;;::::1;::::0;88541:18:::1;:37::i;89149:117::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89229:18:::1;:29:::0;;-1:-1:-1;;;;;;89229:29:0::1;-1:-1:-1::0;;;;;89229:29:0;;;::::1;::::0;;;::::1;::::0;;89149:117::o;62451:164::-;-1:-1:-1;;;;;62572:25:0;;;62548:4;62572:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;62451:164::o;91939:831::-;92030:7;92050:11;92064:20;92079:4;92064:14;:20::i;:::-;92050:34;;92095:12;92110:21;92126:4;92110:15;:21::i;:::-;92160:9;;92095:36;;-1:-1:-1;92185:6:0;:34;;;;;92196:7;:22;;;;92207:11;92196:22;92182:260;;;-1:-1:-1;92244:19:0;;92182:260;;;92295:6;92292:150;;;-1:-1:-1;92326:12:0;;92292:150;;;92370:7;:22;;;;92381:11;92370:22;92367:75;;;-1:-1:-1;92417:13:0;;92367:75;92454:13;92470:16;92478:8;92470:5;:16;:::i;:::-;92502:29;;;;:19;:29;;;;;;92454:32;;-1:-1:-1;92502:29:0;;92499:239;;;92548:19;92570:31;;;:21;:31;;;;;;;92666:17;92680:3;92570:31;92666:17;:::i;:::-;92653:8;92641:9;;:20;;;;:::i;:::-;92640:44;;;;:::i;:::-;92618:66;-1:-1:-1;92707:19:0;92618:66;92707:5;:19;:::i;:::-;92699:27;;92533:205;;92499:239;92757:5;91939:831;-1:-1:-1;;;;;;;91939:831:0:o;13082:201::-;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13171:22:0;::::1;13163:73;;;::::0;-1:-1:-1;;;13163:73:0;;19863:2:1;13163:73:0::1;::::0;::::1;19845:21:1::0;19902:2;19882:18;;;19875:30;19941:34;19921:18;;;19914:62;-1:-1:-1;;;19992:18:1;;;19985:36;20038:19;;13163:73:0::1;19661:402:1::0;13163:73:0::1;13247:28;13266:8;13247:18;:28::i;89401:103::-:0;12246:6;;-1:-1:-1;;;;;12246:6:0;10977:10;12393:23;12385:68;;;;-1:-1:-1;;;12385:68:0;;;;;;;:::i;:::-;89474:9:::1;:22:::0;89401:103::o;54109:639::-;54194:4;-1:-1:-1;;;;;;;;;54518:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54595:25:0;;;54518:102;:179;;;-1:-1:-1;;;;;;;;54672:25:0;-1:-1:-1;;;54672:25:0;;54109:639::o;17871:215::-;17973:4;-1:-1:-1;;;;;;17997:41:0;;-1:-1:-1;;;17997:41:0;;:81;;-1:-1:-1;;;;;;;;;;15532:40:0;;;18042:36;15423:157;62873:282;62938:4;63028:13;;63018:7;:23;62975:153;;;;-1:-1:-1;;63079:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;63079:44:0;:49;;62873:282::o;4446:419::-;2967:42;4637:45;:49;4633:225;;4708:67;;-1:-1:-1;;;4708:67:0;;4759:4;4708:67;;;20280:34:1;-1:-1:-1;;;;;20350:15:1;;20330:18;;;20323:43;2967:42:0;;4708;;20215:18:1;;4708:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4703:144;;4803:28;;-1:-1:-1;;;4803:28:0;;-1:-1:-1;;;;;2318:32:1;;4803:28:0;;;2300:51:1;2273:18;;4803:28:0;2154:203:1;60935:408:0;61024:13;61040:16;61048:7;61040;:16::i;:::-;61024:32;-1:-1:-1;10977:10:0;-1:-1:-1;;;;;61073:28:0;;;61069:175;;61121:44;61138:5;10977:10;62451:164;:::i;61121:44::-;61116:128;;61193:35;;-1:-1:-1;;;61193:35:0;;;;;;;;;;;61116:128;61256:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;61256:35:0;-1:-1:-1;;;;;61256:35:0;;;;;;;;;61307:28;;61256:24;;61307:28;;;;;;;61013:330;60935:408;;:::o;65141:2825::-;65283:27;65313;65332:7;65313:18;:27::i;:::-;65283:57;;65398:4;-1:-1:-1;;;;;65357:45:0;65373:19;-1:-1:-1;;;;;65357:45:0;;65353:86;;65411:28;;-1:-1:-1;;;65411:28:0;;;;;;;;;;;65353:86;65453:27;64249:24;;;:15;:24;;;;;64477:26;;10977:10;63874:30;;;-1:-1:-1;;;;;63567:28:0;;63852:20;;;63849:56;65639:180;;65732:43;65749:4;10977:10;62451:164;:::i;65732:43::-;65727:92;;65784:35;;-1:-1:-1;;;65784:35:0;;;;;;;;;;;65727:92;-1:-1:-1;;;;;65836:16:0;;65832:52;;65861:23;;-1:-1:-1;;;65861:23:0;;;;;;;;;;;65832:52;66033:15;66030:160;;;66173:1;66152:19;66145:30;66030:160;-1:-1:-1;;;;;66570:24:0;;;;;;;:18;:24;;;;;;66568:26;;-1:-1:-1;;66568:26:0;;;66639:22;;;;;;;;;66637:24;;-1:-1:-1;66637:24:0;;;59793:11;59768:23;59764:41;59751:63;-1:-1:-1;;;59751:63:0;66932:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;67227:47:0;;:52;;67223:627;;67332:1;67322:11;;67300:19;67455:30;;;:17;:30;;;;;;:35;;67451:384;;67593:13;;67578:11;:28;67574:242;;67740:30;;;;:17;:30;;;;;:52;;;67574:242;67281:569;67223:627;67897:7;67893:2;-1:-1:-1;;;;;67878:27:0;67887:4;-1:-1:-1;;;;;67878:27:0;;;;;;;;;;;67916:42;65272:2694;;;65141:2825;;;:::o;68062:193::-;68208:39;68225:4;68231:2;68235:7;68208:39;;;;;;;;;;;;:16;:39::i;57559:1275::-;57626:7;57661;57763:13;;57756:4;:20;57752:1015;;;57801:14;57818:23;;;:17;:23;;;;;;;-1:-1:-1;;;57907:24:0;;:29;;57903:845;;58572:113;58579:6;58589:1;58579:11;58572:113;;-1:-1:-1;;;58650:6:0;58632:25;;;;:17;:25;;;;;;58572:113;;;58718:6;57559:1275;-1:-1:-1;;;57559:1275:0:o;57903:845::-;57778:989;57752:1015;58795:31;;-1:-1:-1;;;58795:31:0;;;;;;;;;;;13443:191;13536:6;;;-1:-1:-1;;;;;13553:17:0;;;-1:-1:-1;;;;;;13553:17:0;;;;;;;13586:40;;13536:6;;;13553:17;13536:6;;13586:40;;13517:16;;13586:40;13506:128;13443:191;:::o;79013:112::-;79090:27;79100:2;79104:8;79090:27;;;;;;;;;;;;:9;:27::i;:::-;79013:112;;:::o;19233:332::-;18949:5;-1:-1:-1;;;;;19336:33:0;;;;19328:88;;;;-1:-1:-1;;;19328:88:0;;20829:2:1;19328:88:0;;;20811:21:1;20868:2;20848:18;;;20841:30;20907:34;20887:18;;;20880:62;-1:-1:-1;;;20958:18:1;;;20951:40;21008:19;;19328:88:0;20627:406:1;19328:88:0;-1:-1:-1;;;;;19435:22:0;;19427:60;;;;-1:-1:-1;;;19427:60:0;;21240:2:1;19427:60:0;;;21222:21:1;21279:2;21259:18;;;21252:30;21318:27;21298:18;;;21291:55;21363:18;;19427:60:0;21038:349:1;19427:60:0;19522:35;;;;;;;;;-1:-1:-1;;;;;19522:35:0;;;;;;-1:-1:-1;;;;;19522:35:0;;;;;;;;;;-1:-1:-1;;;19500:57:0;;;;:19;:57;19233:332::o;62060:234::-;10977:10;62155:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;62155:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;62155:60:0;;;;;;;;;;62231:55;;540:41:1;;;62155:49:0;;10977:10;62231:55;;513:18:1;62231:55:0;;;;;;;62060:234;;:::o;68853:407::-;69028:31;69041:4;69047:2;69051:7;69028:12;:31::i;:::-;-1:-1:-1;;;;;69074:14:0;;;:19;69070:183;;69113:56;69144:4;69150:2;69154:7;69163:5;69113:30;:56::i;:::-;69108:145;;69197:40;;-1:-1:-1;;;69197:40:0;;;;;;;;;;;26734:190;26859:4;26912;26883:25;26896:5;26903:4;26883:12;:25::i;:::-;:33;;26734:190;-1:-1:-1;;;;26734:190:0:o;5700:723::-;5756:13;5977:5;5986:1;5977:10;5973:53;;-1:-1:-1;;6004:10:0;;;;;;;;;;;;-1:-1:-1;;;6004:10:0;;;;;5700:723::o;5973:53::-;6051:5;6036:12;6092:78;6099:9;;6092:78;;6125:8;;;;:::i;:::-;;-1:-1:-1;6148:10:0;;-1:-1:-1;6156:2:0;6148:10;;:::i;:::-;;;6092:78;;;6180:19;6212:6;6202:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6202:17:0;;6180:39;;6230:154;6237:10;;6230:154;;6264:11;6274:1;6264:11;;:::i;:::-;;-1:-1:-1;6333:10:0;6341:2;6333:5;:10;:::i;:::-;6320:24;;:2;:24;:::i;:::-;6307:39;;6290:6;6297;6290:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6290:56:0;;;;;;;;-1:-1:-1;6361:11:0;6370:2;6361:11;;:::i;:::-;;;6230:154;;;6408:6;5700:723;-1:-1:-1;;;;5700:723:0:o;78240:689::-;78371:19;78377:2;78381:8;78371:5;:19::i;:::-;-1:-1:-1;;;;;78432:14:0;;;:19;78428:483;;78472:11;78486:13;78534:14;;;78567:233;78598:62;78637:1;78641:2;78645:7;;;;;;78654:5;78598:30;:62::i;:::-;78593:167;;78696:40;;-1:-1:-1;;;78696:40:0;;;;;;;;;;;78593:167;78795:3;78787:5;:11;78567:233;;78882:3;78865:13;;:20;78861:34;;78887:8;;;71344:716;71528:88;;-1:-1:-1;;;71528:88:0;;71507:4;;-1:-1:-1;;;;;71528:45:0;;;;;:88;;10977:10;;71595:4;;71601:7;;71610:5;;71528:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71528:88:0;;;;;;;;-1:-1:-1;;71528:88:0;;;;;;;;;;;;:::i;:::-;;;71524:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71811:6;:13;71828:1;71811:18;71807:235;;71857:40;;-1:-1:-1;;;71857:40:0;;;;;;;;;;;71807:235;72000:6;71994:13;71985:6;71981:2;71977:15;71970:38;71524:529;-1:-1:-1;;;;;;71687:64:0;-1:-1:-1;;;71687:64:0;;-1:-1:-1;71344:716:0;;;;;;:::o;27601:296::-;27684:7;27727:4;27684:7;27742:118;27766:5;:12;27762:1;:16;27742:118;;;27815:33;27825:12;27839:5;27845:1;27839:8;;;;;;;;:::i;:::-;;;;;;;27815:9;:33::i;:::-;27800:48;-1:-1:-1;27780:3:0;;;;:::i;:::-;;;;27742:118;;;-1:-1:-1;27877:12:0;27601:296;-1:-1:-1;;;27601:296:0:o;72522:2966::-;72595:20;72618:13;;;72646;;;72642:44;;72668:18;;-1:-1:-1;;;72668:18:0;;;;;;;;;;;72642:44;-1:-1:-1;;;;;73174:22:0;;;;;;:18;:22;;;;46243:2;73174:22;;;:71;;73212:32;73200:45;;73174:71;;;73488:31;;;:17;:31;;;;;-1:-1:-1;60224:15:0;;60198:24;60194:46;59793:11;59768:23;59764:41;59761:52;59751:63;;73488:173;;73723:23;;;;73488:31;;73174:22;;74488:25;73174:22;;74341:335;75002:1;74988:12;74984:20;74942:346;75043:3;75034:7;75031:16;74942:346;;75261:7;75251:8;75248:1;75221:25;75218:1;75215;75210:59;75096:1;75083:15;74942:346;;;74946:77;75321:8;75333:1;75321:13;75317:45;;75343:19;;-1:-1:-1;;;75343:19:0;;;;;;;;;;;75317:45;75379:13;:19;-1:-1:-1;95314:165:0;;;:::o;33808:149::-;33871:7;33902:1;33898;:5;:51;;34033:13;34127:15;;;34163:4;34156:15;;;34210:4;34194:21;;33898:51;;;-1:-1:-1;34033:13:0;34127:15;;;34163:4;34156:15;34210:4;34194:21;;;33808:149::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:118::-;856:5;849:13;842:21;835:5;832:32;822:60;;878:1;875;868:12;893:315;958:6;966;1019:2;1007:9;998:7;994:23;990:32;987:52;;;1035:1;1032;1025:12;987:52;1058:29;1077:9;1058:29;:::i;:::-;1048:39;;1137:2;1126:9;1122:18;1109:32;1150:28;1172:5;1150:28;:::i;:::-;1197:5;1187:15;;;893:315;;;;;:::o;1213:250::-;1298:1;1308:113;1322:6;1319:1;1316:13;1308:113;;;1398:11;;;1392:18;1379:11;;;1372:39;1344:2;1337:10;1308:113;;;-1:-1:-1;;1455:1:1;1437:16;;1430:27;1213:250::o;1468:271::-;1510:3;1548:5;1542:12;1575:6;1570:3;1563:19;1591:76;1660:6;1653:4;1648:3;1644:14;1637:4;1630:5;1626:16;1591:76;:::i;:::-;1721:2;1700:15;-1:-1:-1;;1696:29:1;1687:39;;;;1728:4;1683:50;;1468:271;-1:-1:-1;;1468:271:1:o;1744:220::-;1893:2;1882:9;1875:21;1856:4;1913:45;1954:2;1943:9;1939:18;1931:6;1913:45;:::i;1969:180::-;2028:6;2081:2;2069:9;2060:7;2056:23;2052:32;2049:52;;;2097:1;2094;2087:12;2049:52;-1:-1:-1;2120:23:1;;1969:180;-1:-1:-1;1969:180:1:o;2362:254::-;2430:6;2438;2491:2;2479:9;2470:7;2466:23;2462:32;2459:52;;;2507:1;2504;2497:12;2459:52;2530:29;2549:9;2530:29;:::i;:::-;2520:39;2606:2;2591:18;;;;2578:32;;-1:-1:-1;;;2362:254:1:o;2803:328::-;2880:6;2888;2896;2949:2;2937:9;2928:7;2924:23;2920:32;2917:52;;;2965:1;2962;2955:12;2917:52;2988:29;3007:9;2988:29;:::i;:::-;2978:39;;3036:38;3070:2;3059:9;3055:18;3036:38;:::i;:::-;3026:48;;3121:2;3110:9;3106:18;3093:32;3083:42;;2803:328;;;;;:::o;3136:248::-;3204:6;3212;3265:2;3253:9;3244:7;3240:23;3236:32;3233:52;;;3281:1;3278;3271:12;3233:52;-1:-1:-1;;3304:23:1;;;3374:2;3359:18;;;3346:32;;-1:-1:-1;3136:248:1:o;4092:186::-;4151:6;4204:2;4192:9;4183:7;4179:23;4175:32;4172:52;;;4220:1;4217;4210:12;4172:52;4243:29;4262:9;4243:29;:::i;4283:254::-;4351:6;4359;4412:2;4400:9;4391:7;4387:23;4383:32;4380:52;;;4428:1;4425;4418:12;4380:52;4464:9;4451:23;4441:33;;4493:38;4527:2;4516:9;4512:18;4493:38;:::i;:::-;4483:48;;4283:254;;;;;:::o;4542:592::-;4613:6;4621;4674:2;4662:9;4653:7;4649:23;4645:32;4642:52;;;4690:1;4687;4680:12;4642:52;4730:9;4717:23;4759:18;4800:2;4792:6;4789:14;4786:34;;;4816:1;4813;4806:12;4786:34;4854:6;4843:9;4839:22;4829:32;;4899:7;4892:4;4888:2;4884:13;4880:27;4870:55;;4921:1;4918;4911:12;4870:55;4961:2;4948:16;4987:2;4979:6;4976:14;4973:34;;;5003:1;5000;4993:12;4973:34;5048:7;5043:2;5034:6;5030:2;5026:15;5022:24;5019:37;5016:57;;;5069:1;5066;5059:12;5016:57;5100:2;5092:11;;;;;5122:6;;-1:-1:-1;4542:592:1;;-1:-1:-1;;;;4542:592:1:o;5321:1178::-;5589:2;5601:21;;;5671:13;;5574:18;;;5693:22;;;5541:4;;5768;;5746:2;5731:18;;;5795:15;;;5541:4;5838:195;5852:6;5849:1;5846:13;5838:195;;;5917:13;;-1:-1:-1;;;;;5913:39:1;5901:52;;5973:12;;;;6008:15;;;;5949:1;5867:9;5838:195;;;-1:-1:-1;;;6069:19:1;;;6049:18;;;6042:47;6139:13;;6161:21;;;6237:15;;;;6200:12;;;6272:1;6282:189;6298:8;6293:3;6290:17;6282:189;;;6367:15;;6353:30;;6444:17;;;;6405:14;;;;6326:1;6317:11;6282:189;;;-1:-1:-1;6488:5:1;;5321:1178;-1:-1:-1;;;;;;;5321:1178:1:o;6504:127::-;6565:10;6560:3;6556:20;6553:1;6546:31;6596:4;6593:1;6586:15;6620:4;6617:1;6610:15;6636:1138;6731:6;6739;6747;6755;6808:3;6796:9;6787:7;6783:23;6779:33;6776:53;;;6825:1;6822;6815:12;6776:53;6848:29;6867:9;6848:29;:::i;:::-;6838:39;;6896:38;6930:2;6919:9;6915:18;6896:38;:::i;:::-;6886:48;;6981:2;6970:9;6966:18;6953:32;6943:42;;7036:2;7025:9;7021:18;7008:32;7059:18;7100:2;7092:6;7089:14;7086:34;;;7116:1;7113;7106:12;7086:34;7154:6;7143:9;7139:22;7129:32;;7199:7;7192:4;7188:2;7184:13;7180:27;7170:55;;7221:1;7218;7211:12;7170:55;7257:2;7244:16;7279:2;7275;7272:10;7269:36;;;7285:18;;:::i;:::-;7360:2;7354:9;7328:2;7414:13;;-1:-1:-1;;7410:22:1;;;7434:2;7406:31;7402:40;7390:53;;;7458:18;;;7478:22;;;7455:46;7452:72;;;7504:18;;:::i;:::-;7544:10;7540:2;7533:22;7579:2;7571:6;7564:18;7619:7;7614:2;7609;7605;7601:11;7597:20;7594:33;7591:53;;;7640:1;7637;7630:12;7591:53;7696:2;7691;7687;7683:11;7678:2;7670:6;7666:15;7653:46;7741:1;7736:2;7731;7723:6;7719:15;7715:24;7708:35;7762:6;7752:16;;;;;;;6636:1138;;;;;;;:::o;7779:683::-;7874:6;7882;7890;7943:2;7931:9;7922:7;7918:23;7914:32;7911:52;;;7959:1;7956;7949:12;7911:52;7995:9;7982:23;7972:33;;8056:2;8045:9;8041:18;8028:32;8079:18;8120:2;8112:6;8109:14;8106:34;;;8136:1;8133;8126:12;8106:34;8174:6;8163:9;8159:22;8149:32;;8219:7;8212:4;8208:2;8204:13;8200:27;8190:55;;8241:1;8238;8231:12;8190:55;8281:2;8268:16;8307:2;8299:6;8296:14;8293:34;;;8323:1;8320;8313:12;8293:34;8376:7;8371:2;8361:6;8358:1;8354:14;8350:2;8346:23;8342:32;8339:45;8336:65;;;8397:1;8394;8387:12;8336:65;8428:2;8424;8420:11;8410:21;;8450:6;8440:16;;;;;7779:683;;;;;:::o;8467:241::-;8523:6;8576:2;8564:9;8555:7;8551:23;8547:32;8544:52;;;8592:1;8589;8582:12;8544:52;8631:9;8618:23;8650:28;8672:5;8650:28;:::i;8713:292::-;8771:6;8824:2;8812:9;8803:7;8799:23;8795:32;8792:52;;;8840:1;8837;8830:12;8792:52;8879:9;8866:23;-1:-1:-1;;;;;8922:5:1;8918:38;8911:5;8908:49;8898:77;;8971:1;8968;8961:12;9010:260;9078:6;9086;9139:2;9127:9;9118:7;9114:23;9110:32;9107:52;;;9155:1;9152;9145:12;9107:52;9178:29;9197:9;9178:29;:::i;:::-;9168:39;;9226:38;9260:2;9249:9;9245:18;9226:38;:::i;9275:383::-;9349:6;9357;9365;9418:2;9406:9;9397:7;9393:23;9389:32;9386:52;;;9434:1;9431;9424:12;9386:52;9470:9;9457:23;9447:33;;9499:38;9533:2;9522:9;9518:18;9499:38;:::i;:::-;9489:48;;9587:2;9576:9;9572:18;9559:32;9600:28;9622:5;9600:28;:::i;:::-;9647:5;9637:15;;;9275:383;;;;;:::o;9663:356::-;9865:2;9847:21;;;9884:18;;;9877:30;9943:34;9938:2;9923:18;;9916:62;10010:2;9995:18;;9663:356::o;10024:380::-;10103:1;10099:12;;;;10146;;;10167:61;;10221:4;10213:6;10209:17;10199:27;;10167:61;10274:2;10266:6;10263:14;10243:18;10240:38;10237:161;;10320:10;10315:3;10311:20;10308:1;10301:31;10355:4;10352:1;10345:15;10383:4;10380:1;10373:15;10237:161;;10024:380;;;:::o;10409:127::-;10470:10;10465:3;10461:20;10458:1;10451:31;10501:4;10498:1;10491:15;10525:4;10522:1;10515:15;10541:168;10614:9;;;10645;;10662:15;;;10656:22;;10642:37;10632:71;;10683:18;;:::i;10714:127::-;10775:10;10770:3;10766:20;10763:1;10756:31;10806:4;10803:1;10796:15;10830:4;10827:1;10820:15;10846:120;10886:1;10912;10902:35;;10917:18;;:::i;:::-;-1:-1:-1;10951:9:1;;10846:120::o;11876:184::-;11946:6;11999:2;11987:9;11978:7;11974:23;11970:32;11967:52;;;12015:1;12012;12005:12;11967:52;-1:-1:-1;12038:16:1;;11876:184;-1:-1:-1;11876:184:1:o;12415:125::-;12480:9;;;12501:10;;;12498:36;;;12514:18;;:::i;12545:341::-;12747:2;12729:21;;;12786:2;12766:18;;;12759:30;-1:-1:-1;;;12820:2:1;12805:18;;12798:47;12877:2;12862:18;;12545:341::o;12891:128::-;12958:9;;;12979:11;;;12976:37;;;12993:18;;:::i;13024:135::-;13063:3;13084:17;;;13081:43;;13104:18;;:::i;:::-;-1:-1:-1;13151:1:1;13140:13;;13024:135::o;13634:545::-;13736:2;13731:3;13728:11;13725:448;;;13772:1;13797:5;13793:2;13786:17;13842:4;13838:2;13828:19;13912:2;13900:10;13896:19;13893:1;13889:27;13883:4;13879:38;13948:4;13936:10;13933:20;13930:47;;;-1:-1:-1;13971:4:1;13930:47;14026:2;14021:3;14017:12;14014:1;14010:20;14004:4;14000:31;13990:41;;14081:82;14099:2;14092:5;14089:13;14081:82;;;14144:17;;;14125:1;14114:13;14081:82;;14355:1206;14479:18;14474:3;14471:27;14468:53;;;14501:18;;:::i;:::-;14530:94;14620:3;14580:38;14612:4;14606:11;14580:38;:::i;:::-;14574:4;14530:94;:::i;:::-;14650:1;14675:2;14670:3;14667:11;14692:1;14687:616;;;;15347:1;15364:3;15361:93;;;-1:-1:-1;15420:19:1;;;15407:33;15361:93;-1:-1:-1;;14312:1:1;14308:11;;;14304:24;14300:29;14290:40;14336:1;14332:11;;;14287:57;15467:78;;14660:895;;14687:616;13581:1;13574:14;;;13618:4;13605:18;;-1:-1:-1;;14723:17:1;;;14824:9;14846:229;14860:7;14857:1;14854:14;14846:229;;;14949:19;;;14936:33;14921:49;;15056:4;15041:20;;;;15009:1;14997:14;;;;14876:12;14846:229;;;14850:3;15103;15094:7;15091:16;15088:159;;;15227:1;15223:6;15217:3;15211;15208:1;15204:11;15200:21;15196:34;15192:39;15179:9;15174:3;15170:19;15157:33;15153:79;15145:6;15138:95;15088:159;;;15290:1;15284:3;15281:1;15277:11;15273:19;15267:4;15260:33;14660:895;;14355:1206;;;:::o;16629:398::-;16831:2;16813:21;;;16870:2;16850:18;;;16843:30;16909:34;16904:2;16889:18;;16882:62;-1:-1:-1;;;16975:2:1;16960:18;;16953:32;17017:3;17002:19;;16629:398::o;17032:127::-;17093:10;17088:3;17084:20;17081:1;17074:31;17124:4;17121:1;17114:15;17148:4;17145:1;17138:15;18156:1020;18332:3;18361:1;18394:6;18388:13;18424:36;18450:9;18424:36;:::i;:::-;18479:1;18496:18;;;18523:133;;;;18670:1;18665:356;;;;18489:532;;18523:133;-1:-1:-1;;18556:24:1;;18544:37;;18629:14;;18622:22;18610:35;;18601:45;;;-1:-1:-1;18523:133:1;;18665:356;18696:6;18693:1;18686:17;18726:4;18771:2;18768:1;18758:16;18796:1;18810:165;18824:6;18821:1;18818:13;18810:165;;;18902:14;;18889:11;;;18882:35;18945:16;;;;18839:10;;18810:165;;;18814:3;;;19004:6;18999:3;18995:16;18988:23;;18489:532;;;;;19052:6;19046:13;19068:68;19127:8;19122:3;19115:4;19107:6;19103:17;19068:68;:::i;:::-;19152:18;;18156:1020;-1:-1:-1;;;;18156:1020:1:o;20377:245::-;20444:6;20497:2;20485:9;20476:7;20472:23;20468:32;20465:52;;;20513:1;20510;20503:12;20465:52;20545:9;20539:16;20564:28;20586:5;20564:28;:::i;21392:112::-;21424:1;21450;21440:35;;21455:18;;:::i;:::-;-1:-1:-1;21489:9:1;;21392:112::o;21509:489::-;-1:-1:-1;;;;;21778:15:1;;;21760:34;;21830:15;;21825:2;21810:18;;21803:43;21877:2;21862:18;;21855:34;;;21925:3;21920:2;21905:18;;21898:31;;;21703:4;;21946:46;;21972:19;;21964:6;21946:46;:::i;:::-;21938:54;21509:489;-1:-1:-1;;;;;;21509:489:1:o;22003:249::-;22072:6;22125:2;22113:9;22104:7;22100:23;22096:32;22093:52;;;22141:1;22138;22131:12;22093:52;22173:9;22167:16;22192:30;22216:5;22192:30;:::i

Swarm Source

ipfs://25e8170a00c74ddfbb751b2050ab79879b4bde2c3a51ec158e6dff44817a78e0
Loading...
Loading
Loading...
Loading
[ 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.