ETH Price: $3,523.80 (+0.37%)
Gas: 2 Gwei

Token

Crypto Hates SBF (CHS)
 

Overview

Max Total Supply

266 CHS

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
megget.eth
Balance
1 CHS
0x3fc2ca5d9629f2826c8fca8667e1c74dae3f76d4
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:
CryptoHatesSBF

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-13
*/

// File: operator-filter-registry/src/IOperatorFilterRegistry.sol


pragma solidity ^0.8.13;

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 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: operator-filter-registry/src/OperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        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(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

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

// File: operator-filter-registry/src/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

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

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: 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: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



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

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

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

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

// File: contracts/CryptoHatesSBF.sol

pragma solidity >=0.8.9 <0.9.0;





contract CryptoHatesSBF is ERC721AQueryable, Ownable, DefaultOperatorFilterer {
  using Strings for uint256;

  uint256 public EXTRA_MINT_PRICE = 0.002 ether;
  uint256 public MAX_SUPPLY = 1111;
  uint256 public MAX_PER = 10;

  string uriPrefix = "https://bafybeiabfzz5cdhgi7l6nfjvakiez76ncluksddmf457bkd2ekhvw4leuu.ipfs.nftstorage.link/";

  bool public paused = true;

  mapping(address => uint256) private _freeMintedCount;

  constructor() ERC721A("Crypto Hates SBF", "CHS") {}

  function freeMint() public {
      require(!paused, "Minting Paused");

      uint256 _totalSupply = totalSupply();

      require(_totalSupply + 1 < MAX_SUPPLY + 1, "SOLD OUT");

      uint256 freeMintCount = _freeMintedCount[msg.sender];

      _freeMintedCount[msg.sender] = 1;
      require(freeMintCount < 1, "Claimed");

      _mint(msg.sender, 1);
    
  }

  function paidMint(uint256 _mintAmount) external payable {
      require(!paused, "Minting Paused");
      uint256 _totalSupply = totalSupply();

      require(_totalSupply + _mintAmount < MAX_SUPPLY + 1, "SOLD OUT");
      require(_mintAmount < MAX_PER + 1, "Max is 10");
      require(msg.value >= _mintAmount * EXTRA_MINT_PRICE,"INCORRECT ETH AMOUNT");
      _mint(msg.sender, _mintAmount);
  }

  function devMint(uint256 _mintAmount, address _receiver) public onlyOwner {
    _safeMint(_receiver, _mintAmount);
  }

  function freeMintedCount(address owner) external view returns (uint256) {
    return _freeMintedCount[owner];
  }

  function _startTokenId() internal pure override returns (uint256) {
    return 1;
  }
  
  function tokenURI(uint256 _tokenId) public view virtual override(ERC721A, IERC721A) returns (string memory) {
    require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token');


    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json"))
        : '';
  }

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

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
  }
  
  function transferFrom(address from, address to, uint256 tokenId) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) {
    super.transferFrom(from, to, tokenId);
  }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","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":"EXTRA_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"paidMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266071afd498d0000600955610457600a55600a600b556040518060800160405280605981526020016200458560599139600c90805190602001906200004b92919062000436565b506001600d60006101000a81548160ff0219169083151502179055503480156200007457600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601081526020017f43727970746f20486174657320534246000000000000000000000000000000008152506040518060400160405280600381526020017f434853000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200011092919062000436565b5080600390805190602001906200012992919062000436565b506200013a6200035f60201b60201c565b600081905550505062000162620001566200036860201b60201c565b6200037060201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003575780156200021d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001e39291906200052b565b600060405180830381600087803b158015620001fe57600080fd5b505af115801562000213573d6000803e3d6000fd5b5050505062000356565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002d7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029d9291906200052b565b600060405180830381600087803b158015620002b857600080fd5b505af1158015620002cd573d6000803e3d6000fd5b5050505062000355565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000320919062000558565b600060405180830381600087803b1580156200033b57600080fd5b505af115801562000350573d6000803e3d6000fd5b505050505b5b5b5050620005d9565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200044490620005a4565b90600052602060002090601f016020900481019282620004685760008555620004b4565b82601f106200048357805160ff1916838001178555620004b4565b82800160010185558215620004b4579182015b82811115620004b357825182559160200191906001019062000496565b5b509050620004c39190620004c7565b5090565b5b80821115620004e2576000816000905550600101620004c8565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200051382620004e6565b9050919050565b620005258162000506565b82525050565b60006040820190506200054260008301856200051a565b6200055160208301846200051a565b9392505050565b60006020820190506200056f60008301846200051a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005bd57607f821691505b602082108103620005d357620005d262000575565b5b50919050565b613f9c80620005e96000396000f3fe6080604052600436106101e35760003560e01c806370a082311161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd146106af578063de0a6156146106ec578063e985e9c514610717578063f2fde38b14610754576101e3565b806399a2557a146105f0578063a22cb4651461062d578063b88d4fde14610656578063c23dc68f14610672576101e3565b80638da5cb5b116100d15780638da5cb5b1461053257806395d89b411461055d57806396b04c751461058857806398133235146105b3576101e3565b806370a0823114610478578063715018a6146104b55780637ec4a659146104cc5780638462151c146104f5576101e3565b806332cb6b0c1161017a5780635bbb2177116101495780635bbb2177146103b75780635c975abb146103f45780636352211e1461041f57806365cde7331461045c576101e3565b806332cb6b0c146103425780633ccfd60b1461036d57806342842e0e146103845780635b70ea9f146103a0576101e3565b806316c38b3c116101b657806316c38b3c146102a957806318160ddd146102d257806323b872dd146102fd5780632d1a12f614610319576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612d4f565b61077d565b60405161021c9190612d97565b60405180910390f35b34801561023157600080fd5b5061023a61080f565b6040516102479190612e4b565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612ea3565b6108a1565b6040516102849190612f11565b60405180910390f35b6102a760048036038101906102a29190612f58565b610920565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190612fc4565b610a64565b005b3480156102de57600080fd5b506102e7610a89565b6040516102f49190613000565b60405180910390f35b6103176004803603810190610312919061301b565b610aa0565b005b34801561032557600080fd5b50610340600480360381019061033b919061306e565b610c82565b005b34801561034e57600080fd5b50610357610c98565b6040516103649190613000565b60405180910390f35b34801561037957600080fd5b50610382610c9e565b005b61039e6004803603810190610399919061301b565b610d26565b005b3480156103ac57600080fd5b506103b5610f08565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613113565b61109b565b6040516103eb91906132c3565b60405180910390f35b34801561040057600080fd5b5061040961115e565b6040516104169190612d97565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612ea3565b611171565b6040516104539190612f11565b60405180910390f35b61047660048036038101906104719190612ea3565b611183565b005b34801561048457600080fd5b5061049f600480360381019061049a91906132e5565b6112e8565b6040516104ac9190613000565b60405180910390f35b3480156104c157600080fd5b506104ca6113a0565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190613442565b6113b4565b005b34801561050157600080fd5b5061051c600480360381019061051791906132e5565b6113d6565b6040516105299190613549565b60405180910390f35b34801561053e57600080fd5b50610547611519565b6040516105549190612f11565b60405180910390f35b34801561056957600080fd5b50610572611543565b60405161057f9190612e4b565b60405180910390f35b34801561059457600080fd5b5061059d6115d5565b6040516105aa9190613000565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906132e5565b6115db565b6040516105e79190613000565b60405180910390f35b3480156105fc57600080fd5b506106176004803603810190610612919061356b565b611624565b6040516106249190613549565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f91906135be565b611830565b005b610670600480360381019061066b919061369f565b61193b565b005b34801561067e57600080fd5b5061069960048036038101906106949190612ea3565b611b20565b6040516106a69190613777565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190612ea3565b611b8a565b6040516106e39190612e4b565b60405180910390f35b3480156106f857600080fd5b50610701611c31565b60405161070e9190613000565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190613792565b611c37565b60405161074b9190612d97565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906132e5565b611ccb565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107d857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108085750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461081e90613801565b80601f016020809104026020016040519081016040528092919081815260200182805461084a90613801565b80156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905090565b60006108ac82611d4e565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092b82611171565b90508073ffffffffffffffffffffffffffffffffffffffff1661094c611dad565b73ffffffffffffffffffffffffffffffffffffffff16146109af5761097881610973611dad565b611c37565b6109ae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a6c611db5565b80600d60006101000a81548160ff02191690831515021790555050565b6000610a93611e33565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c70573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b1257610b0d848484611e3c565b610c7c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b5b929190613832565b602060405180830381865afa158015610b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9c9190613870565b8015610c2e57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610bec929190613832565b602060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190613870565b5b610c6f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c669190612f11565b60405180910390fd5b5b610c7b848484611e3c565b5b50505050565b610c8a611db5565b610c94818361215e565b5050565b600a5481565b610ca6611db5565b6000610cb0611519565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cd3906138ce565b60006040518083038185875af1925050503d8060008114610d10576040519150601f19603f3d011682016040523d82523d6000602084013e610d15565b606091505b5050905080610d2357600080fd5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ef6573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d9857610d9384848461217c565b610f02565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610de1929190613832565b602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190613870565b8015610eb457506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e72929190613832565b602060405180830381865afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb39190613870565b5b610ef557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610eec9190612f11565b60405180910390fd5b5b610f0184848461217c565b5b50505050565b600d60009054906101000a900460ff1615610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f9061392f565b60405180910390fd5b6000610f62610a89565b90506001600a54610f73919061397e565b600182610f80919061397e565b10610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790613a20565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001811061108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613a8c565b60405180910390fd5b61109733600161219c565b5050565b6060600083839050905060008167ffffffffffffffff8111156110c1576110c0613317565b5b6040519080825280602002602001820160405280156110fa57816020015b6110e7612bf1565b8152602001906001900390816110df5790505b50905060005b8281146111525761112986868381811061111d5761111c613aac565b5b90506020020135611b20565b82828151811061113c5761113b613aac565b5b6020026020010181905250806001019050611100565b50809250505092915050565b600d60009054906101000a900460ff1681565b600061117c82612357565b9050919050565b600d60009054906101000a900460ff16156111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca9061392f565b60405180910390fd5b60006111dd610a89565b90506001600a546111ee919061397e565b82826111fa919061397e565b1061123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123190613a20565b60405180910390fd5b6001600b54611249919061397e565b821061128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613b27565b60405180910390fd5b600954826112989190613b47565b3410156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613bed565b60405180910390fd5b6112e4338361219c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113a8611db5565b6113b26000612423565b565b6113bc611db5565b80600c90805190602001906113d2929190612c40565b5050565b606060008060006113e6856112e8565b905060008167ffffffffffffffff81111561140457611403613317565b5b6040519080825280602002602001820160405280156114325781602001602082028036833780820191505090505b50905061143d612bf1565b6000611447611e33565b90505b83861461150b5761145a816124e9565b9150816040015161150057600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114a557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114ff57808387806001019850815181106114f2576114f1613aac565b5b6020026020010181815250505b5b80600101905061144a565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461155290613801565b80601f016020809104026020016040519081016040528092919081815260200182805461157e90613801565b80156115cb5780601f106115a0576101008083540402835291602001916115cb565b820191906000526020600020905b8154815290600101906020018083116115ae57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606081831061165f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061166a612514565b9050611674611e33565b85101561168657611683611e33565b94505b80841115611692578093505b600061169d876112e8565b9050848610156116c05760008686039050818110156116ba578091505b506116c5565b600090505b60008167ffffffffffffffff8111156116e1576116e0613317565b5b60405190808252806020026020018201604052801561170f5781602001602082028036833780820191505090505b509050600082036117265780945050505050611829565b600061173188611b20565b90506000816040015161174657816000015190505b60008990505b88811415801561175c5750848714155b1561181b5761176a816124e9565b9250826040015161181057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146117b557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180f578084888060010199508151811061180257611801613aac565b5b6020026020010181815250505b5b80600101905061174c565b508583528296505050505050505b9392505050565b806007600061183d611dad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ea611dad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192f9190612d97565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b0c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ae576119a98585858561251d565b611b19565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119f7929190613832565b602060405180830381865afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190613870565b8015611aca57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a88929190613832565b602060405180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac99190613870565b5b611b0b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b029190612f11565b60405180910390fd5b5b611b188585858561251d565b5b5050505050565b611b28612bf1565b611b30612bf1565b611b38611e33565b831080611b4c5750611b48612514565b8310155b15611b5a5780915050611b85565b611b63836124e9565b9050806040015115611b785780915050611b85565b611b8183612590565b9150505b919050565b6060611b9582611d4e565b611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90613c7f565b60405180910390fd5b6000611bde6125b0565b90506000815111611bfe5760405180602001604052806000815250611c29565b80611c0884612642565b604051602001611c19929190613d27565b6040516020818303038152906040525b915050919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cd3611db5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613dc8565b60405180910390fd5b611d4b81612423565b50565b600081611d59611e33565b11158015611d68575060005482105b8015611da6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611dbd612710565b73ffffffffffffffffffffffffffffffffffffffff16611ddb611519565b73ffffffffffffffffffffffffffffffffffffffff1614611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613e34565b60405180910390fd5b565b60006001905090565b6000611e4782612357565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611eae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611eba84612718565b91509150611ed08187611ecb611dad565b61273f565b611f1c57611ee586611ee0611dad565b611c37565b611f1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f82576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f8f8686866001612783565b8015611f9a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061206885612044888887612789565b7c0200000000000000000000000000000000000000000000000000000000176127b1565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120ee57600060018501905060006004600083815260200190815260200160002054036120ec5760005481146120eb578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215686868660016127dc565b505050505050565b6121788282604051806020016040528060008152506127e2565b5050565b6121978383836040518060200160405280600081525061193b565b505050565b600080549050600082036121dc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e96000848385612783565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612260836122516000866000612789565b61225a8561287f565b176127b1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461230157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506122c6565b506000820361233c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061235260008483856127dc565b505050565b60008082905080612366611e33565b116123ec576000548110156123eb5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036123e9575b600081036123df5760046000836001900393508381526020019081526020016000205490506123b5565b809250505061241e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124f1612bf1565b61250d600460008481526020019081526020016000205461288f565b9050919050565b60008054905090565b612528848484610aa0565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258a5761255384848484612945565b612589576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612598612bf1565b6125a96125a483612357565b61288f565b9050919050565b6060600c80546125bf90613801565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb90613801565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b5050505050905090565b60606000600161265184612a95565b01905060008167ffffffffffffffff8111156126705761266f613317565b5b6040519080825280601f01601f1916602001820160405280156126a25781602001600182028036833780820191505090505b509050600082602001820190505b600115612705578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f9576126f8613e54565b5b049450600085036126b0575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127a0868684612be8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127ec838361219c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461287a57600080549050600083820390505b61282c6000868380600101945086612945565b612862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061281957816000541461287757600080fd5b50505b505050565b60006001821460e11b9050919050565b612897612bf1565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261296b611dad565b8786866040518563ffffffff1660e01b815260040161298d9493929190613ed8565b6020604051808303816000875af19250505080156129c957506040513d601f19601f820116820180604052508101906129c69190613f39565b60015b612a42573d80600081146129f9576040519150601f19603f3d011682016040523d82523d6000602084013e6129fe565b606091505b506000815103612a3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612af3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ae957612ae8613e54565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b30576d04ee2d6d415b85acef81000000008381612b2657612b25613e54565b5b0492506020810190505b662386f26fc100008310612b5f57662386f26fc100008381612b5557612b54613e54565b5b0492506010810190505b6305f5e1008310612b88576305f5e1008381612b7e57612b7d613e54565b5b0492506008810190505b6127108310612bad576127108381612ba357612ba2613e54565b5b0492506004810190505b60648310612bd05760648381612bc657612bc5613e54565b5b0492506002810190505b600a8310612bdf576001810190505b80915050919050565b60009392505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054612c4c90613801565b90600052602060002090601f016020900481019282612c6e5760008555612cb5565b82601f10612c8757805160ff1916838001178555612cb5565b82800160010185558215612cb5579182015b82811115612cb4578251825591602001919060010190612c99565b5b509050612cc29190612cc6565b5090565b5b80821115612cdf576000816000905550600101612cc7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d2c81612cf7565b8114612d3757600080fd5b50565b600081359050612d4981612d23565b92915050565b600060208284031215612d6557612d64612ced565b5b6000612d7384828501612d3a565b91505092915050565b60008115159050919050565b612d9181612d7c565b82525050565b6000602082019050612dac6000830184612d88565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dec578082015181840152602081019050612dd1565b83811115612dfb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e1d82612db2565b612e278185612dbd565b9350612e37818560208601612dce565b612e4081612e01565b840191505092915050565b60006020820190508181036000830152612e658184612e12565b905092915050565b6000819050919050565b612e8081612e6d565b8114612e8b57600080fd5b50565b600081359050612e9d81612e77565b92915050565b600060208284031215612eb957612eb8612ced565b5b6000612ec784828501612e8e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612efb82612ed0565b9050919050565b612f0b81612ef0565b82525050565b6000602082019050612f266000830184612f02565b92915050565b612f3581612ef0565b8114612f4057600080fd5b50565b600081359050612f5281612f2c565b92915050565b60008060408385031215612f6f57612f6e612ced565b5b6000612f7d85828601612f43565b9250506020612f8e85828601612e8e565b9150509250929050565b612fa181612d7c565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612ced565b5b6000612fe884828501612faf565b91505092915050565b612ffa81612e6d565b82525050565b60006020820190506130156000830184612ff1565b92915050565b60008060006060848603121561303457613033612ced565b5b600061304286828701612f43565b935050602061305386828701612f43565b925050604061306486828701612e8e565b9150509250925092565b6000806040838503121561308557613084612ced565b5b600061309385828601612e8e565b92505060206130a485828601612f43565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130d3576130d26130ae565b5b8235905067ffffffffffffffff8111156130f0576130ef6130b3565b5b60208301915083602082028301111561310c5761310b6130b8565b5b9250929050565b6000806020838503121561312a57613129612ced565b5b600083013567ffffffffffffffff81111561314857613147612cf2565b5b613154858286016130bd565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61319581612ef0565b82525050565b600067ffffffffffffffff82169050919050565b6131b88161319b565b82525050565b6131c781612d7c565b82525050565b600062ffffff82169050919050565b6131e5816131cd565b82525050565b608082016000820151613201600085018261318c565b50602082015161321460208501826131af565b50604082015161322760408501826131be565b50606082015161323a60608501826131dc565b50505050565b600061324c83836131eb565b60808301905092915050565b6000602082019050919050565b600061327082613160565b61327a818561316b565b93506132858361317c565b8060005b838110156132b657815161329d8882613240565b97506132a883613258565b925050600181019050613289565b5085935050505092915050565b600060208201905081810360008301526132dd8184613265565b905092915050565b6000602082840312156132fb576132fa612ced565b5b600061330984828501612f43565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334f82612e01565b810181811067ffffffffffffffff8211171561336e5761336d613317565b5b80604052505050565b6000613381612ce3565b905061338d8282613346565b919050565b600067ffffffffffffffff8211156133ad576133ac613317565b5b6133b682612e01565b9050602081019050919050565b82818337600083830152505050565b60006133e56133e084613392565b613377565b90508281526020810184848401111561340157613400613312565b5b61340c8482856133c3565b509392505050565b600082601f830112613429576134286130ae565b5b81356134398482602086016133d2565b91505092915050565b60006020828403121561345857613457612ced565b5b600082013567ffffffffffffffff81111561347657613475612cf2565b5b61348284828501613414565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134c081612e6d565b82525050565b60006134d283836134b7565b60208301905092915050565b6000602082019050919050565b60006134f68261348b565b6135008185613496565b935061350b836134a7565b8060005b8381101561353c57815161352388826134c6565b975061352e836134de565b92505060018101905061350f565b5085935050505092915050565b6000602082019050818103600083015261356381846134eb565b905092915050565b60008060006060848603121561358457613583612ced565b5b600061359286828701612f43565b93505060206135a386828701612e8e565b92505060406135b486828701612e8e565b9150509250925092565b600080604083850312156135d5576135d4612ced565b5b60006135e385828601612f43565b92505060206135f485828601612faf565b9150509250929050565b600067ffffffffffffffff82111561361957613618613317565b5b61362282612e01565b9050602081019050919050565b600061364261363d846135fe565b613377565b90508281526020810184848401111561365e5761365d613312565b5b6136698482856133c3565b509392505050565b600082601f830112613686576136856130ae565b5b813561369684826020860161362f565b91505092915050565b600080600080608085870312156136b9576136b8612ced565b5b60006136c787828801612f43565b94505060206136d887828801612f43565b93505060406136e987828801612e8e565b925050606085013567ffffffffffffffff81111561370a57613709612cf2565b5b61371687828801613671565b91505092959194509250565b608082016000820151613738600085018261318c565b50602082015161374b60208501826131af565b50604082015161375e60408501826131be565b50606082015161377160608501826131dc565b50505050565b600060808201905061378c6000830184613722565b92915050565b600080604083850312156137a9576137a8612ced565b5b60006137b785828601612f43565b92505060206137c885828601612f43565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381957607f821691505b60208210810361382c5761382b6137d2565b5b50919050565b60006040820190506138476000830185612f02565b6138546020830184612f02565b9392505050565b60008151905061386a81612f98565b92915050565b60006020828403121561388657613885612ced565b5b60006138948482850161385b565b91505092915050565b600081905092915050565b50565b60006138b860008361389d565b91506138c3826138a8565b600082019050919050565b60006138d9826138ab565b9150819050919050565b7f4d696e74696e6720506175736564000000000000000000000000000000000000600082015250565b6000613919600e83612dbd565b9150613924826138e3565b602082019050919050565b600060208201905081810360008301526139488161390c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061398982612e6d565b915061399483612e6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c9576139c861394f565b5b828201905092915050565b7f534f4c44204f5554000000000000000000000000000000000000000000000000600082015250565b6000613a0a600883612dbd565b9150613a15826139d4565b602082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b7f436c61696d656400000000000000000000000000000000000000000000000000600082015250565b6000613a76600783612dbd565b9150613a8182613a40565b602082019050919050565b60006020820190508181036000830152613aa581613a69565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d61782069732031300000000000000000000000000000000000000000000000600082015250565b6000613b11600983612dbd565b9150613b1c82613adb565b602082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b6000613b5282612e6d565b9150613b5d83612e6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b9657613b9561394f565b5b828202905092915050565b7f494e434f52524543542045544820414d4f554e54000000000000000000000000600082015250565b6000613bd7601483612dbd565b9150613be282613ba1565b602082019050919050565b60006020820190508181036000830152613c0681613bca565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c69602f83612dbd565b9150613c7482613c0d565b604082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b600081905092915050565b6000613cb582612db2565b613cbf8185613c9f565b9350613ccf818560208601612dce565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d11600583613c9f565b9150613d1c82613cdb565b600582019050919050565b6000613d338285613caa565b9150613d3f8284613caa565b9150613d4a82613d04565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db2602683612dbd565b9150613dbd82613d56565b604082019050919050565b60006020820190508181036000830152613de181613da5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e1e602083612dbd565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613eaa82613e83565b613eb48185613e8e565b9350613ec4818560208601612dce565b613ecd81612e01565b840191505092915050565b6000608082019050613eed6000830187612f02565b613efa6020830186612f02565b613f076040830185612ff1565b8181036060830152613f198184613e9f565b905095945050505050565b600081519050613f3381612d23565b92915050565b600060208284031215613f4f57613f4e612ced565b5b6000613f5d84828501613f24565b9150509291505056fea26469706673582212206eceac58d680b7ad61429d0f1c0936db36cd8f6629cbd1a9a668bf3e2ac0be9b64736f6c634300080e003368747470733a2f2f626166796265696162667a7a356364686769376c366e666a76616b69657a37366e636c756b7364646d66343537626b6432656b687677346c6575752e697066732e6e667473746f726167652e6c696e6b2f

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806370a082311161010257806399a2557a11610095578063c87b56dd11610064578063c87b56dd146106af578063de0a6156146106ec578063e985e9c514610717578063f2fde38b14610754576101e3565b806399a2557a146105f0578063a22cb4651461062d578063b88d4fde14610656578063c23dc68f14610672576101e3565b80638da5cb5b116100d15780638da5cb5b1461053257806395d89b411461055d57806396b04c751461058857806398133235146105b3576101e3565b806370a0823114610478578063715018a6146104b55780637ec4a659146104cc5780638462151c146104f5576101e3565b806332cb6b0c1161017a5780635bbb2177116101495780635bbb2177146103b75780635c975abb146103f45780636352211e1461041f57806365cde7331461045c576101e3565b806332cb6b0c146103425780633ccfd60b1461036d57806342842e0e146103845780635b70ea9f146103a0576101e3565b806316c38b3c116101b657806316c38b3c146102a957806318160ddd146102d257806323b872dd146102fd5780632d1a12f614610319576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612d4f565b61077d565b60405161021c9190612d97565b60405180910390f35b34801561023157600080fd5b5061023a61080f565b6040516102479190612e4b565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190612ea3565b6108a1565b6040516102849190612f11565b60405180910390f35b6102a760048036038101906102a29190612f58565b610920565b005b3480156102b557600080fd5b506102d060048036038101906102cb9190612fc4565b610a64565b005b3480156102de57600080fd5b506102e7610a89565b6040516102f49190613000565b60405180910390f35b6103176004803603810190610312919061301b565b610aa0565b005b34801561032557600080fd5b50610340600480360381019061033b919061306e565b610c82565b005b34801561034e57600080fd5b50610357610c98565b6040516103649190613000565b60405180910390f35b34801561037957600080fd5b50610382610c9e565b005b61039e6004803603810190610399919061301b565b610d26565b005b3480156103ac57600080fd5b506103b5610f08565b005b3480156103c357600080fd5b506103de60048036038101906103d99190613113565b61109b565b6040516103eb91906132c3565b60405180910390f35b34801561040057600080fd5b5061040961115e565b6040516104169190612d97565b60405180910390f35b34801561042b57600080fd5b5061044660048036038101906104419190612ea3565b611171565b6040516104539190612f11565b60405180910390f35b61047660048036038101906104719190612ea3565b611183565b005b34801561048457600080fd5b5061049f600480360381019061049a91906132e5565b6112e8565b6040516104ac9190613000565b60405180910390f35b3480156104c157600080fd5b506104ca6113a0565b005b3480156104d857600080fd5b506104f360048036038101906104ee9190613442565b6113b4565b005b34801561050157600080fd5b5061051c600480360381019061051791906132e5565b6113d6565b6040516105299190613549565b60405180910390f35b34801561053e57600080fd5b50610547611519565b6040516105549190612f11565b60405180910390f35b34801561056957600080fd5b50610572611543565b60405161057f9190612e4b565b60405180910390f35b34801561059457600080fd5b5061059d6115d5565b6040516105aa9190613000565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d591906132e5565b6115db565b6040516105e79190613000565b60405180910390f35b3480156105fc57600080fd5b506106176004803603810190610612919061356b565b611624565b6040516106249190613549565b60405180910390f35b34801561063957600080fd5b50610654600480360381019061064f91906135be565b611830565b005b610670600480360381019061066b919061369f565b61193b565b005b34801561067e57600080fd5b5061069960048036038101906106949190612ea3565b611b20565b6040516106a69190613777565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d19190612ea3565b611b8a565b6040516106e39190612e4b565b60405180910390f35b3480156106f857600080fd5b50610701611c31565b60405161070e9190613000565b60405180910390f35b34801561072357600080fd5b5061073e60048036038101906107399190613792565b611c37565b60405161074b9190612d97565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906132e5565b611ccb565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107d857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108085750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461081e90613801565b80601f016020809104026020016040519081016040528092919081815260200182805461084a90613801565b80156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905090565b60006108ac82611d4e565b6108e2576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092b82611171565b90508073ffffffffffffffffffffffffffffffffffffffff1661094c611dad565b73ffffffffffffffffffffffffffffffffffffffff16146109af5761097881610973611dad565b611c37565b6109ae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a6c611db5565b80600d60006101000a81548160ff02191690831515021790555050565b6000610a93611e33565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c70573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b1257610b0d848484611e3c565b610c7c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b5b929190613832565b602060405180830381865afa158015610b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9c9190613870565b8015610c2e57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610bec929190613832565b602060405180830381865afa158015610c09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2d9190613870565b5b610c6f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c669190612f11565b60405180910390fd5b5b610c7b848484611e3c565b5b50505050565b610c8a611db5565b610c94818361215e565b5050565b600a5481565b610ca6611db5565b6000610cb0611519565b73ffffffffffffffffffffffffffffffffffffffff1647604051610cd3906138ce565b60006040518083038185875af1925050503d8060008114610d10576040519150601f19603f3d011682016040523d82523d6000602084013e610d15565b606091505b5050905080610d2357600080fd5b50565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ef6573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d9857610d9384848461217c565b610f02565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610de1929190613832565b602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190613870565b8015610eb457506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e72929190613832565b602060405180830381865afa158015610e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb39190613870565b5b610ef557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610eec9190612f11565b60405180910390fd5b5b610f0184848461217c565b5b50505050565b600d60009054906101000a900460ff1615610f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4f9061392f565b60405180910390fd5b6000610f62610a89565b90506001600a54610f73919061397e565b600182610f80919061397e565b10610fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb790613a20565b60405180910390fd5b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001811061108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613a8c565b60405180910390fd5b61109733600161219c565b5050565b6060600083839050905060008167ffffffffffffffff8111156110c1576110c0613317565b5b6040519080825280602002602001820160405280156110fa57816020015b6110e7612bf1565b8152602001906001900390816110df5790505b50905060005b8281146111525761112986868381811061111d5761111c613aac565b5b90506020020135611b20565b82828151811061113c5761113b613aac565b5b6020026020010181905250806001019050611100565b50809250505092915050565b600d60009054906101000a900460ff1681565b600061117c82612357565b9050919050565b600d60009054906101000a900460ff16156111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca9061392f565b60405180910390fd5b60006111dd610a89565b90506001600a546111ee919061397e565b82826111fa919061397e565b1061123a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123190613a20565b60405180910390fd5b6001600b54611249919061397e565b821061128a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128190613b27565b60405180910390fd5b600954826112989190613b47565b3410156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d190613bed565b60405180910390fd5b6112e4338361219c565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361134f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6113a8611db5565b6113b26000612423565b565b6113bc611db5565b80600c90805190602001906113d2929190612c40565b5050565b606060008060006113e6856112e8565b905060008167ffffffffffffffff81111561140457611403613317565b5b6040519080825280602002602001820160405280156114325781602001602082028036833780820191505090505b50905061143d612bf1565b6000611447611e33565b90505b83861461150b5761145a816124e9565b9150816040015161150057600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114a557816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114ff57808387806001019850815181106114f2576114f1613aac565b5b6020026020010181815250505b5b80600101905061144a565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461155290613801565b80601f016020809104026020016040519081016040528092919081815260200182805461157e90613801565b80156115cb5780601f106115a0576101008083540402835291602001916115cb565b820191906000526020600020905b8154815290600101906020018083116115ae57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606081831061165f576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061166a612514565b9050611674611e33565b85101561168657611683611e33565b94505b80841115611692578093505b600061169d876112e8565b9050848610156116c05760008686039050818110156116ba578091505b506116c5565b600090505b60008167ffffffffffffffff8111156116e1576116e0613317565b5b60405190808252806020026020018201604052801561170f5781602001602082028036833780820191505090505b509050600082036117265780945050505050611829565b600061173188611b20565b90506000816040015161174657816000015190505b60008990505b88811415801561175c5750848714155b1561181b5761176a816124e9565b9250826040015161181057600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146117b557826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180f578084888060010199508151811061180257611801613aac565b5b6020026020010181815250505b5b80600101905061174c565b508583528296505050505050505b9392505050565b806007600061183d611dad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118ea611dad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161192f9190612d97565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b0c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ae576119a98585858561251d565b611b19565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119f7929190613832565b602060405180830381865afa158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a389190613870565b8015611aca57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a88929190613832565b602060405180830381865afa158015611aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac99190613870565b5b611b0b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b029190612f11565b60405180910390fd5b5b611b188585858561251d565b5b5050505050565b611b28612bf1565b611b30612bf1565b611b38611e33565b831080611b4c5750611b48612514565b8310155b15611b5a5780915050611b85565b611b63836124e9565b9050806040015115611b785780915050611b85565b611b8183612590565b9150505b919050565b6060611b9582611d4e565b611bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcb90613c7f565b60405180910390fd5b6000611bde6125b0565b90506000815111611bfe5760405180602001604052806000815250611c29565b80611c0884612642565b604051602001611c19929190613d27565b6040516020818303038152906040525b915050919050565b600b5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611cd3611db5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3990613dc8565b60405180910390fd5b611d4b81612423565b50565b600081611d59611e33565b11158015611d68575060005482105b8015611da6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b611dbd612710565b73ffffffffffffffffffffffffffffffffffffffff16611ddb611519565b73ffffffffffffffffffffffffffffffffffffffff1614611e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2890613e34565b60405180910390fd5b565b60006001905090565b6000611e4782612357565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611eae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611eba84612718565b91509150611ed08187611ecb611dad565b61273f565b611f1c57611ee586611ee0611dad565b611c37565b611f1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f82576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f8f8686866001612783565b8015611f9a57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061206885612044888887612789565b7c0200000000000000000000000000000000000000000000000000000000176127b1565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036120ee57600060018501905060006004600083815260200190815260200160002054036120ec5760005481146120eb578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461215686868660016127dc565b505050505050565b6121788282604051806020016040528060008152506127e2565b5050565b6121978383836040518060200160405280600081525061193b565b505050565b600080549050600082036121dc576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121e96000848385612783565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612260836122516000866000612789565b61225a8561287f565b176127b1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461230157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506122c6565b506000820361233c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061235260008483856127dc565b505050565b60008082905080612366611e33565b116123ec576000548110156123eb5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036123e9575b600081036123df5760046000836001900393508381526020019081526020016000205490506123b5565b809250505061241e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124f1612bf1565b61250d600460008481526020019081526020016000205461288f565b9050919050565b60008054905090565b612528848484610aa0565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461258a5761255384848484612945565b612589576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612598612bf1565b6125a96125a483612357565b61288f565b9050919050565b6060600c80546125bf90613801565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb90613801565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b5050505050905090565b60606000600161265184612a95565b01905060008167ffffffffffffffff8111156126705761266f613317565b5b6040519080825280601f01601f1916602001820160405280156126a25781602001600182028036833780820191505090505b509050600082602001820190505b600115612705578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816126f9576126f8613e54565b5b049450600085036126b0575b819350505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127a0868684612be8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6127ec838361219c565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461287a57600080549050600083820390505b61282c6000868380600101945086612945565b612862576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061281957816000541461287757600080fd5b50505b505050565b60006001821460e11b9050919050565b612897612bf1565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261296b611dad565b8786866040518563ffffffff1660e01b815260040161298d9493929190613ed8565b6020604051808303816000875af19250505080156129c957506040513d601f19601f820116820180604052508101906129c69190613f39565b60015b612a42573d80600081146129f9576040519150601f19603f3d011682016040523d82523d6000602084013e6129fe565b606091505b506000815103612a3a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612af3577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ae957612ae8613e54565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612b30576d04ee2d6d415b85acef81000000008381612b2657612b25613e54565b5b0492506020810190505b662386f26fc100008310612b5f57662386f26fc100008381612b5557612b54613e54565b5b0492506010810190505b6305f5e1008310612b88576305f5e1008381612b7e57612b7d613e54565b5b0492506008810190505b6127108310612bad576127108381612ba357612ba2613e54565b5b0492506004810190505b60648310612bd05760648381612bc657612bc5613e54565b5b0492506002810190505b600a8310612bdf576001810190505b80915050919050565b60009392505050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b828054612c4c90613801565b90600052602060002090601f016020900481019282612c6e5760008555612cb5565b82601f10612c8757805160ff1916838001178555612cb5565b82800160010185558215612cb5579182015b82811115612cb4578251825591602001919060010190612c99565b5b509050612cc29190612cc6565b5090565b5b80821115612cdf576000816000905550600101612cc7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d2c81612cf7565b8114612d3757600080fd5b50565b600081359050612d4981612d23565b92915050565b600060208284031215612d6557612d64612ced565b5b6000612d7384828501612d3a565b91505092915050565b60008115159050919050565b612d9181612d7c565b82525050565b6000602082019050612dac6000830184612d88565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612dec578082015181840152602081019050612dd1565b83811115612dfb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e1d82612db2565b612e278185612dbd565b9350612e37818560208601612dce565b612e4081612e01565b840191505092915050565b60006020820190508181036000830152612e658184612e12565b905092915050565b6000819050919050565b612e8081612e6d565b8114612e8b57600080fd5b50565b600081359050612e9d81612e77565b92915050565b600060208284031215612eb957612eb8612ced565b5b6000612ec784828501612e8e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612efb82612ed0565b9050919050565b612f0b81612ef0565b82525050565b6000602082019050612f266000830184612f02565b92915050565b612f3581612ef0565b8114612f4057600080fd5b50565b600081359050612f5281612f2c565b92915050565b60008060408385031215612f6f57612f6e612ced565b5b6000612f7d85828601612f43565b9250506020612f8e85828601612e8e565b9150509250929050565b612fa181612d7c565b8114612fac57600080fd5b50565b600081359050612fbe81612f98565b92915050565b600060208284031215612fda57612fd9612ced565b5b6000612fe884828501612faf565b91505092915050565b612ffa81612e6d565b82525050565b60006020820190506130156000830184612ff1565b92915050565b60008060006060848603121561303457613033612ced565b5b600061304286828701612f43565b935050602061305386828701612f43565b925050604061306486828701612e8e565b9150509250925092565b6000806040838503121561308557613084612ced565b5b600061309385828601612e8e565b92505060206130a485828601612f43565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126130d3576130d26130ae565b5b8235905067ffffffffffffffff8111156130f0576130ef6130b3565b5b60208301915083602082028301111561310c5761310b6130b8565b5b9250929050565b6000806020838503121561312a57613129612ced565b5b600083013567ffffffffffffffff81111561314857613147612cf2565b5b613154858286016130bd565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61319581612ef0565b82525050565b600067ffffffffffffffff82169050919050565b6131b88161319b565b82525050565b6131c781612d7c565b82525050565b600062ffffff82169050919050565b6131e5816131cd565b82525050565b608082016000820151613201600085018261318c565b50602082015161321460208501826131af565b50604082015161322760408501826131be565b50606082015161323a60608501826131dc565b50505050565b600061324c83836131eb565b60808301905092915050565b6000602082019050919050565b600061327082613160565b61327a818561316b565b93506132858361317c565b8060005b838110156132b657815161329d8882613240565b97506132a883613258565b925050600181019050613289565b5085935050505092915050565b600060208201905081810360008301526132dd8184613265565b905092915050565b6000602082840312156132fb576132fa612ced565b5b600061330984828501612f43565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334f82612e01565b810181811067ffffffffffffffff8211171561336e5761336d613317565b5b80604052505050565b6000613381612ce3565b905061338d8282613346565b919050565b600067ffffffffffffffff8211156133ad576133ac613317565b5b6133b682612e01565b9050602081019050919050565b82818337600083830152505050565b60006133e56133e084613392565b613377565b90508281526020810184848401111561340157613400613312565b5b61340c8482856133c3565b509392505050565b600082601f830112613429576134286130ae565b5b81356134398482602086016133d2565b91505092915050565b60006020828403121561345857613457612ced565b5b600082013567ffffffffffffffff81111561347657613475612cf2565b5b61348284828501613414565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6134c081612e6d565b82525050565b60006134d283836134b7565b60208301905092915050565b6000602082019050919050565b60006134f68261348b565b6135008185613496565b935061350b836134a7565b8060005b8381101561353c57815161352388826134c6565b975061352e836134de565b92505060018101905061350f565b5085935050505092915050565b6000602082019050818103600083015261356381846134eb565b905092915050565b60008060006060848603121561358457613583612ced565b5b600061359286828701612f43565b93505060206135a386828701612e8e565b92505060406135b486828701612e8e565b9150509250925092565b600080604083850312156135d5576135d4612ced565b5b60006135e385828601612f43565b92505060206135f485828601612faf565b9150509250929050565b600067ffffffffffffffff82111561361957613618613317565b5b61362282612e01565b9050602081019050919050565b600061364261363d846135fe565b613377565b90508281526020810184848401111561365e5761365d613312565b5b6136698482856133c3565b509392505050565b600082601f830112613686576136856130ae565b5b813561369684826020860161362f565b91505092915050565b600080600080608085870312156136b9576136b8612ced565b5b60006136c787828801612f43565b94505060206136d887828801612f43565b93505060406136e987828801612e8e565b925050606085013567ffffffffffffffff81111561370a57613709612cf2565b5b61371687828801613671565b91505092959194509250565b608082016000820151613738600085018261318c565b50602082015161374b60208501826131af565b50604082015161375e60408501826131be565b50606082015161377160608501826131dc565b50505050565b600060808201905061378c6000830184613722565b92915050565b600080604083850312156137a9576137a8612ced565b5b60006137b785828601612f43565b92505060206137c885828601612f43565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061381957607f821691505b60208210810361382c5761382b6137d2565b5b50919050565b60006040820190506138476000830185612f02565b6138546020830184612f02565b9392505050565b60008151905061386a81612f98565b92915050565b60006020828403121561388657613885612ced565b5b60006138948482850161385b565b91505092915050565b600081905092915050565b50565b60006138b860008361389d565b91506138c3826138a8565b600082019050919050565b60006138d9826138ab565b9150819050919050565b7f4d696e74696e6720506175736564000000000000000000000000000000000000600082015250565b6000613919600e83612dbd565b9150613924826138e3565b602082019050919050565b600060208201905081810360008301526139488161390c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061398982612e6d565b915061399483612e6d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139c9576139c861394f565b5b828201905092915050565b7f534f4c44204f5554000000000000000000000000000000000000000000000000600082015250565b6000613a0a600883612dbd565b9150613a15826139d4565b602082019050919050565b60006020820190508181036000830152613a39816139fd565b9050919050565b7f436c61696d656400000000000000000000000000000000000000000000000000600082015250565b6000613a76600783612dbd565b9150613a8182613a40565b602082019050919050565b60006020820190508181036000830152613aa581613a69565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4d61782069732031300000000000000000000000000000000000000000000000600082015250565b6000613b11600983612dbd565b9150613b1c82613adb565b602082019050919050565b60006020820190508181036000830152613b4081613b04565b9050919050565b6000613b5282612e6d565b9150613b5d83612e6d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b9657613b9561394f565b5b828202905092915050565b7f494e434f52524543542045544820414d4f554e54000000000000000000000000600082015250565b6000613bd7601483612dbd565b9150613be282613ba1565b602082019050919050565b60006020820190508181036000830152613c0681613bca565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613c69602f83612dbd565b9150613c7482613c0d565b604082019050919050565b60006020820190508181036000830152613c9881613c5c565b9050919050565b600081905092915050565b6000613cb582612db2565b613cbf8185613c9f565b9350613ccf818560208601612dce565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613d11600583613c9f565b9150613d1c82613cdb565b600582019050919050565b6000613d338285613caa565b9150613d3f8284613caa565b9150613d4a82613d04565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db2602683612dbd565b9150613dbd82613d56565b604082019050919050565b60006020820190508181036000830152613de181613da5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e1e602083612dbd565b9150613e2982613de8565b602082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613eaa82613e83565b613eb48185613e8e565b9350613ec4818560208601612dce565b613ecd81612e01565b840191505092915050565b6000608082019050613eed6000830187612f02565b613efa6020830186612f02565b613f076040830185612ff1565b8181036060830152613f198184613e9f565b905095945050505050565b600081519050613f3381612d23565b92915050565b600060208284031215613f4f57613f4e612ced565b5b6000613f5d84828501613f24565b9150509291505056fea26469706673582212206eceac58d680b7ad61429d0f1c0936db36cd8f6629cbd1a9a668bf3e2ac0be9b64736f6c634300080e0033

Deployed Bytecode Sourcemap

83929:3086:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41839:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42741:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49232:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48665:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86179:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38492:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86407:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85223:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84094:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86262:137;;;;;;;;;;;;;:::i;:::-;;86597:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84430:377;;;;;;;;;;;;;:::i;:::-;;79062:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84282:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44134:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84813:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39676:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22618:103;;;;;;;;;;;;;:::i;:::-;;86073:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82938:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21970:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42917:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84044:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85349:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79978:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49790:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86795:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78475:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85565:392;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84131:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50181:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22876:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41839:639;41924:4;42263:10;42248:25;;:11;:25;;;;:102;;;;42340:10;42325:25;;:11;:25;;;;42248:102;:179;;;;42417:10;42402:25;;:11;:25;;;;42248:179;42228:199;;41839:639;;;:::o;42741:100::-;42795:13;42828:5;42821:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42741:100;:::o;49232:218::-;49308:7;49333:16;49341:7;49333;:16::i;:::-;49328:64;;49358:34;;;;;;;;;;;;;;49328:64;49412:15;:24;49428:7;49412:24;;;;;;;;;;;:30;;;;;;;;;;;;49405:37;;49232:218;;;:::o;48665:408::-;48754:13;48770:16;48778:7;48770;:16::i;:::-;48754:32;;48826:5;48803:28;;:19;:17;:19::i;:::-;:28;;;48799:175;;48851:44;48868:5;48875:19;:17;:19::i;:::-;48851:16;:44::i;:::-;48846:128;;48923:35;;;;;;;;;;;;;;48846:128;48799:175;49019:2;48986:15;:24;49002:7;48986:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49057:7;49053:2;49037:28;;49046:5;49037:28;;;;;;;;;;;;48743:330;48665:408;;:::o;86179:77::-;21856:13;:11;:13::i;:::-;86244:6:::1;86235;;:15;;;;;;;;;;;;;;;;;;86179:77:::0;:::o;38492:323::-;38553:7;38781:15;:13;:15::i;:::-;38766:12;;38750:13;;:28;:46;38743:53;;38492:323;:::o;86407:184::-;86535:4;3630:1;2444:42;3584:43;;;:47;3580:699;;;3871:10;3863:18;;:4;:18;;;3859:85;;86548:37:::1;86567:4;86573:2;86577:7;86548:18;:37::i;:::-;3922:7:::0;;3859:85;2444:42;4004:40;;;4053:4;4060:10;4004:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2444:42;4100:40;;;4149:4;4156;4100:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4004:157;3958:310;;4241:10;4222:30;;;;;;;;;;;:::i;:::-;;;;;;;;3958:310;3580:699;86548:37:::1;86567:4;86573:2;86577:7;86548:18;:37::i;:::-;86407:184:::0;;;;;:::o;85223:120::-;21856:13;:11;:13::i;:::-;85304:33:::1;85314:9;85325:11;85304:9;:33::i;:::-;85223:120:::0;;:::o;84094:32::-;;;;:::o;86262:137::-;21856:13;:11;:13::i;:::-;86307:7:::1;86328;:5;:7::i;:::-;86320:21;;86349;86320:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86306:69;;;86390:2;86382:11;;;::::0;::::1;;86299:100;86262:137::o:0;86597:192::-;86729:4;3630:1;2444:42;3584:43;;;:47;3580:699;;;3871:10;3863:18;;:4;:18;;;3859:85;;86742:41:::1;86765:4;86771:2;86775:7;86742:22;:41::i;:::-;3922:7:::0;;3859:85;2444:42;4004:40;;;4053:4;4060:10;4004:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2444:42;4100:40;;;4149:4;4156;4100:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4004:157;3958:310;;4241:10;4222:30;;;;;;;;;;;:::i;:::-;;;;;;;;3958:310;3580:699;86742:41:::1;86765:4;86771:2;86775:7;86742:22;:41::i;:::-;86597:192:::0;;;;;:::o;84430:377::-;84475:6;;;;;;;;;;;84474:7;84466:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;84511:20;84534:13;:11;:13::i;:::-;84511:36;;84598:1;84585:10;;:14;;;;:::i;:::-;84581:1;84566:12;:16;;;;:::i;:::-;:33;84558:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;84623:21;84647:16;:28;84664:10;84647:28;;;;;;;;;;;;;;;;84623:52;;84717:1;84686:16;:28;84703:10;84686:28;;;;;;;;;;;;;;;:32;;;;84751:1;84735:13;:17;84727:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;84775:20;84781:10;84793:1;84775:5;:20::i;:::-;84457:350;;84430:377::o;79062:528::-;79206:23;79272:22;79297:8;;:15;;79272:40;;79327:34;79385:14;79364:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;79327:73;;79420:9;79415:125;79436:14;79431:1;:19;79415:125;;79492:32;79512:8;;79521:1;79512:11;;;;;;;:::i;:::-;;;;;;;;79492:19;:32::i;:::-;79476:10;79487:1;79476:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;79452:3;;;;;79415:125;;;;79561:10;79554:17;;;;79062:528;;;;:::o;84282:25::-;;;;;;;;;;;;;:::o;44134:152::-;44206:7;44249:27;44268:7;44249:18;:27::i;:::-;44226:52;;44134:152;;;:::o;84813:404::-;84887:6;;;;;;;;;;;84886:7;84878:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;84921:20;84944:13;:11;:13::i;:::-;84921:36;;85018:1;85005:10;;:14;;;;:::i;:::-;84991:11;84976:12;:26;;;;:::i;:::-;:43;84968:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;85073:1;85063:7;;:11;;;;:::i;:::-;85049;:25;85041:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;85132:16;;85118:11;:30;;;;:::i;:::-;85105:9;:43;;85097:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;85181:30;85187:10;85199:11;85181:5;:30::i;:::-;84869:348;84813:404;:::o;39676:233::-;39748:7;39789:1;39772:19;;:5;:19;;;39768:60;;39800:28;;;;;;;;;;;;;;39768:60;33835:13;39846:18;:25;39865:5;39846:25;;;;;;;;;;;;;;;;:55;39839:62;;39676:233;;;:::o;22618:103::-;21856:13;:11;:13::i;:::-;22683:30:::1;22710:1;22683:18;:30::i;:::-;22618:103::o:0;86073:100::-;21856:13;:11;:13::i;:::-;86157:10:::1;86145:9;:22;;;;;;;;;;;;:::i;:::-;;86073:100:::0;:::o;82938:900::-;83016:16;83070:19;83104:25;83144:22;83169:16;83179:5;83169:9;:16::i;:::-;83144:41;;83200:25;83242:14;83228:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83200:57;;83272:31;;:::i;:::-;83323:9;83335:15;:13;:15::i;:::-;83323:27;;83318:472;83367:14;83352:11;:29;83318:472;;83419:15;83432:1;83419:12;:15::i;:::-;83407:27;;83457:9;:16;;;83498:8;83453:73;83574:1;83548:28;;:9;:14;;;:28;;;83544:111;;83621:9;:14;;;83601:34;;83544:111;83698:5;83677:26;;:17;:26;;;83673:102;;83754:1;83728:8;83737:13;;;;;;83728:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;83673:102;83318:472;83383:3;;;;;83318:472;;;;83811:8;83804:15;;;;;;;82938:900;;;:::o;21970:87::-;22016:7;22043:6;;;;;;;;;;;22036:13;;21970:87;:::o;42917:104::-;42973:13;43006:7;42999:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42917:104;:::o;84044:45::-;;;;:::o;85349:115::-;85412:7;85435:16;:23;85452:5;85435:23;;;;;;;;;;;;;;;;85428:30;;85349:115;;;:::o;79978:2513::-;80121:16;80188:4;80179:5;:13;80175:45;;80201:19;;;;;;;;;;;;;;80175:45;80235:19;80269:17;80289:14;:12;:14::i;:::-;80269:34;;80389:15;:13;:15::i;:::-;80381:5;:23;80377:87;;;80433:15;:13;:15::i;:::-;80425:23;;80377:87;80540:9;80533:4;:16;80529:73;;;80577:9;80570:16;;80529:73;80616:25;80644:16;80654:5;80644:9;:16::i;:::-;80616:44;;80838:4;80830:5;:12;80826:278;;;80863:19;80892:5;80885:4;:12;80863:34;;80934:17;80920:11;:31;80916:111;;;80996:11;80976:31;;80916:111;80844:198;80826:278;;;81087:1;81067:21;;80826:278;81118:25;81160:17;81146:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81118:60;;81218:1;81197:17;:22;81193:78;;81247:8;81240:15;;;;;;;;81193:78;81415:31;81449:26;81469:5;81449:19;:26::i;:::-;81415:60;;81490:25;81735:9;:16;;;81730:92;;81792:9;:14;;;81772:34;;81730:92;81841:9;81853:5;81841:17;;81836:478;81865:4;81860:1;:9;;:45;;;;;81888:17;81873:11;:32;;81860:45;81836:478;;;81943:15;81956:1;81943:12;:15::i;:::-;81931:27;;81981:9;:16;;;82022:8;81977:73;82098:1;82072:28;;:9;:14;;;:28;;;82068:111;;82145:9;:14;;;82125:34;;82068:111;82222:5;82201:26;;:17;:26;;;82197:102;;82278:1;82252:8;82261:13;;;;;;82252:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;82197:102;81836:478;81907:3;;;;;81836:478;;;;82416:11;82406:8;82399:29;82464:8;82457:15;;;;;;;;79978:2513;;;;;;:::o;49790:234::-;49937:8;49885:18;:39;49904:19;:17;:19::i;:::-;49885:39;;;;;;;;;;;;;;;:49;49925:8;49885:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;49997:8;49961:55;;49976:19;:17;:19::i;:::-;49961:55;;;50007:8;49961:55;;;;;;:::i;:::-;;;;;;;;49790:234;;:::o;86795:217::-;86946:4;3630:1;2444:42;3584:43;;;:47;3580:699;;;3871:10;3863:18;;:4;:18;;;3859:85;;86959:47:::1;86982:4;86988:2;86992:7;87001:4;86959:22;:47::i;:::-;3922:7:::0;;3859:85;2444:42;4004:40;;;4053:4;4060:10;4004:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2444:42;4100:40;;;4149:4;4156;4100:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4004:157;3958:310;;4241:10;4222:30;;;;;;;;;;;:::i;:::-;;;;;;;;3958:310;3580:699;86959:47:::1;86982:4;86988:2;86992:7;87001:4;86959:22;:47::i;:::-;86795:217:::0;;;;;;:::o;78475:428::-;78559:21;;:::i;:::-;78593:31;;:::i;:::-;78649:15;:13;:15::i;:::-;78639:7;:25;:54;;;;78679:14;:12;:14::i;:::-;78668:7;:25;;78639:54;78635:103;;;78717:9;78710:16;;;;;78635:103;78760:21;78773:7;78760:12;:21::i;:::-;78748:33;;78796:9;:16;;;78792:65;;;78836:9;78829:16;;;;;78792:65;78874:21;78887:7;78874:12;:21::i;:::-;78867:28;;;78475:428;;;;:::o;85565:392::-;85658:13;85688:17;85696:8;85688:7;:17::i;:::-;85680:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;85768:28;85799:10;:8;:10::i;:::-;85768:41;;85854:1;85829:14;85823:28;:32;:128;;;;;;;;;;;;;;;;;85891:14;85907:19;:8;:17;:19::i;:::-;85874:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85823:128;85816:135;;;85565:392;;;:::o;84131:27::-;;;;:::o;50181:164::-;50278:4;50302:18;:25;50321:5;50302:25;;;;;;;;;;;;;;;:35;50328:8;50302:35;;;;;;;;;;;;;;;;;;;;;;;;;50295:42;;50181:164;;;;:::o;22876:201::-;21856:13;:11;:13::i;:::-;22985:1:::1;22965:22;;:8;:22;;::::0;22957:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23041:28;23060:8;23041:18;:28::i;:::-;22876:201:::0;:::o;50603:282::-;50668:4;50724:7;50705:15;:13;:15::i;:::-;:26;;:66;;;;;50758:13;;50748:7;:23;50705:66;:153;;;;;50857:1;34611:8;50809:17;:26;50827:7;50809:26;;;;;;;;;;;;:44;:49;50705:153;50685:173;;50603:282;;;:::o;72911:105::-;72971:7;72998:10;72991:17;;72911:105;:::o;22135:132::-;22210:12;:10;:12::i;:::-;22199:23;;:7;:5;:7::i;:::-;:23;;;22191:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22135:132::o;85470:87::-;85527:7;85550:1;85543:8;;85470:87;:::o;52871:2825::-;53013:27;53043;53062:7;53043:18;:27::i;:::-;53013:57;;53128:4;53087:45;;53103:19;53087:45;;;53083:86;;53141:28;;;;;;;;;;;;;;53083:86;53183:27;53212:23;53239:35;53266:7;53239:26;:35::i;:::-;53182:92;;;;53374:68;53399:15;53416:4;53422:19;:17;:19::i;:::-;53374:24;:68::i;:::-;53369:180;;53462:43;53479:4;53485:19;:17;:19::i;:::-;53462:16;:43::i;:::-;53457:92;;53514:35;;;;;;;;;;;;;;53457:92;53369:180;53580:1;53566:16;;:2;:16;;;53562:52;;53591:23;;;;;;;;;;;;;;53562:52;53627:43;53649:4;53655:2;53659:7;53668:1;53627:21;:43::i;:::-;53763:15;53760:160;;;53903:1;53882:19;53875:30;53760:160;54300:18;:24;54319:4;54300:24;;;;;;;;;;;;;;;;54298:26;;;;;;;;;;;;54369:18;:22;54388:2;54369:22;;;;;;;;;;;;;;;;54367:24;;;;;;;;;;;54691:146;54728:2;54777:45;54792:4;54798:2;54802:19;54777:14;:45::i;:::-;34891:8;54749:73;54691:18;:146::i;:::-;54662:17;:26;54680:7;54662:26;;;;;;;;;;;:175;;;;55008:1;34891:8;54957:19;:47;:52;54953:627;;55030:19;55062:1;55052:7;:11;55030:33;;55219:1;55185:17;:30;55203:11;55185:30;;;;;;;;;;;;:35;55181:384;;55323:13;;55308:11;:28;55304:242;;55503:19;55470:17;:30;55488:11;55470:30;;;;;;;;;;;:52;;;;55304:242;55181:384;55011:569;54953:627;55627:7;55623:2;55608:27;;55617:4;55608:27;;;;;;;;;;;;55646:42;55667:4;55673:2;55677:7;55686:1;55646:20;:42::i;:::-;53002:2694;;;52871:2825;;;:::o;66743:112::-;66820:27;66830:2;66834:8;66820:27;;;;;;;;;;;;:9;:27::i;:::-;66743:112;;:::o;55792:193::-;55938:39;55955:4;55961:2;55965:7;55938:39;;;;;;;;;;;;:16;:39::i;:::-;55792:193;;;:::o;60252:2966::-;60325:20;60348:13;;60325:36;;60388:1;60376:8;:13;60372:44;;60398:18;;;;;;;;;;;;;;60372:44;60429:61;60459:1;60463:2;60467:12;60481:8;60429:21;:61::i;:::-;60973:1;33973:2;60943:1;:26;;60942:32;60930:8;:45;60904:18;:22;60923:2;60904:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;61252:139;61289:2;61343:33;61366:1;61370:2;61374:1;61343:14;:33::i;:::-;61310:30;61331:8;61310:20;:30::i;:::-;:66;61252:18;:139::i;:::-;61218:17;:31;61236:12;61218:31;;;;;;;;;;;:173;;;;61408:16;61439:11;61468:8;61453:12;:23;61439:37;;61989:16;61985:2;61981:25;61969:37;;62361:12;62321:8;62280:1;62218:25;62159:1;62098;62071:335;62732:1;62718:12;62714:20;62672:346;62773:3;62764:7;62761:16;62672:346;;62991:7;62981:8;62978:1;62951:25;62948:1;62945;62940:59;62826:1;62817:7;62813:15;62802:26;;62672:346;;;62676:77;63063:1;63051:8;:13;63047:45;;63073:19;;;;;;;;;;;;;;63047:45;63125:3;63109:13;:19;;;;60678:2462;;63150:60;63179:1;63183:2;63187:12;63201:8;63150:20;:60::i;:::-;60314:2904;60252:2966;;:::o;45289:1275::-;45356:7;45376:12;45391:7;45376:22;;45459:4;45440:15;:13;:15::i;:::-;:23;45436:1061;;45493:13;;45486:4;:20;45482:1015;;;45531:14;45548:17;:23;45566:4;45548:23;;;;;;;;;;;;45531:40;;45665:1;34611:8;45637:6;:24;:29;45633:845;;46302:113;46319:1;46309:6;:11;46302:113;;46362:17;:25;46380:6;;;;;;;46362:25;;;;;;;;;;;;46353:34;;46302:113;;;46448:6;46441:13;;;;;;45633:845;45508:989;45482:1015;45436:1061;46525:31;;;;;;;;;;;;;;45289:1275;;;;:::o;23237:191::-;23311:16;23330:6;;;;;;;;;;;23311:25;;23356:8;23347:6;;:17;;;;;;;;;;;;;;;;;;23411:8;23380:40;;23401:8;23380:40;;;;;;;;;;;;23300:128;23237:191;:::o;44737:161::-;44805:21;;:::i;:::-;44846:44;44865:17;:24;44883:5;44865:24;;;;;;;;;;;;44846:18;:44::i;:::-;44839:51;;44737:161;;;:::o;38179:103::-;38234:7;38261:13;;38254:20;;38179:103;:::o;56583:407::-;56758:31;56771:4;56777:2;56781:7;56758:12;:31::i;:::-;56822:1;56804:2;:14;;;:19;56800:183;;56843:56;56874:4;56880:2;56884:7;56893:5;56843:30;:56::i;:::-;56838:145;;56927:40;;;;;;;;;;;;;;56838:145;56800:183;56583:407;;;;:::o;44475:166::-;44545:21;;:::i;:::-;44586:47;44605:27;44624:7;44605:18;:27::i;:::-;44586:18;:47::i;:::-;44579:54;;44475:166;;;:::o;85963:104::-;86023:13;86052:9;86045:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85963:104;:::o;17948:716::-;18004:13;18055:14;18092:1;18072:17;18083:5;18072:10;:17::i;:::-;:21;18055:38;;18108:20;18142:6;18131:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18108:41;;18164:11;18293:6;18289:2;18285:15;18277:6;18273:28;18266:35;;18330:288;18337:4;18330:288;;;18362:5;;;;;;;;18504:8;18499:2;18492:5;18488:14;18483:30;18478:3;18470:44;18560:2;18551:11;;;;;;:::i;:::-;;;;;18594:1;18585:5;:10;18330:288;18581:21;18330:288;18639:6;18632:13;;;;;17948:716;;;:::o;20521:98::-;20574:7;20601:10;20594:17;;20521:98;:::o;51766:485::-;51868:27;51897:23;51938:38;51979:15;:24;51995:7;51979:24;;;;;;;;;;;51938:65;;52156:18;52133:41;;52213:19;52207:26;52188:45;;52118:126;51766:485;;;:::o;50994:659::-;51143:11;51308:16;51301:5;51297:28;51288:37;;51468:16;51457:9;51453:32;51440:45;;51618:15;51607:9;51604:30;51596:5;51585:9;51582:20;51579:56;51569:66;;50994:659;;;;;:::o;57652:159::-;;;;;:::o;72220:311::-;72355:7;72375:16;35015:3;72401:19;:41;;72375:68;;35015:3;72469:31;72480:4;72486:2;72490:9;72469:10;:31::i;:::-;72461:40;;:62;;72454:69;;;72220:311;;;;;:::o;47112:450::-;47192:14;47360:16;47353:5;47349:28;47340:37;;47537:5;47523:11;47498:23;47494:41;47491:52;47484:5;47481:63;47471:73;;47112:450;;;;:::o;58476:158::-;;;;;:::o;65970:689::-;66101:19;66107:2;66111:8;66101:5;:19::i;:::-;66180:1;66162:2;:14;;;:19;66158:483;;66202:11;66216:13;;66202:27;;66248:13;66270:8;66264:3;:14;66248:30;;66297:233;66328:62;66367:1;66371:2;66375:7;;;;;;66384:5;66328:30;:62::i;:::-;66323:167;;66426:40;;;;;;;;;;;;;;66323:167;66525:3;66517:5;:11;66297:233;;66612:3;66595:13;;:20;66591:34;;66617:8;;;66591:34;66183:458;;66158:483;65970:689;;;:::o;47664:324::-;47734:14;47967:1;47957:8;47954:15;47928:24;47924:46;47914:56;;47664:324;;;:::o;46663:366::-;46729:31;;:::i;:::-;46806:6;46773:9;:14;;:41;;;;;;;;;;;34494:3;46859:6;:33;;46825:9;:24;;:68;;;;;;;;;;;46951:1;34611:8;46923:6;:24;:29;;46904:9;:16;;:48;;;;;;;;;;;35015:3;46992:6;:28;;46963:9;:19;;:58;;;;;;;;;;;46663:366;;;:::o;59074:716::-;59237:4;59283:2;59258:45;;;59304:19;:17;:19::i;:::-;59325:4;59331:7;59340:5;59258:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59254:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59558:1;59541:6;:13;:18;59537:235;;59587:40;;;;;;;;;;;;;;59537:235;59730:6;59724:13;59715:6;59711:2;59707:15;59700:38;59254:529;59427:54;;;59417:64;;;:6;:64;;;;59410:71;;;59074:716;;;;;;:::o;14814:922::-;14867:7;14887:14;14904:1;14887:18;;14954:6;14945:5;:15;14941:102;;14990:6;14981:15;;;;;;:::i;:::-;;;;;15025:2;15015:12;;;;14941:102;15070:6;15061:5;:15;15057:102;;15106:6;15097:15;;;;;;:::i;:::-;;;;;15141:2;15131:12;;;;15057:102;15186:6;15177:5;:15;15173:102;;15222:6;15213:15;;;;;;:::i;:::-;;;;;15257:2;15247:12;;;;15173:102;15302:5;15293;:14;15289:99;;15337:5;15328:14;;;;;;:::i;:::-;;;;;15371:1;15361:11;;;;15289:99;15415:5;15406;:14;15402:99;;15450:5;15441:14;;;;;;:::i;:::-;;;;;15484:1;15474:11;;;;15402:99;15528:5;15519;:14;15515:99;;15563:5;15554:14;;;;;;:::i;:::-;;;;;15597:1;15587:11;;;;15515:99;15641:5;15632;:14;15628:66;;15677:1;15667:11;;;;15628:66;15722:6;15715:13;;;14814:922;;;:::o;71921:147::-;72058:6;71921:147;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:474::-;6573:6;6581;6630:2;6618:9;6609:7;6605:23;6601:32;6598:119;;;6636:79;;:::i;:::-;6598:119;6756:1;6781:53;6826:7;6817:6;6806:9;6802:22;6781:53;:::i;:::-;6771:63;;6727:117;6883:2;6909:53;6954:7;6945:6;6934:9;6930:22;6909:53;:::i;:::-;6899:63;;6854:118;6505:474;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:117;7217:1;7214;7207:12;7231:117;7340:1;7337;7330:12;7371:568;7444:8;7454:6;7504:3;7497:4;7489:6;7485:17;7481:27;7471:122;;7512:79;;:::i;:::-;7471:122;7625:6;7612:20;7602:30;;7655:18;7647:6;7644:30;7641:117;;;7677:79;;:::i;:::-;7641:117;7791:4;7783:6;7779:17;7767:29;;7845:3;7837:4;7829:6;7825:17;7815:8;7811:32;7808:41;7805:128;;;7852:79;;:::i;:::-;7805:128;7371:568;;;;;:::o;7945:559::-;8031:6;8039;8088:2;8076:9;8067:7;8063:23;8059:32;8056:119;;;8094:79;;:::i;:::-;8056:119;8242:1;8231:9;8227:17;8214:31;8272:18;8264:6;8261:30;8258:117;;;8294:79;;:::i;:::-;8258:117;8407:80;8479:7;8470:6;8459:9;8455:22;8407:80;:::i;:::-;8389:98;;;;8185:312;7945:559;;;;;:::o;8510:146::-;8609:6;8643:5;8637:12;8627:22;;8510:146;;;:::o;8662:216::-;8793:11;8827:6;8822:3;8815:19;8867:4;8862:3;8858:14;8843:29;;8662:216;;;;:::o;8884:164::-;8983:4;9006:3;8998:11;;9036:4;9031:3;9027:14;9019:22;;8884:164;;;:::o;9054:108::-;9131:24;9149:5;9131:24;:::i;:::-;9126:3;9119:37;9054:108;;:::o;9168:101::-;9204:7;9244:18;9237:5;9233:30;9222:41;;9168:101;;;:::o;9275:105::-;9350:23;9367:5;9350:23;:::i;:::-;9345:3;9338:36;9275:105;;:::o;9386:99::-;9457:21;9472:5;9457:21;:::i;:::-;9452:3;9445:34;9386:99;;:::o;9491:91::-;9527:7;9567:8;9560:5;9556:20;9545:31;;9491:91;;;:::o;9588:105::-;9663:23;9680:5;9663:23;:::i;:::-;9658:3;9651:36;9588:105;;:::o;9771:866::-;9922:4;9917:3;9913:14;10009:4;10002:5;9998:16;9992:23;10028:63;10085:4;10080:3;10076:14;10062:12;10028:63;:::i;:::-;9937:164;10193:4;10186:5;10182:16;10176:23;10212:61;10267:4;10262:3;10258:14;10244:12;10212:61;:::i;:::-;10111:172;10367:4;10360:5;10356:16;10350:23;10386:57;10437:4;10432:3;10428:14;10414:12;10386:57;:::i;:::-;10293:160;10540:4;10533:5;10529:16;10523:23;10559:61;10614:4;10609:3;10605:14;10591:12;10559:61;:::i;:::-;10463:167;9891:746;9771:866;;:::o;10643:307::-;10776:10;10797:110;10903:3;10895:6;10797:110;:::i;:::-;10939:4;10934:3;10930:14;10916:28;;10643:307;;;;:::o;10956:145::-;11058:4;11090;11085:3;11081:14;11073:22;;10956:145;;;:::o;11183:988::-;11366:3;11395:86;11475:5;11395:86;:::i;:::-;11497:118;11608:6;11603:3;11497:118;:::i;:::-;11490:125;;11639:88;11721:5;11639:88;:::i;:::-;11750:7;11781:1;11766:380;11791:6;11788:1;11785:13;11766:380;;;11867:6;11861:13;11894:127;12017:3;12002:13;11894:127;:::i;:::-;11887:134;;12044:92;12129:6;12044:92;:::i;:::-;12034:102;;11826:320;11813:1;11810;11806:9;11801:14;;11766:380;;;11770:14;12162:3;12155:10;;11371:800;;;11183:988;;;;:::o;12177:501::-;12384:4;12422:2;12411:9;12407:18;12399:26;;12471:9;12465:4;12461:20;12457:1;12446:9;12442:17;12435:47;12499:172;12666:4;12657:6;12499:172;:::i;:::-;12491:180;;12177:501;;;;:::o;12684:329::-;12743:6;12792:2;12780:9;12771:7;12767:23;12763:32;12760:119;;;12798:79;;:::i;:::-;12760:119;12918:1;12943:53;12988:7;12979:6;12968:9;12964:22;12943:53;:::i;:::-;12933:63;;12889:117;12684:329;;;;:::o;13019:117::-;13128:1;13125;13118:12;13142:180;13190:77;13187:1;13180:88;13287:4;13284:1;13277:15;13311:4;13308:1;13301:15;13328:281;13411:27;13433:4;13411:27;:::i;:::-;13403:6;13399:40;13541:6;13529:10;13526:22;13505:18;13493:10;13490:34;13487:62;13484:88;;;13552:18;;:::i;:::-;13484:88;13592:10;13588:2;13581:22;13371:238;13328:281;;:::o;13615:129::-;13649:6;13676:20;;:::i;:::-;13666:30;;13705:33;13733:4;13725:6;13705:33;:::i;:::-;13615:129;;;:::o;13750:308::-;13812:4;13902:18;13894:6;13891:30;13888:56;;;13924:18;;:::i;:::-;13888:56;13962:29;13984:6;13962:29;:::i;:::-;13954:37;;14046:4;14040;14036:15;14028:23;;13750:308;;;:::o;14064:154::-;14148:6;14143:3;14138;14125:30;14210:1;14201:6;14196:3;14192:16;14185:27;14064:154;;;:::o;14224:412::-;14302:5;14327:66;14343:49;14385:6;14343:49;:::i;:::-;14327:66;:::i;:::-;14318:75;;14416:6;14409:5;14402:21;14454:4;14447:5;14443:16;14492:3;14483:6;14478:3;14474:16;14471:25;14468:112;;;14499:79;;:::i;:::-;14468:112;14589:41;14623:6;14618:3;14613;14589:41;:::i;:::-;14308:328;14224:412;;;;;:::o;14656:340::-;14712:5;14761:3;14754:4;14746:6;14742:17;14738:27;14728:122;;14769:79;;:::i;:::-;14728:122;14886:6;14873:20;14911:79;14986:3;14978:6;14971:4;14963:6;14959:17;14911:79;:::i;:::-;14902:88;;14718:278;14656:340;;;;:::o;15002:509::-;15071:6;15120:2;15108:9;15099:7;15095:23;15091:32;15088:119;;;15126:79;;:::i;:::-;15088:119;15274:1;15263:9;15259:17;15246:31;15304:18;15296:6;15293:30;15290:117;;;15326:79;;:::i;:::-;15290:117;15431:63;15486:7;15477:6;15466:9;15462:22;15431:63;:::i;:::-;15421:73;;15217:287;15002:509;;;;:::o;15517:114::-;15584:6;15618:5;15612:12;15602:22;;15517:114;;;:::o;15637:184::-;15736:11;15770:6;15765:3;15758:19;15810:4;15805:3;15801:14;15786:29;;15637:184;;;;:::o;15827:132::-;15894:4;15917:3;15909:11;;15947:4;15942:3;15938:14;15930:22;;15827:132;;;:::o;15965:108::-;16042:24;16060:5;16042:24;:::i;:::-;16037:3;16030:37;15965:108;;:::o;16079:179::-;16148:10;16169:46;16211:3;16203:6;16169:46;:::i;:::-;16247:4;16242:3;16238:14;16224:28;;16079:179;;;;:::o;16264:113::-;16334:4;16366;16361:3;16357:14;16349:22;;16264:113;;;:::o;16413:732::-;16532:3;16561:54;16609:5;16561:54;:::i;:::-;16631:86;16710:6;16705:3;16631:86;:::i;:::-;16624:93;;16741:56;16791:5;16741:56;:::i;:::-;16820:7;16851:1;16836:284;16861:6;16858:1;16855:13;16836:284;;;16937:6;16931:13;16964:63;17023:3;17008:13;16964:63;:::i;:::-;16957:70;;17050:60;17103:6;17050:60;:::i;:::-;17040:70;;16896:224;16883:1;16880;16876:9;16871:14;;16836:284;;;16840:14;17136:3;17129:10;;16537:608;;;16413:732;;;;:::o;17151:373::-;17294:4;17332:2;17321:9;17317:18;17309:26;;17381:9;17375:4;17371:20;17367:1;17356:9;17352:17;17345:47;17409:108;17512:4;17503:6;17409:108;:::i;:::-;17401:116;;17151:373;;;;:::o;17530:619::-;17607:6;17615;17623;17672:2;17660:9;17651:7;17647:23;17643:32;17640:119;;;17678:79;;:::i;:::-;17640:119;17798:1;17823:53;17868:7;17859:6;17848:9;17844:22;17823:53;:::i;:::-;17813:63;;17769:117;17925:2;17951:53;17996:7;17987:6;17976:9;17972:22;17951:53;:::i;:::-;17941:63;;17896:118;18053:2;18079:53;18124:7;18115:6;18104:9;18100:22;18079:53;:::i;:::-;18069:63;;18024:118;17530:619;;;;;:::o;18155:468::-;18220:6;18228;18277:2;18265:9;18256:7;18252:23;18248:32;18245:119;;;18283:79;;:::i;:::-;18245:119;18403:1;18428:53;18473:7;18464:6;18453:9;18449:22;18428:53;:::i;:::-;18418:63;;18374:117;18530:2;18556:50;18598:7;18589:6;18578:9;18574:22;18556:50;:::i;:::-;18546:60;;18501:115;18155:468;;;;;:::o;18629:307::-;18690:4;18780:18;18772:6;18769:30;18766:56;;;18802:18;;:::i;:::-;18766:56;18840:29;18862:6;18840:29;:::i;:::-;18832:37;;18924:4;18918;18914:15;18906:23;;18629:307;;;:::o;18942:410::-;19019:5;19044:65;19060:48;19101:6;19060:48;:::i;:::-;19044:65;:::i;:::-;19035:74;;19132:6;19125:5;19118:21;19170:4;19163:5;19159:16;19208:3;19199:6;19194:3;19190:16;19187:25;19184:112;;;19215:79;;:::i;:::-;19184:112;19305:41;19339:6;19334:3;19329;19305:41;:::i;:::-;19025:327;18942:410;;;;;:::o;19371:338::-;19426:5;19475:3;19468:4;19460:6;19456:17;19452:27;19442:122;;19483:79;;:::i;:::-;19442:122;19600:6;19587:20;19625:78;19699:3;19691:6;19684:4;19676:6;19672:17;19625:78;:::i;:::-;19616:87;;19432:277;19371:338;;;;:::o;19715:943::-;19810:6;19818;19826;19834;19883:3;19871:9;19862:7;19858:23;19854:33;19851:120;;;19890:79;;:::i;:::-;19851:120;20010:1;20035:53;20080:7;20071:6;20060:9;20056:22;20035:53;:::i;:::-;20025:63;;19981:117;20137:2;20163:53;20208:7;20199:6;20188:9;20184:22;20163:53;:::i;:::-;20153:63;;20108:118;20265:2;20291:53;20336:7;20327:6;20316:9;20312:22;20291:53;:::i;:::-;20281:63;;20236:118;20421:2;20410:9;20406:18;20393:32;20452:18;20444:6;20441:30;20438:117;;;20474:79;;:::i;:::-;20438:117;20579:62;20633:7;20624:6;20613:9;20609:22;20579:62;:::i;:::-;20569:72;;20364:287;19715:943;;;;;;;:::o;20736:876::-;20897:4;20892:3;20888:14;20984:4;20977:5;20973:16;20967:23;21003:63;21060:4;21055:3;21051:14;21037:12;21003:63;:::i;:::-;20912:164;21168:4;21161:5;21157:16;21151:23;21187:61;21242:4;21237:3;21233:14;21219:12;21187:61;:::i;:::-;21086:172;21342:4;21335:5;21331:16;21325:23;21361:57;21412:4;21407:3;21403:14;21389:12;21361:57;:::i;:::-;21268:160;21515:4;21508:5;21504:16;21498:23;21534:61;21589:4;21584:3;21580:14;21566:12;21534:61;:::i;:::-;21438:167;20866:746;20736:876;;:::o;21618:351::-;21775:4;21813:3;21802:9;21798:19;21790:27;;21827:135;21959:1;21948:9;21944:17;21935:6;21827:135;:::i;:::-;21618:351;;;;:::o;21975:474::-;22043:6;22051;22100:2;22088:9;22079:7;22075:23;22071:32;22068:119;;;22106:79;;:::i;:::-;22068:119;22226:1;22251:53;22296:7;22287:6;22276:9;22272:22;22251:53;:::i;:::-;22241:63;;22197:117;22353:2;22379:53;22424:7;22415:6;22404:9;22400:22;22379:53;:::i;:::-;22369:63;;22324:118;21975:474;;;;;:::o;22455:180::-;22503:77;22500:1;22493:88;22600:4;22597:1;22590:15;22624:4;22621:1;22614:15;22641:320;22685:6;22722:1;22716:4;22712:12;22702:22;;22769:1;22763:4;22759:12;22790:18;22780:81;;22846:4;22838:6;22834:17;22824:27;;22780:81;22908:2;22900:6;22897:14;22877:18;22874:38;22871:84;;22927:18;;:::i;:::-;22871:84;22692:269;22641:320;;;:::o;22967:332::-;23088:4;23126:2;23115:9;23111:18;23103:26;;23139:71;23207:1;23196:9;23192:17;23183:6;23139:71;:::i;:::-;23220:72;23288:2;23277:9;23273:18;23264:6;23220:72;:::i;:::-;22967:332;;;;;:::o;23305:137::-;23359:5;23390:6;23384:13;23375:22;;23406:30;23430:5;23406:30;:::i;:::-;23305:137;;;;:::o;23448:345::-;23515:6;23564:2;23552:9;23543:7;23539:23;23535:32;23532:119;;;23570:79;;:::i;:::-;23532:119;23690:1;23715:61;23768:7;23759:6;23748:9;23744:22;23715:61;:::i;:::-;23705:71;;23661:125;23448:345;;;;:::o;23799:147::-;23900:11;23937:3;23922:18;;23799:147;;;;:::o;23952:114::-;;:::o;24072:398::-;24231:3;24252:83;24333:1;24328:3;24252:83;:::i;:::-;24245:90;;24344:93;24433:3;24344:93;:::i;:::-;24462:1;24457:3;24453:11;24446:18;;24072:398;;;:::o;24476:379::-;24660:3;24682:147;24825:3;24682:147;:::i;:::-;24675:154;;24846:3;24839:10;;24476:379;;;:::o;24861:164::-;25001:16;24997:1;24989:6;24985:14;24978:40;24861:164;:::o;25031:366::-;25173:3;25194:67;25258:2;25253:3;25194:67;:::i;:::-;25187:74;;25270:93;25359:3;25270:93;:::i;:::-;25388:2;25383:3;25379:12;25372:19;;25031:366;;;:::o;25403:419::-;25569:4;25607:2;25596:9;25592:18;25584:26;;25656:9;25650:4;25646:20;25642:1;25631:9;25627:17;25620:47;25684:131;25810:4;25684:131;:::i;:::-;25676:139;;25403:419;;;:::o;25828:180::-;25876:77;25873:1;25866:88;25973:4;25970:1;25963:15;25997:4;25994:1;25987:15;26014:305;26054:3;26073:20;26091:1;26073:20;:::i;:::-;26068:25;;26107:20;26125:1;26107:20;:::i;:::-;26102:25;;26261:1;26193:66;26189:74;26186:1;26183:81;26180:107;;;26267:18;;:::i;:::-;26180:107;26311:1;26308;26304:9;26297:16;;26014:305;;;;:::o;26325:158::-;26465:10;26461:1;26453:6;26449:14;26442:34;26325:158;:::o;26489:365::-;26631:3;26652:66;26716:1;26711:3;26652:66;:::i;:::-;26645:73;;26727:93;26816:3;26727:93;:::i;:::-;26845:2;26840:3;26836:12;26829:19;;26489:365;;;:::o;26860:419::-;27026:4;27064:2;27053:9;27049:18;27041:26;;27113:9;27107:4;27103:20;27099:1;27088:9;27084:17;27077:47;27141:131;27267:4;27141:131;:::i;:::-;27133:139;;26860:419;;;:::o;27285:157::-;27425:9;27421:1;27413:6;27409:14;27402:33;27285:157;:::o;27448:365::-;27590:3;27611:66;27675:1;27670:3;27611:66;:::i;:::-;27604:73;;27686:93;27775:3;27686:93;:::i;:::-;27804:2;27799:3;27795:12;27788:19;;27448:365;;;:::o;27819:419::-;27985:4;28023:2;28012:9;28008:18;28000:26;;28072:9;28066:4;28062:20;28058:1;28047:9;28043:17;28036:47;28100:131;28226:4;28100:131;:::i;:::-;28092:139;;27819:419;;;:::o;28244:180::-;28292:77;28289:1;28282:88;28389:4;28386:1;28379:15;28413:4;28410:1;28403:15;28430:159;28570:11;28566:1;28558:6;28554:14;28547:35;28430:159;:::o;28595:365::-;28737:3;28758:66;28822:1;28817:3;28758:66;:::i;:::-;28751:73;;28833:93;28922:3;28833:93;:::i;:::-;28951:2;28946:3;28942:12;28935:19;;28595:365;;;:::o;28966:419::-;29132:4;29170:2;29159:9;29155:18;29147:26;;29219:9;29213:4;29209:20;29205:1;29194:9;29190:17;29183:47;29247:131;29373:4;29247:131;:::i;:::-;29239:139;;28966:419;;;:::o;29391:348::-;29431:7;29454:20;29472:1;29454:20;:::i;:::-;29449:25;;29488:20;29506:1;29488:20;:::i;:::-;29483:25;;29676:1;29608:66;29604:74;29601:1;29598:81;29593:1;29586:9;29579:17;29575:105;29572:131;;;29683:18;;:::i;:::-;29572:131;29731:1;29728;29724:9;29713:20;;29391:348;;;;:::o;29745:170::-;29885:22;29881:1;29873:6;29869:14;29862:46;29745:170;:::o;29921:366::-;30063:3;30084:67;30148:2;30143:3;30084:67;:::i;:::-;30077:74;;30160:93;30249:3;30160:93;:::i;:::-;30278:2;30273:3;30269:12;30262:19;;29921:366;;;:::o;30293:419::-;30459:4;30497:2;30486:9;30482:18;30474:26;;30546:9;30540:4;30536:20;30532:1;30521:9;30517:17;30510:47;30574:131;30700:4;30574:131;:::i;:::-;30566:139;;30293:419;;;:::o;30718:234::-;30858:34;30854:1;30846:6;30842:14;30835:58;30927:17;30922:2;30914:6;30910:15;30903:42;30718:234;:::o;30958:366::-;31100:3;31121:67;31185:2;31180:3;31121:67;:::i;:::-;31114:74;;31197:93;31286:3;31197:93;:::i;:::-;31315:2;31310:3;31306:12;31299:19;;30958:366;;;:::o;31330:419::-;31496:4;31534:2;31523:9;31519:18;31511:26;;31583:9;31577:4;31573:20;31569:1;31558:9;31554:17;31547:47;31611:131;31737:4;31611:131;:::i;:::-;31603:139;;31330:419;;;:::o;31755:148::-;31857:11;31894:3;31879:18;;31755:148;;;;:::o;31909:377::-;32015:3;32043:39;32076:5;32043:39;:::i;:::-;32098:89;32180:6;32175:3;32098:89;:::i;:::-;32091:96;;32196:52;32241:6;32236:3;32229:4;32222:5;32218:16;32196:52;:::i;:::-;32273:6;32268:3;32264:16;32257:23;;32019:267;31909:377;;;;:::o;32292:155::-;32432:7;32428:1;32420:6;32416:14;32409:31;32292:155;:::o;32453:400::-;32613:3;32634:84;32716:1;32711:3;32634:84;:::i;:::-;32627:91;;32727:93;32816:3;32727:93;:::i;:::-;32845:1;32840:3;32836:11;32829:18;;32453:400;;;:::o;32859:701::-;33140:3;33162:95;33253:3;33244:6;33162:95;:::i;:::-;33155:102;;33274:95;33365:3;33356:6;33274:95;:::i;:::-;33267:102;;33386:148;33530:3;33386:148;:::i;:::-;33379:155;;33551:3;33544:10;;32859:701;;;;;:::o;33566:225::-;33706:34;33702:1;33694:6;33690:14;33683:58;33775:8;33770:2;33762:6;33758:15;33751:33;33566:225;:::o;33797:366::-;33939:3;33960:67;34024:2;34019:3;33960:67;:::i;:::-;33953:74;;34036:93;34125:3;34036:93;:::i;:::-;34154:2;34149:3;34145:12;34138:19;;33797:366;;;:::o;34169:419::-;34335:4;34373:2;34362:9;34358:18;34350:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34450:131;34576:4;34450:131;:::i;:::-;34442:139;;34169:419;;;:::o;34594:182::-;34734:34;34730:1;34722:6;34718:14;34711:58;34594:182;:::o;34782:366::-;34924:3;34945:67;35009:2;35004:3;34945:67;:::i;:::-;34938:74;;35021:93;35110:3;35021:93;:::i;:::-;35139:2;35134:3;35130:12;35123:19;;34782:366;;;:::o;35154:419::-;35320:4;35358:2;35347:9;35343:18;35335:26;;35407:9;35401:4;35397:20;35393:1;35382:9;35378:17;35371:47;35435:131;35561:4;35435:131;:::i;:::-;35427:139;;35154:419;;;:::o;35579:180::-;35627:77;35624:1;35617:88;35724:4;35721:1;35714:15;35748:4;35745:1;35738:15;35765:98;35816:6;35850:5;35844:12;35834:22;;35765:98;;;:::o;35869:168::-;35952:11;35986:6;35981:3;35974:19;36026:4;36021:3;36017:14;36002:29;;35869:168;;;;:::o;36043:360::-;36129:3;36157:38;36189:5;36157:38;:::i;:::-;36211:70;36274:6;36269:3;36211:70;:::i;:::-;36204:77;;36290:52;36335:6;36330:3;36323:4;36316:5;36312:16;36290:52;:::i;:::-;36367:29;36389:6;36367:29;:::i;:::-;36362:3;36358:39;36351:46;;36133:270;36043:360;;;;:::o;36409:640::-;36604:4;36642:3;36631:9;36627:19;36619:27;;36656:71;36724:1;36713:9;36709:17;36700:6;36656:71;:::i;:::-;36737:72;36805:2;36794:9;36790:18;36781:6;36737:72;:::i;:::-;36819;36887:2;36876:9;36872:18;36863:6;36819:72;:::i;:::-;36938:9;36932:4;36928:20;36923:2;36912:9;36908:18;36901:48;36966:76;37037:4;37028:6;36966:76;:::i;:::-;36958:84;;36409:640;;;;;;;:::o;37055:141::-;37111:5;37142:6;37136:13;37127:22;;37158:32;37184:5;37158:32;:::i;:::-;37055:141;;;;:::o;37202:349::-;37271:6;37320:2;37308:9;37299:7;37295:23;37291:32;37288:119;;;37326:79;;:::i;:::-;37288:119;37446:1;37471:63;37526:7;37517:6;37506:9;37502:22;37471:63;:::i;:::-;37461:73;;37417:127;37202:349;;;;:::o

Swarm Source

ipfs://6eceac58d680b7ad61429d0f1c0936db36cd8f6629cbd1a9a668bf3e2ac0be9b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.