ETH Price: $3,360.40 (-2.72%)
Gas: 2 Gwei

Token

Hypneusys (HYPNEU)
 

Overview

Max Total Supply

10 HYPNEU

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 HYPNEU
0x37dfaa62f0fe5e6ebe990ef1a0722f5279962e37
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:
Hypneusys

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;



// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}


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

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

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

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

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

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

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

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


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

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

    bool private _paused;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol)
/**
 * @dev Provides a set of functions to operate with Base64 strings.
 *
 * _Available since v4.5._
 */
library Base64 {
    /**
     * @dev Base64 Encoding/Decoding Table
     */
    string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /**
     * @dev Converts a `bytes` to its Bytes64 `string` representation.
     */
    function encode(bytes memory data) internal pure returns (string memory) {
        /**
         * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence
         * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol
         */
        if (data.length == 0) return "";

        // Loads the table into memory
        string memory table = _TABLE;

        // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter
        // and split into 4 numbers of 6 bits.
        // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up
        // - `data.length + 2`  -> Round up
        // - `/ 3`              -> Number of 3-bytes chunks
        // - `4 *`              -> 4 characters for each chunk
        string memory result = new string(4 * ((data.length + 2) / 3));

        assembly {
            // Prepare the lookup table (skip the first "length" byte)
            let tablePtr := add(table, 1)

            // Prepare result pointer, jump over length
            let resultPtr := add(result, 32)

            // Run over the input, 3 bytes at a time
            for {
                let dataPtr := data
                let endPtr := add(data, mload(data))
            } lt(dataPtr, endPtr) {

            } {
                // Advance 3 bytes
                dataPtr := add(dataPtr, 3)
                let input := mload(dataPtr)

                // To write each character, shift the 3 bytes (18 bits) chunk
                // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)
                // and apply logical AND with 0x3F which is the number of
                // the previous character in the ASCII table prior to the Base64 Table
                // The result is then added to the table to get the character to write,
                // and finally write it in the result pointer but with a left shift
                // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits

                mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance

                mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))
                resultPtr := add(resultPtr, 1) // Advance
            }

            // When data `bytes` is not exactly 3 bytes long
            // it is padded with `=` characters at the end
            switch mod(mload(data), 3)
            case 1 {
                mstore8(sub(resultPtr, 1), 0x3d)
                mstore8(sub(resultPtr, 2), 0x3d)
            }
            case 2 {
                mstore8(sub(resultPtr, 1), 0x3d)
            }
        }

        return result;
    }
}


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of 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 through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

    // ==============================
    //        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 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs
/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // 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 tokenId of the next token 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 => address) private _tokenApprovals;

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

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

    /**
     * @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 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 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 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 returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    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: 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.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view 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 {
        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;
    }

    /**
     * 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 ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

    /**
     * @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 See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    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 '';
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev 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 (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, 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 {
        _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 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 {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        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 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _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 {
        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 Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(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++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool 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))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        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 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;
    }

    /**
     * @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 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 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 returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

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

contract Hypneusys is
  ERC721A,
  Pausable,
  Ownable
{
	using Strings for uint256;
	uint256 public constant MAX_SUPPLY = 2048;

  struct Layer {
    uint256[6] coords;
    uint256 duration;
    uint256 numberOfRings;
    uint256 numberOfSpikes;
  }

  struct OnChainArt {
    mapping(uint => Layer) layers;
    uint layerCount;
  }

  mapping(uint => OnChainArt) artByTokenId;
  
  constructor()
  ERC721A(
    "Hypneusys",
    "HYPNEU"
  ) {
  }

  function mint(uint256 count)
  public
  payable {
    uint256 currentTotal = totalSupply();
    require(count > 0,
      "Count must be greater than 0");
    require(count < 3,
      "Count must be less than 3");
    require(currentTotal + count <= MAX_SUPPLY,
      "Requested amount exceeds what is available!");
    require(currentTotal <= MAX_SUPPLY,
      "Not enough available.");
    _generateArt(count, currentTotal);
    _safeMint(msg.sender, count);
  }

  function contractURI()
    public
    pure
    returns (string memory) 
    {
      return string(
        abi.encodePacked(
          "data:application/json;base64,",
          Base64.encode(
            bytes(
              abi.encodePacked(
                '{"description": "An on-chain (*)piece.","name":"Hypneusys","image":"<svg viewBox=\\"0 0 128 128\\" xmlns=\\"http://www.w3.org/2000/svg\\"></svg>"}'
              )
            )
          )
        )
      );
    }
  
  function tokenURI(uint256 tokenId) 
    public 
    view 
    virtual 
    override (ERC721A)
    returns (string memory) 
    {
      require(tokenId < totalSupply(), "Token ID does not exist.");
      bytes memory defs;
      bytes memory uses;
      Layer memory thisLayer;
      uint256 layerIndex = 0;
      uint256 ringIndex = 0;
      uint256 spikeIndex = 0;
      bytes[] memory sections = new bytes[](8);

      for (layerIndex = 0; layerIndex < artByTokenId[tokenId].layerCount; layerIndex++) {
        thisLayer = artByTokenId[tokenId].layers[layerIndex];
        
        for (ringIndex = 0; ringIndex < thisLayer.numberOfRings; ringIndex++) {
          sections[0] = abi.encodePacked(
            '<path id=\\"r',
            layerIndex.toString(),
            '-',
            ringIndex.toString(),
            '\\">'
          );
          sections[1] = abi.encodePacked(
            '<animate id=\\"p',
            layerIndex.toString(),
            '-',
            ringIndex.toString(),
            '\\" attributeName=\\"d\\" values=\\"m512,512l0,0 0,0;m'
          );
          sections[2] = abi.encodePacked(
            thisLayer.coords[0].toString(),
            ',',
            thisLayer.coords[1].toString(),
            'l',
            thisLayer.coords[2].toString(),
            ',-',
            thisLayer.coords[3].toString(),
            ' '
          );
          sections[3] = abi.encodePacked(
            thisLayer.coords[2].toString(),
            ',',
            thisLayer.coords[3].toString(),
            ';m',
            thisLayer.coords[4].toString(),
            ',',
            thisLayer.coords[5].toString(),
            'l'
          );
          sections[4] = abi.encodePacked(
            thisLayer.coords[2].toString(),
            ',-',
            thisLayer.coords[3].toString(),
            ' ',
            thisLayer.coords[2].toString(),
            ',',
            thisLayer.coords[3].toString(),
            ';m'
          );
          sections[5] = abi.encodePacked(
            '512,512l0,0 0,0\\" dur=\\"',
            thisLayer.duration.toString(),
            's\\" repeatCount=\\"indefinite\\" ',
            (ringIndex > 0
              ? string(abi.encodePacked('begin=\\"p',layerIndex.toString(),'-0.begin+',ringIndex.toString(),'s\\" '))
              : ''
            ),
            '/>'
          );
          sections[6] = abi.encodePacked(
            '<animate attributeName=\\"stroke-width\\" values=\\"0;4;4;4;0\\" dur=\\"',
            thisLayer.duration.toString(),
            's\\" repeatCount=\\"indefinite\\" begin=\\"p',
            layerIndex.toString(),
            '-0.begin',
            (ringIndex > 0
              ? string(abi.encodePacked('+',ringIndex.toString(),'s'))
              : ''
            ),
            '\\" /></path>'
          );
          defs = abi.encodePacked(
            defs,
            sections[0],
            sections[1],
            sections[2],
            sections[3],
            sections[4],
            sections[5],
            sections[6]
          );

          for (spikeIndex = 0; spikeIndex < thisLayer.numberOfSpikes; spikeIndex++) {
            sections[7] = abi.encodePacked(
              '<use href=\\"#r',
              layerIndex.toString(),
              '-',
              ringIndex.toString(),
              '\\" transform=\\"rotate(',
              (spikeIndex*(360/thisLayer.numberOfSpikes) + (spikeIndex%2==0?(360/(thisLayer.numberOfSpikes*2)):0)).toString(),
              ', 512 512)\\" fill=\\"white\\" />'
            );
            uses = abi.encodePacked(
              uses,
              sections[7]
            );
          }
        }
      }

      return string(
        abi.encodePacked(
          "data:application/json;base64,",
          Base64.encode(
            bytes(
              abi.encodePacked(
                '{"description":"An on-chain (*)piece.","name":"Hypneusys #',
                tokenId.toString(),
                '","image":"<svg viewBox=\\"0 0 1024 1024\\" width=\\"1024\\" height=\\"1024\\" xmlns=\\"http://www.w3.org/2000/svg\\" style=\\"background:white;\\"><defs>',
                '<filter id=\\"drop\\" color-interpolation-filters=\\"sRGB\\"><feDropShadow dx=\\"4\\" dy=\\"4\\" stdDeviation=\\"2\\" flood-opacity=\\"1\\" flood-color=\\"#CCCCCC\\"/><feDropShadow dx=\\"-4\\" dy=\\"-4\\" stdDeviation=\\"2\\" flood-opacity=\\"1\\" flood-color=\\"#CCCCCC\\"/></filter>',
                defs,
                '</defs><g filter=\\"url(#drop)\\"><animateTransform attributeName=\\"transform\\" type=\\"rotate\\" from=\\"0 512 512\\" to=\\"360 512 512\\" dur=\\"30s\\" repeatCount=\\"indefinite\\"/>',
                uses,
                '</g><mask id=\\"cut\\"><rect width=\\"100%\\" height=\\"100%\\" fill=\\"white\\"/><circle cx=\\"512\\" cy=\\"512\\" r=\\"512\\" fill=\\"#02075d\\"/></mask><rect x=\\"0\\" y=\\"0\\" width=\\"1024\\" height=\\"1024\\" mask=\\"url(#cut)\\" fill=\\"white\\"/></svg>"}'
              )
            )
          )
        )
      );
    }
  
  function pause()
  public
  onlyOwner {
    _pause();
  }

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

  function withdrawAll()
  public
  payable
  onlyOwner {
    _withdraw(owner(), address(this).balance);
  }

  function _withdraw(address _address, uint256 _amount)
  private {
    (bool success, ) = _address.call{value: _amount}("");
    require(success, "Recovery failed.");
  }

  function _generateArt(uint256 _quantity, uint256 _tokenId)
  private
  {
    uint256 numLayers = 4;
    uint256[2][4] memory newStats;
    uint256[6][4] memory newCoords;
    uint256 randomHash;

    for (uint256 i = 0; i < _quantity; i += 1) {
      uint256 thisTokenId = _tokenId + i;
      OnChainArt storage newPiece = artByTokenId[thisTokenId];
      newPiece.layerCount = numLayers;

      for (uint x = 0; x < numLayers; x++) {
        for(uint256 y= 0; y < 2; y++){
          randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, thisTokenId, x, y)));
          newStats[x][y] = randomHash % 8;
          if (newStats[x][y] % 2 != 0) newStats[x][y] += 1; 
        }
        for(uint256 y= 0; y < 6; y++){
          randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, thisTokenId, x, y)));
          newCoords[x][y] = randomHash % 256;
        }
        newPiece.layers[x] = Layer({
          coords: newCoords[x],
          duration: newStats[x][0] + 8,
          numberOfSpikes: newStats[x][1] + 4,
          numberOfRings: 4
        });
      }
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201825260098152684879706e657573797360b81b6020808301918252835180850190945260068452654859504e455560d01b9084015281519192916200006191600291620000f3565b50805162000077906003906020840190620000f3565b506000805550506008805460ff19169055620000933362000099565b620001d6565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001019062000199565b90600052602060002090601f01602090048101928262000125576000855562000170565b82601f106200014057805160ff191683800117855562000170565b8280016001018555821562000170579182015b828111156200017057825182559160200191906001019062000153565b506200017e92915062000182565b5090565b5b808211156200017e576000815560010162000183565b600181811c90821680620001ae57607f821691505b60208210811415620001d057634e487b7160e01b600052602260045260246000fd5b50919050565b612f6080620001e66000396000f3fe60806040526004361061014b5760003560e01c8063715018a6116100b6578063a22cb4651161006f578063a22cb46514610364578063b88d4fde14610384578063c87b56dd146103a4578063e8a3d485146103c4578063e985e9c5146103d9578063f2fde38b1461042257600080fd5b8063715018a6146102e75780638456cb59146102fc578063853828b6146103115780638da5cb5b1461031957806395d89b411461033c578063a0712d681461035157600080fd5b806332cb6b0c1161010857806332cb6b0c146102445780633f4ba83a1461025a57806342842e0e1461026f5780635c975abb1461028f5780636352211e146102a757806370a08231146102c757600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610224575b600080fd5b34801561015c57600080fd5b5061017061016b36600461210b565b610442565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610494565b60405161017c9190612d3c565b3480156101b357600080fd5b506101c76101c2366004612145565b610526565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046120e1565b61056a565b005b34801561020d57600080fd5b50600154600054035b60405190815260200161017c565b34801561023057600080fd5b506101ff61023f366004611f8d565b61060a565b34801561025057600080fd5b5061021661080081565b34801561026657600080fd5b506101ff61079b565b34801561027b57600080fd5b506101ff61028a366004611f8d565b6107de565b34801561029b57600080fd5b5060085460ff16610170565b3480156102b357600080fd5b506101c76102c2366004612145565b6107fe565b3480156102d357600080fd5b506102166102e2366004611f3f565b610809565b3480156102f357600080fd5b506101ff610858565b34801561030857600080fd5b506101ff610892565b6101ff6108ca565b34801561032557600080fd5b5060085461010090046001600160a01b03166101c7565b34801561034857600080fd5b5061019a610915565b6101ff61035f366004612145565b610924565b34801561037057600080fd5b506101ff61037f3660046120a5565b610aa6565b34801561039057600080fd5b506101ff61039f366004611fc9565b610b3c565b3480156103b057600080fd5b5061019a6103bf366004612145565b610b86565b3480156103d057600080fd5b5061019a61127d565b3480156103e557600080fd5b506101706103f4366004611f5a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561042e57600080fd5b506101ff61043d366004611f3f565b611362565b60006301ffc9a760e01b6001600160e01b03198316148061047357506380ac58cd60e01b6001600160e01b03198316145b8061048e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104a390612e12565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf90612e12565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600061053182611403565b61054e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610575826107fe565b9050336001600160a01b038216146105ae5761059181336103f4565b6105ae576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106158261142a565b9050836001600160a01b0316816001600160a01b0316146106485760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106955761067886336103f4565b61069557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106bc57604051633a954ecd60e21b815260040160405180910390fd5b80156106c757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661075257600184016000818152600460205260409020546107505760005481146107505760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6008546001600160a01b036101009091041633146107d45760405162461bcd60e51b81526004016107cb90612d4f565b60405180910390fd5b6107dc611492565b565b6107f983838360405180602001604052806000815250610b3c565b505050565b600061048e8261142a565b60006001600160a01b038216610832576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b036101009091041633146108885760405162461bcd60e51b81526004016107cb90612d4f565b6107dc6000611525565b6008546001600160a01b036101009091041633146108c25760405162461bcd60e51b81526004016107cb90612d4f565b6107dc61157f565b6008546001600160a01b036101009091041633146108fa5760405162461bcd60e51b81526004016107cb90612d4f565b6008546107dc9061010090046001600160a01b0316476115fa565b6060600380546104a390612e12565b60006109336001546000540390565b9050600082116109855760405162461bcd60e51b815260206004820152601c60248201527f436f756e74206d7573742062652067726561746572207468616e20300000000060448201526064016107cb565b600382106109d55760405162461bcd60e51b815260206004820152601960248201527f436f756e74206d757374206265206c657373207468616e20330000000000000060448201526064016107cb565b6108006109e28383612d84565b1115610a445760405162461bcd60e51b815260206004820152602b60248201527f52657175657374656420616d6f756e742065786365656473207768617420697360448201526a20617661696c61626c652160a81b60648201526084016107cb565b610800811115610a8e5760405162461bcd60e51b81526020600482015260156024820152742737ba1032b737bab3b41030bb30b4b630b136329760591b60448201526064016107cb565b610a988282611690565b610aa2338361195e565b5050565b6001600160a01b038216331415610ad05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4784848461060a565b6001600160a01b0383163b15610b8057610b6384848484611978565b610b80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610b956001546000540390565b8210610be35760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420646f6573206e6f742065786973742e000000000000000060448201526064016107cb565b606080610bee611e0c565b604080516008808252610120820190925260009182918291829190816020015b6060815260200190600190039081610c0e579050509050600093505b60008981526009602052604090206001015484101561121c576000898152600960209081526040808320878452909152908190208151610140810190925281608081018260068282826020028201915b815481526020019060010190808311610c7a575050505050815260200160068201548152602001600782015481526020016008820154815250509450600092505b846040015183101561120a57610cd084611a70565b610cd984611a70565b604051602001610cea9291906124c6565b60405160208183030381529060405281600081518110610d0c57610d0c612ea8565b6020026020010181905250610d2084611a70565b610d2984611a70565b604051602001610d3a929190612429565b60405160208183030381529060405281600181518110610d5c57610d5c612ea8565b60209081029190910101528451610d7a9060005b6020020151611a70565b8551610d87906001610d70565b8651610d94906002610d70565b8751610da1906003610d70565b604051602001610db49493929190612306565b60405160208183030381529060405281600281518110610dd657610dd6612ea8565b60209081029190910101528451610dee906002610d70565b8551610dfb906003610d70565b8651610e08906004610d70565b8751610e15906005610d70565b604051602001610e28949392919061227a565b60405160208183030381529060405281600381518110610e4a57610e4a612ea8565b60209081029190910101528451610e62906002610d70565b8551610e6f906003610d70565b8651610e7c906002610d70565b8751610e89906003610d70565b604051602001610e9c9493929190612397565b60405160208183030381529060405281600481518110610ebe57610ebe612ea8565b6020026020010181905250610ed68560200151611a70565b60008411610ef35760405180602001604052806000815250610f26565b610efc85611a70565b610f0585611a70565b604051602001610f16929190612bd9565b6040516020818303038152906040525b604051602001610f37929190612c44565b60405160208183030381529060405281600581518110610f5957610f59612ea8565b6020026020010181905250610f718560200151611a70565b610f7a85611a70565b60008511610f975760405180602001604052806000815250610fc0565b610fa085611a70565b604051602001610fb091906126eb565b6040516020818303038152906040525b604051602001610fd2939291906125e4565b60405160208183030381529060405281600681518110610ff457610ff4612ea8565b6020026020010181905250868160008151811061101357611013612ea8565b60200260200101518260018151811061102e5761102e612ea8565b60200260200101518360028151811061104957611049612ea8565b60200260200101518460038151811061106457611064612ea8565b60200260200101518560048151811061107f5761107f612ea8565b60200260200101518660058151811061109a5761109a612ea8565b6020026020010151876006815181106110b5576110b5612ea8565b60200260200101516040516020016110d49897969594939291906121d5565b6040516020818303038152906040529650600091505b84606001518210156111f8576110ff84611a70565b61110884611a70565b611168611116600286612e68565b1561112257600061113e565b6060880151611132906002612db0565b61113e90610168612d9c565b606089015161114f90610168612d9c565b6111599087612db0565b6111639190612d84565b611a70565b60405160200161117a9392919061252b565b6040516020818303038152906040528160078151811061119c5761119c612ea8565b602002602001018190525085816007815181106111bb576111bb612ea8565b60200260200101516040516020016111d49291906121a6565b604051602081830303815290604052955081806111f090612e4d565b9250506110ea565b8261120281612e4d565b935050610cbb565b8361121481612e4d565b945050610c2a565b6112506112288a611a70565b888860405160200161123c9392919061271f565b604051602081830303815290604052611b6e565b6040516020016112609190612b94565b604051602081830303815290604052975050505050505050919050565b606061133e60405160200161123c907f7b226465736372697074696f6e223a2022416e206f6e2d636861696e20282a2981527f70696563652e222c226e616d65223a224879706e6575737973222c22696d616760208201527f65223a223c7376672076696577426f783d5c2230203020313238203132385c2260408201527f20786d6c6e733d5c22687474703a2f2f7777772e77332e6f72672f323030302f60608201526d7376675c223e3c2f7376673e227d60901b6080820152608e0190565b60405160200161134e9190612b94565b604051602081830303815290604052905090565b6008546001600160a01b036101009091041633146113925760405162461bcd60e51b81526004016107cb90612d4f565b6001600160a01b0381166113f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cb565b61140081611525565b50565b600080548210801561048e575050600090815260046020526040902054600160e01b161590565b60008160005481101561147957600081815260046020526040902054600160e01b8116611477575b80611470575060001901600081815260046020526040902054611452565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60085460ff166114db5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107cb565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16156115c55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107cb565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115083390565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b50509050806107f95760405162461bcd60e51b815260206004820152601060248201526f2932b1b7bb32b93c903330b4b632b21760811b60448201526064016107cb565b600461169a611e3a565b6116a2611e67565b6000805b868110156119555760006116ba8288612d84565b6000818152600960205260408120600181018990559192505b8781101561193e5760005b60028110156117e1574233858484604051602001611700959493929190612cd4565b60408051601f1981840301815291905280516020909101209550611725600887612e68565b88836004811061173757611737612ea8565b6020020151826002811061174d5761174d612ea8565b6020020152600288836004811061176657611766612ea8565b6020020151826002811061177c5761177c612ea8565b602002015161178b9190612e68565b156117cf5760018883600481106117a4576117a4612ea8565b602002015182600281106117ba576117ba612ea8565b602002018181516117cb9190612d84565b9052505b806117d981612e4d565b9150506116de565b5060005b600681101561186c574233858484604051602001611807959493929190612cd4565b60408051601f198184030181529190528051602090910120955061182d61010087612e68565b87836004811061183f5761183f612ea8565b6020020151826006811061185557611855612ea8565b60200201528061186481612e4d565b9150506117e5565b50604051806080016040528087836004811061188a5761188a612ea8565b602002015181526020018883600481106118a6576118a6612ea8565b6020020151516118b7906008612d84565b8152602001600481526020018883600481106118d5576118d5612ea8565b6020020151600160200201516118ec906004612d84565b90526000828152602084905260409020815161190b9082906006611e94565b5060208201516006820155604082015160078201556060909101516008909101558061193681612e4d565b9150506116d3565b50505060018161194e9190612d84565b90506116a6565b50505050505050565b610aa2828260405180602001604052806000815250611cc2565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ad903390899088908890600401612d09565b602060405180830381600087803b1580156119c757600080fd5b505af19250505080156119f7575060408051601f3d908101601f191682019092526119f491810190612128565b60015b611a52573d808015611a25576040519150601f19603f3d011682016040523d82523d6000602084013e611a2a565b606091505b508051611a4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611abe5780611aa881612e4d565b9150611ab79050600a83612d9c565b9150611a98565b60008167ffffffffffffffff811115611ad957611ad9612ebe565b6040519080825280601f01601f191660200182016040528015611b03576020820181803683370190505b5090505b8415611a6857611b18600183612dcf565b9150611b25600a86612e68565b611b30906030612d84565b60f81b818381518110611b4557611b45612ea8565b60200101906001600160f81b031916908160001a905350611b67600a86612d9c565b9450611b07565b6060815160001415611b8e57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612eeb6040913990506000600384516002611bbd9190612d84565b611bc79190612d9c565b611bd2906004612db0565b67ffffffffffffffff811115611bea57611bea612ebe565b6040519080825280601f01601f191660200182016040528015611c14576020820181803683370190505b509050600182016020820185865187015b80821015611c80576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611c25565b5050600386510660018114611c9c5760028114611caf57611cb7565b603d6001830353603d6002830353611cb7565b603d60018303535b509195945050505050565b611ccc8383611d2f565b6001600160a01b0383163b156107f9576000548281035b611cf66000868380600101945086611978565b611d13576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce3578160005414611d2857600080fd5b5050505050565b6000546001600160a01b038316611d5857604051622e076360e81b815260040160405180910390fd5b81611d765760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611dc05760005550505050565b6040518060800160405280611e1f611ed2565b81526020016000815260200160008152602001600081525090565b60405180608001604052806004905b611e51611ef0565b815260200190600190039081611e495790505090565b60405180608001604052806004905b611e7e611ed2565b815260200190600190039081611e765790505090565b8260068101928215611ec2579160200282015b82811115611ec2578251825591602001919060010190611ea7565b50611ece929150611f0e565b5090565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b80821115611ece5760008155600101611f0f565b80356001600160a01b0381168114611f3a57600080fd5b919050565b600060208284031215611f5157600080fd5b61147082611f23565b60008060408385031215611f6d57600080fd5b611f7683611f23565b9150611f8460208401611f23565b90509250929050565b600080600060608486031215611fa257600080fd5b611fab84611f23565b9250611fb960208501611f23565b9150604084013590509250925092565b60008060008060808587031215611fdf57600080fd5b611fe885611f23565b9350611ff660208601611f23565b925060408501359150606085013567ffffffffffffffff8082111561201a57600080fd5b818701915087601f83011261202e57600080fd5b81358181111561204057612040612ebe565b604051601f8201601f19908116603f0116810190838211818310171561206857612068612ebe565b816040528281528a602084870101111561208157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120b857600080fd5b6120c183611f23565b9150602083013580151581146120d657600080fd5b809150509250929050565b600080604083850312156120f457600080fd5b6120fd83611f23565b946020939093013593505050565b60006020828403121561211d57600080fd5b813561147081612ed4565b60006020828403121561213a57600080fd5b815161147081612ed4565b60006020828403121561215757600080fd5b5035919050565b60008151808452612176816020860160208601612de6565b601f01601f19169290920160200192915050565b6000815161219c818560208601612de6565b9290920192915050565b600083516121b8818460208801612de6565b8351908301906121cc818360208801612de6565b01949350505050565b6000895160206121e88285838f01612de6565b8a51918401916121fb8184848f01612de6565b8a5192019161220d8184848e01612de6565b895192019161221f8184848d01612de6565b88519201916122318184848c01612de6565b87519201916122438184848b01612de6565b86519201916122558184848a01612de6565b85519201916122678184848901612de6565b919091019b9a5050505050505050505050565b6000855161228c818460208a01612de6565b8083019050600b60fa1b80825286516122ac816001850160208b01612de6565b613b6d60f01b6001939091019283015285516122cf816003850160208a01612de6565b600392019182015283516122ea816004840160208801612de6565b601b60fa1b600492909101918201526005019695505050505050565b60008551612318818460208a01612de6565b600b60fa1b9083019081528551612336816001840160208a01612de6565b601b60fa1b600192909101918201528451612358816002840160208901612de6565b612c2d60f01b60029290910191820152835161237b816004840160208801612de6565b600160fd1b600492909101918201526005019695505050505050565b600085516123a9818460208a01612de6565b612c2d60f01b90830190815285516123c8816002840160208a01612de6565b600160fd1b6002929091019182015284516123ea816003840160208901612de6565b600b60fa1b60039290910191820152835161240c816004840160208801612de6565b613b6d60f01b600492909101918201526006019695505050505050565b6e03c616e696d6174652069643d5c227608c1b8152825160009061245481600f850160208801612de6565b602d60f81b600f918401918201528351612475816010840160208801612de6565b7f5c22206174747269627574654e616d653d5c22645c222076616c7565733d5c2260109290910191820152716d3531322c3531326c302c3020302c303b6d60701b6030820152604201949350505050565b6b1e3830ba341034b21eae113960a11b815282516000906124ee81600c850160208801612de6565b602d60f81b600c91840191820152835161250f81600d840160208801612de6565b622e111f60e91b600d9290910191820152601001949350505050565b6d1e3ab9b290343932b31eae1111b960911b8152835160009061255581600e850160208901612de6565b602d60f81b600e91840191820152845161257681600f840160208901612de6565b750b84440e8e4c2dce6ccdee4da7ab844e4dee8c2e8ca560531b600f929091019182015283516125ad816025840160208801612de6565b7f2c2035313220353132295c222066696c6c3d5c2277686974655c22202f3e00006025929091019182015260430195945050505050565b7f3c616e696d617465206174747269627574654e616d653d5c227374726f6b652d81527f77696474685c222076616c7565733d5c22303b343b343b343b305c22206475726020820152621eae1160e91b60408201526000845161264e816043850160208901612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220626043918401918201526706567696e3d5c22760c41b6063820152845161269c81606b840160208901612de6565b671698173132b3b4b760c11b606b929091019182015283516126c5816073840160208801612de6565b6b2e1110179f1e17b830ba341f60a11b60739290910191820152607f0195945050505050565b602b60f81b815260008251612707816001850160208701612de6565b607360f81b6001939091019283015250600201919050565b7f7b226465736372697074696f6e223a22416e206f6e2d636861696e20282a297081527f696563652e222c226e616d65223a224879706e6575737973202300000000000060208201526000845161277d81603a850160208901612de6565b7f222c22696d616765223a223c7376672076696577426f783d5c22302030203130603a918401918201527f323420313032345c222077696474683d5c22313032345c22206865696768743d605a8201527f5c22313032345c2220786d6c6e733d5c22687474703a2f2f7777772e77332e6f607a8201527f72672f323030302f7376675c22207374796c653d5c226261636b67726f756e64609a8201526f1d3bb434ba329dae111f1e3232b3399f60811b60ba8201527f3c66696c7465722069643d5c2264726f705c2220636f6c6f722d696e7465727060ca8201527f6f6c6174696f6e2d66696c746572733d5c22735247425c223e3c666544726f7060ea8201527f536861646f772064783d5c22345c222064793d5c22345c22207374644465766961010a8201527f6174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c222061012a8201527f666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c666544726f7061014a8201527f536861646f772064783d5c222d345c222064793d5c222d345c2220737464446561016a8201527f76696174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c61018a8201527f2220666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c2f66696c6101aa820152633a32b91f60e11b6101ca820152612b8a612a69612a6361298d6101ce85018961218a565b7f3c2f646566733e3c672066696c7465723d5c2275726c282364726f70295c223e81527f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60208201527f5c227472616e73666f726d5c2220747970653d5c22726f746174655c2220667260408201527f6f6d3d5c223020353132203531325c2220746f3d5c223336302035313220353160608201527f325c22206475723d5c223330735c2220726570656174436f756e743d5c22696e60808201526b3232b334b734ba32ae11179f60a11b60a082015260ac0190565b8661218a565b7f3c2f673e3c6d61736b2069643d5c226375745c223e3c7265637420776964746881527f3d5c22313030255c22206865696768743d5c22313030255c222066696c6c3d5c60208201527f2277686974655c222f3e3c636972636c652063783d5c223531325c222063793d60408201527f5c223531325c2220723d5c223531325c222066696c6c3d5c222330323037356460608201527f5c222f3e3c2f6d61736b3e3c7265637420783d5c22305c2220793d5c22305c2260808201527f2077696474683d5c22313032345c22206865696768743d5c22313032345c222060a08201527f6d61736b3d5c2275726c2823637574295c222066696c6c3d5c2277686974655c60c08201526a222f3e3c2f7376673e227d60a81b60e082015260eb0190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bcc81601d850160208701612de6565b91909101601d0192915050565b680626567696e3d5c22760bc1b81528251600090612bfe816009850160208801612de6565b682d302e626567696e2b60b81b6009918401918201528351612c27816012840160208801612de6565b63039ae11160e51b60129290910191820152601601949350505050565b7f3531322c3531326c302c3020302c305c22206475723d5c220000000000000000815260008351612c7c816018850160208801612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220006018918401918201528351612cb9816037840160208801612de6565b61179f60f11b60379290910191820152603901949350505050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8a9083018461215e565b602081526000611470602083018461215e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612d9757612d97612e7c565b500190565b600082612dab57612dab612e92565b500490565b6000816000190483118215151615612dca57612dca612e7c565b500290565b600082821015612de157612de1612e7c565b500390565b60005b83811015612e01578181015183820152602001612de9565b83811115610b805750506000910152565b600181811c90821680612e2657607f821691505b60208210811415612e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6157612e61612e7c565b5060010190565b600082612e7757612e77612e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220884717097ea6f3dd98a8431f578279feabc06e75e3a6439e186b80c006ebf8c564736f6c63430008070033

Deployed Bytecode

0x60806040526004361061014b5760003560e01c8063715018a6116100b6578063a22cb4651161006f578063a22cb46514610364578063b88d4fde14610384578063c87b56dd146103a4578063e8a3d485146103c4578063e985e9c5146103d9578063f2fde38b1461042257600080fd5b8063715018a6146102e75780638456cb59146102fc578063853828b6146103115780638da5cb5b1461031957806395d89b411461033c578063a0712d681461035157600080fd5b806332cb6b0c1161010857806332cb6b0c146102445780633f4ba83a1461025a57806342842e0e1461026f5780635c975abb1461028f5780636352211e146102a757806370a08231146102c757600080fd5b806301ffc9a71461015057806306fdde0314610185578063081812fc146101a7578063095ea7b3146101df57806318160ddd1461020157806323b872dd14610224575b600080fd5b34801561015c57600080fd5b5061017061016b36600461210b565b610442565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b5061019a610494565b60405161017c9190612d3c565b3480156101b357600080fd5b506101c76101c2366004612145565b610526565b6040516001600160a01b03909116815260200161017c565b3480156101eb57600080fd5b506101ff6101fa3660046120e1565b61056a565b005b34801561020d57600080fd5b50600154600054035b60405190815260200161017c565b34801561023057600080fd5b506101ff61023f366004611f8d565b61060a565b34801561025057600080fd5b5061021661080081565b34801561026657600080fd5b506101ff61079b565b34801561027b57600080fd5b506101ff61028a366004611f8d565b6107de565b34801561029b57600080fd5b5060085460ff16610170565b3480156102b357600080fd5b506101c76102c2366004612145565b6107fe565b3480156102d357600080fd5b506102166102e2366004611f3f565b610809565b3480156102f357600080fd5b506101ff610858565b34801561030857600080fd5b506101ff610892565b6101ff6108ca565b34801561032557600080fd5b5060085461010090046001600160a01b03166101c7565b34801561034857600080fd5b5061019a610915565b6101ff61035f366004612145565b610924565b34801561037057600080fd5b506101ff61037f3660046120a5565b610aa6565b34801561039057600080fd5b506101ff61039f366004611fc9565b610b3c565b3480156103b057600080fd5b5061019a6103bf366004612145565b610b86565b3480156103d057600080fd5b5061019a61127d565b3480156103e557600080fd5b506101706103f4366004611f5a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561042e57600080fd5b506101ff61043d366004611f3f565b611362565b60006301ffc9a760e01b6001600160e01b03198316148061047357506380ac58cd60e01b6001600160e01b03198316145b8061048e5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546104a390612e12565b80601f01602080910402602001604051908101604052809291908181526020018280546104cf90612e12565b801561051c5780601f106104f15761010080835404028352916020019161051c565b820191906000526020600020905b8154815290600101906020018083116104ff57829003601f168201915b5050505050905090565b600061053182611403565b61054e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610575826107fe565b9050336001600160a01b038216146105ae5761059181336103f4565b6105ae576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106158261142a565b9050836001600160a01b0316816001600160a01b0316146106485760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176106955761067886336103f4565b61069557604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166106bc57604051633a954ecd60e21b815260040160405180910390fd5b80156106c757600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661075257600184016000818152600460205260409020546107505760005481146107505760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6008546001600160a01b036101009091041633146107d45760405162461bcd60e51b81526004016107cb90612d4f565b60405180910390fd5b6107dc611492565b565b6107f983838360405180602001604052806000815250610b3c565b505050565b600061048e8261142a565b60006001600160a01b038216610832576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b036101009091041633146108885760405162461bcd60e51b81526004016107cb90612d4f565b6107dc6000611525565b6008546001600160a01b036101009091041633146108c25760405162461bcd60e51b81526004016107cb90612d4f565b6107dc61157f565b6008546001600160a01b036101009091041633146108fa5760405162461bcd60e51b81526004016107cb90612d4f565b6008546107dc9061010090046001600160a01b0316476115fa565b6060600380546104a390612e12565b60006109336001546000540390565b9050600082116109855760405162461bcd60e51b815260206004820152601c60248201527f436f756e74206d7573742062652067726561746572207468616e20300000000060448201526064016107cb565b600382106109d55760405162461bcd60e51b815260206004820152601960248201527f436f756e74206d757374206265206c657373207468616e20330000000000000060448201526064016107cb565b6108006109e28383612d84565b1115610a445760405162461bcd60e51b815260206004820152602b60248201527f52657175657374656420616d6f756e742065786365656473207768617420697360448201526a20617661696c61626c652160a81b60648201526084016107cb565b610800811115610a8e5760405162461bcd60e51b81526020600482015260156024820152742737ba1032b737bab3b41030bb30b4b630b136329760591b60448201526064016107cb565b610a988282611690565b610aa2338361195e565b5050565b6001600160a01b038216331415610ad05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b4784848461060a565b6001600160a01b0383163b15610b8057610b6384848484611978565b610b80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610b956001546000540390565b8210610be35760405162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420646f6573206e6f742065786973742e000000000000000060448201526064016107cb565b606080610bee611e0c565b604080516008808252610120820190925260009182918291829190816020015b6060815260200190600190039081610c0e579050509050600093505b60008981526009602052604090206001015484101561121c576000898152600960209081526040808320878452909152908190208151610140810190925281608081018260068282826020028201915b815481526020019060010190808311610c7a575050505050815260200160068201548152602001600782015481526020016008820154815250509450600092505b846040015183101561120a57610cd084611a70565b610cd984611a70565b604051602001610cea9291906124c6565b60405160208183030381529060405281600081518110610d0c57610d0c612ea8565b6020026020010181905250610d2084611a70565b610d2984611a70565b604051602001610d3a929190612429565b60405160208183030381529060405281600181518110610d5c57610d5c612ea8565b60209081029190910101528451610d7a9060005b6020020151611a70565b8551610d87906001610d70565b8651610d94906002610d70565b8751610da1906003610d70565b604051602001610db49493929190612306565b60405160208183030381529060405281600281518110610dd657610dd6612ea8565b60209081029190910101528451610dee906002610d70565b8551610dfb906003610d70565b8651610e08906004610d70565b8751610e15906005610d70565b604051602001610e28949392919061227a565b60405160208183030381529060405281600381518110610e4a57610e4a612ea8565b60209081029190910101528451610e62906002610d70565b8551610e6f906003610d70565b8651610e7c906002610d70565b8751610e89906003610d70565b604051602001610e9c9493929190612397565b60405160208183030381529060405281600481518110610ebe57610ebe612ea8565b6020026020010181905250610ed68560200151611a70565b60008411610ef35760405180602001604052806000815250610f26565b610efc85611a70565b610f0585611a70565b604051602001610f16929190612bd9565b6040516020818303038152906040525b604051602001610f37929190612c44565b60405160208183030381529060405281600581518110610f5957610f59612ea8565b6020026020010181905250610f718560200151611a70565b610f7a85611a70565b60008511610f975760405180602001604052806000815250610fc0565b610fa085611a70565b604051602001610fb091906126eb565b6040516020818303038152906040525b604051602001610fd2939291906125e4565b60405160208183030381529060405281600681518110610ff457610ff4612ea8565b6020026020010181905250868160008151811061101357611013612ea8565b60200260200101518260018151811061102e5761102e612ea8565b60200260200101518360028151811061104957611049612ea8565b60200260200101518460038151811061106457611064612ea8565b60200260200101518560048151811061107f5761107f612ea8565b60200260200101518660058151811061109a5761109a612ea8565b6020026020010151876006815181106110b5576110b5612ea8565b60200260200101516040516020016110d49897969594939291906121d5565b6040516020818303038152906040529650600091505b84606001518210156111f8576110ff84611a70565b61110884611a70565b611168611116600286612e68565b1561112257600061113e565b6060880151611132906002612db0565b61113e90610168612d9c565b606089015161114f90610168612d9c565b6111599087612db0565b6111639190612d84565b611a70565b60405160200161117a9392919061252b565b6040516020818303038152906040528160078151811061119c5761119c612ea8565b602002602001018190525085816007815181106111bb576111bb612ea8565b60200260200101516040516020016111d49291906121a6565b604051602081830303815290604052955081806111f090612e4d565b9250506110ea565b8261120281612e4d565b935050610cbb565b8361121481612e4d565b945050610c2a565b6112506112288a611a70565b888860405160200161123c9392919061271f565b604051602081830303815290604052611b6e565b6040516020016112609190612b94565b604051602081830303815290604052975050505050505050919050565b606061133e60405160200161123c907f7b226465736372697074696f6e223a2022416e206f6e2d636861696e20282a2981527f70696563652e222c226e616d65223a224879706e6575737973222c22696d616760208201527f65223a223c7376672076696577426f783d5c2230203020313238203132385c2260408201527f20786d6c6e733d5c22687474703a2f2f7777772e77332e6f72672f323030302f60608201526d7376675c223e3c2f7376673e227d60901b6080820152608e0190565b60405160200161134e9190612b94565b604051602081830303815290604052905090565b6008546001600160a01b036101009091041633146113925760405162461bcd60e51b81526004016107cb90612d4f565b6001600160a01b0381166113f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107cb565b61140081611525565b50565b600080548210801561048e575050600090815260046020526040902054600160e01b161590565b60008160005481101561147957600081815260046020526040902054600160e01b8116611477575b80611470575060001901600081815260046020526040902054611452565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60085460ff166114db5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107cb565b6008805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16156115c55760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016107cb565b6008805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115083390565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611647576040519150601f19603f3d011682016040523d82523d6000602084013e61164c565b606091505b50509050806107f95760405162461bcd60e51b815260206004820152601060248201526f2932b1b7bb32b93c903330b4b632b21760811b60448201526064016107cb565b600461169a611e3a565b6116a2611e67565b6000805b868110156119555760006116ba8288612d84565b6000818152600960205260408120600181018990559192505b8781101561193e5760005b60028110156117e1574233858484604051602001611700959493929190612cd4565b60408051601f1981840301815291905280516020909101209550611725600887612e68565b88836004811061173757611737612ea8565b6020020151826002811061174d5761174d612ea8565b6020020152600288836004811061176657611766612ea8565b6020020151826002811061177c5761177c612ea8565b602002015161178b9190612e68565b156117cf5760018883600481106117a4576117a4612ea8565b602002015182600281106117ba576117ba612ea8565b602002018181516117cb9190612d84565b9052505b806117d981612e4d565b9150506116de565b5060005b600681101561186c574233858484604051602001611807959493929190612cd4565b60408051601f198184030181529190528051602090910120955061182d61010087612e68565b87836004811061183f5761183f612ea8565b6020020151826006811061185557611855612ea8565b60200201528061186481612e4d565b9150506117e5565b50604051806080016040528087836004811061188a5761188a612ea8565b602002015181526020018883600481106118a6576118a6612ea8565b6020020151516118b7906008612d84565b8152602001600481526020018883600481106118d5576118d5612ea8565b6020020151600160200201516118ec906004612d84565b90526000828152602084905260409020815161190b9082906006611e94565b5060208201516006820155604082015160078201556060909101516008909101558061193681612e4d565b9150506116d3565b50505060018161194e9190612d84565b90506116a6565b50505050505050565b610aa2828260405180602001604052806000815250611cc2565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119ad903390899088908890600401612d09565b602060405180830381600087803b1580156119c757600080fd5b505af19250505080156119f7575060408051601f3d908101601f191682019092526119f491810190612128565b60015b611a52573d808015611a25576040519150601f19603f3d011682016040523d82523d6000602084013e611a2a565b606091505b508051611a4a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606081611a945750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611abe5780611aa881612e4d565b9150611ab79050600a83612d9c565b9150611a98565b60008167ffffffffffffffff811115611ad957611ad9612ebe565b6040519080825280601f01601f191660200182016040528015611b03576020820181803683370190505b5090505b8415611a6857611b18600183612dcf565b9150611b25600a86612e68565b611b30906030612d84565b60f81b818381518110611b4557611b45612ea8565b60200101906001600160f81b031916908160001a905350611b67600a86612d9c565b9450611b07565b6060815160001415611b8e57505060408051602081019091526000815290565b6000604051806060016040528060408152602001612eeb6040913990506000600384516002611bbd9190612d84565b611bc79190612d9c565b611bd2906004612db0565b67ffffffffffffffff811115611bea57611bea612ebe565b6040519080825280601f01601f191660200182016040528015611c14576020820181803683370190505b509050600182016020820185865187015b80821015611c80576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250611c25565b5050600386510660018114611c9c5760028114611caf57611cb7565b603d6001830353603d6002830353611cb7565b603d60018303535b509195945050505050565b611ccc8383611d2f565b6001600160a01b0383163b156107f9576000548281035b611cf66000868380600101945086611978565b611d13576040516368d2bf6b60e11b815260040160405180910390fd5b818110611ce3578160005414611d2857600080fd5b5050505050565b6000546001600160a01b038316611d5857604051622e076360e81b815260040160405180910390fd5b81611d765760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038316600081815260056020526040902080546801000000000000000185020190554260a01b6001841460e11b1717600082815260046020526040902055808281015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611dc05760005550505050565b6040518060800160405280611e1f611ed2565b81526020016000815260200160008152602001600081525090565b60405180608001604052806004905b611e51611ef0565b815260200190600190039081611e495790505090565b60405180608001604052806004905b611e7e611ed2565b815260200190600190039081611e765790505090565b8260068101928215611ec2579160200282015b82811115611ec2578251825591602001919060010190611ea7565b50611ece929150611f0e565b5090565b6040518060c001604052806006906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b5b80821115611ece5760008155600101611f0f565b80356001600160a01b0381168114611f3a57600080fd5b919050565b600060208284031215611f5157600080fd5b61147082611f23565b60008060408385031215611f6d57600080fd5b611f7683611f23565b9150611f8460208401611f23565b90509250929050565b600080600060608486031215611fa257600080fd5b611fab84611f23565b9250611fb960208501611f23565b9150604084013590509250925092565b60008060008060808587031215611fdf57600080fd5b611fe885611f23565b9350611ff660208601611f23565b925060408501359150606085013567ffffffffffffffff8082111561201a57600080fd5b818701915087601f83011261202e57600080fd5b81358181111561204057612040612ebe565b604051601f8201601f19908116603f0116810190838211818310171561206857612068612ebe565b816040528281528a602084870101111561208157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120b857600080fd5b6120c183611f23565b9150602083013580151581146120d657600080fd5b809150509250929050565b600080604083850312156120f457600080fd5b6120fd83611f23565b946020939093013593505050565b60006020828403121561211d57600080fd5b813561147081612ed4565b60006020828403121561213a57600080fd5b815161147081612ed4565b60006020828403121561215757600080fd5b5035919050565b60008151808452612176816020860160208601612de6565b601f01601f19169290920160200192915050565b6000815161219c818560208601612de6565b9290920192915050565b600083516121b8818460208801612de6565b8351908301906121cc818360208801612de6565b01949350505050565b6000895160206121e88285838f01612de6565b8a51918401916121fb8184848f01612de6565b8a5192019161220d8184848e01612de6565b895192019161221f8184848d01612de6565b88519201916122318184848c01612de6565b87519201916122438184848b01612de6565b86519201916122558184848a01612de6565b85519201916122678184848901612de6565b919091019b9a5050505050505050505050565b6000855161228c818460208a01612de6565b8083019050600b60fa1b80825286516122ac816001850160208b01612de6565b613b6d60f01b6001939091019283015285516122cf816003850160208a01612de6565b600392019182015283516122ea816004840160208801612de6565b601b60fa1b600492909101918201526005019695505050505050565b60008551612318818460208a01612de6565b600b60fa1b9083019081528551612336816001840160208a01612de6565b601b60fa1b600192909101918201528451612358816002840160208901612de6565b612c2d60f01b60029290910191820152835161237b816004840160208801612de6565b600160fd1b600492909101918201526005019695505050505050565b600085516123a9818460208a01612de6565b612c2d60f01b90830190815285516123c8816002840160208a01612de6565b600160fd1b6002929091019182015284516123ea816003840160208901612de6565b600b60fa1b60039290910191820152835161240c816004840160208801612de6565b613b6d60f01b600492909101918201526006019695505050505050565b6e03c616e696d6174652069643d5c227608c1b8152825160009061245481600f850160208801612de6565b602d60f81b600f918401918201528351612475816010840160208801612de6565b7f5c22206174747269627574654e616d653d5c22645c222076616c7565733d5c2260109290910191820152716d3531322c3531326c302c3020302c303b6d60701b6030820152604201949350505050565b6b1e3830ba341034b21eae113960a11b815282516000906124ee81600c850160208801612de6565b602d60f81b600c91840191820152835161250f81600d840160208801612de6565b622e111f60e91b600d9290910191820152601001949350505050565b6d1e3ab9b290343932b31eae1111b960911b8152835160009061255581600e850160208901612de6565b602d60f81b600e91840191820152845161257681600f840160208901612de6565b750b84440e8e4c2dce6ccdee4da7ab844e4dee8c2e8ca560531b600f929091019182015283516125ad816025840160208801612de6565b7f2c2035313220353132295c222066696c6c3d5c2277686974655c22202f3e00006025929091019182015260430195945050505050565b7f3c616e696d617465206174747269627574654e616d653d5c227374726f6b652d81527f77696474685c222076616c7565733d5c22303b343b343b343b305c22206475726020820152621eae1160e91b60408201526000845161264e816043850160208901612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220626043918401918201526706567696e3d5c22760c41b6063820152845161269c81606b840160208901612de6565b671698173132b3b4b760c11b606b929091019182015283516126c5816073840160208801612de6565b6b2e1110179f1e17b830ba341f60a11b60739290910191820152607f0195945050505050565b602b60f81b815260008251612707816001850160208701612de6565b607360f81b6001939091019283015250600201919050565b7f7b226465736372697074696f6e223a22416e206f6e2d636861696e20282a297081527f696563652e222c226e616d65223a224879706e6575737973202300000000000060208201526000845161277d81603a850160208901612de6565b7f222c22696d616765223a223c7376672076696577426f783d5c22302030203130603a918401918201527f323420313032345c222077696474683d5c22313032345c22206865696768743d605a8201527f5c22313032345c2220786d6c6e733d5c22687474703a2f2f7777772e77332e6f607a8201527f72672f323030302f7376675c22207374796c653d5c226261636b67726f756e64609a8201526f1d3bb434ba329dae111f1e3232b3399f60811b60ba8201527f3c66696c7465722069643d5c2264726f705c2220636f6c6f722d696e7465727060ca8201527f6f6c6174696f6e2d66696c746572733d5c22735247425c223e3c666544726f7060ea8201527f536861646f772064783d5c22345c222064793d5c22345c22207374644465766961010a8201527f6174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c222061012a8201527f666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c666544726f7061014a8201527f536861646f772064783d5c222d345c222064793d5c222d345c2220737464446561016a8201527f76696174696f6e3d5c22325c2220666c6f6f642d6f7061636974793d5c22315c61018a8201527f2220666c6f6f642d636f6c6f723d5c22234343434343435c222f3e3c2f66696c6101aa820152633a32b91f60e11b6101ca820152612b8a612a69612a6361298d6101ce85018961218a565b7f3c2f646566733e3c672066696c7465723d5c2275726c282364726f70295c223e81527f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60208201527f5c227472616e73666f726d5c2220747970653d5c22726f746174655c2220667260408201527f6f6d3d5c223020353132203531325c2220746f3d5c223336302035313220353160608201527f325c22206475723d5c223330735c2220726570656174436f756e743d5c22696e60808201526b3232b334b734ba32ae11179f60a11b60a082015260ac0190565b8661218a565b7f3c2f673e3c6d61736b2069643d5c226375745c223e3c7265637420776964746881527f3d5c22313030255c22206865696768743d5c22313030255c222066696c6c3d5c60208201527f2277686974655c222f3e3c636972636c652063783d5c223531325c222063793d60408201527f5c223531325c2220723d5c223531325c222066696c6c3d5c222330323037356460608201527f5c222f3e3c2f6d61736b3e3c7265637420783d5c22305c2220793d5c22305c2260808201527f2077696474683d5c22313032345c22206865696768743d5c22313032345c222060a08201527f6d61736b3d5c2275726c2823637574295c222066696c6c3d5c2277686974655c60c08201526a222f3e3c2f7376673e227d60a81b60e082015260eb0190565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251612bcc81601d850160208701612de6565b91909101601d0192915050565b680626567696e3d5c22760bc1b81528251600090612bfe816009850160208801612de6565b682d302e626567696e2b60b81b6009918401918201528351612c27816012840160208801612de6565b63039ae11160e51b60129290910191820152601601949350505050565b7f3531322c3531326c302c3020302c305c22206475723d5c220000000000000000815260008351612c7c816018850160208801612de6565b7f735c2220726570656174436f756e743d5c22696e646566696e6974655c2220006018918401918201528351612cb9816037840160208801612de6565b61179f60f11b60379290910191820152603901949350505050565b94855260609390931b6bffffffffffffffffffffffff1916602085015260348401919091526054830152607482015260940190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8a9083018461215e565b602081526000611470602083018461215e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612d9757612d97612e7c565b500190565b600082612dab57612dab612e92565b500490565b6000816000190483118215151615612dca57612dca612e7c565b500290565b600082821015612de157612de1612e7c565b500390565b60005b83811015612e01578181015183820152602001612de9565b83811115610b805750506000910152565b600181811c90821680612e2657607f821691505b60208210811415612e4757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e6157612e61612e7c565b5060010190565b600082612e7757612e77612e92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461140057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220884717097ea6f3dd98a8431f578279feabc06e75e3a6439e186b80c006ebf8c564736f6c63430008070033

Deployed Bytecode Sourcemap

62641:8237:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32509:615;;;;;;;;;;-1:-1:-1;32509:615:0;;;;;:::i;:::-;;:::i;:::-;;;24516:14:1;;24509:22;24491:41;;24479:2;24464:18;32509:615:0;;;;;;;;38156:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40102:204::-;;;;;;;;;;-1:-1:-1;40102:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;23803:32:1;;;23785:51;;23773:2;23758:18;40102:204:0;23639:203:1;39650:386:0;;;;;;;;;;-1:-1:-1;39650:386:0;;;;;:::i;:::-;;:::i;:::-;;31563:315;;;;;;;;;;-1:-1:-1;31829:12:0;;31616:7;31813:13;:28;31563:315;;;28557:25:1;;;28545:2;28530:18;31563:315:0;28411:177:1;49367:2800:0;;;;;;;;;;-1:-1:-1;49367:2800:0;;;;;:::i;:::-;;:::i;62733:41::-;;;;;;;;;;;;62770:4;62733:41;;69365:65;;;;;;;;;;;;;:::i;40992:185::-;;;;;;;;;;-1:-1:-1;40992:185:0;;;;;:::i;:::-;;:::i;4361:86::-;;;;;;;;;;-1:-1:-1;4432:7:0;;;;4361:86;;37945:144;;;;;;;;;;-1:-1:-1;37945:144:0;;;;;:::i;:::-;;:::i;33188:224::-;;;;;;;;;;-1:-1:-1;33188:224:0;;;;;:::i;:::-;;:::i;2501:103::-;;;;;;;;;;;;;:::i;69298:61::-;;;;;;;;;;;;;:::i;69436:111::-;;;:::i;1850:87::-;;;;;;;;;;-1:-1:-1;1923:6:0;;;;;-1:-1:-1;;;;;1923:6:0;1850:87;;38325:104;;;;;;;;;;;;;:::i;63122:477::-;;;;;;:::i;:::-;;:::i;40378:308::-;;;;;;;;;;-1:-1:-1;40378:308:0;;;;;:::i;:::-;;:::i;41248:399::-;;;;;;;;;;-1:-1:-1;41248:399:0;;;;;:::i;:::-;;:::i;64105:5185::-;;;;;;;;;;-1:-1:-1;64105:5185:0;;;;;:::i;:::-;;:::i;63605:492::-;;;;;;;;;;;;;:::i;40757:164::-;;;;;;;;;;-1:-1:-1;40757:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40878:25:0;;;40854:4;40878:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40757:164;2759:201;;;;;;;;;;-1:-1:-1;2759:201:0;;;;;:::i;:::-;;:::i;32509:615::-;32594:4;-1:-1:-1;;;;;;;;;32894:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;32971:25:0;;;32894:102;:179;;;-1:-1:-1;;;;;;;;;;33048:25:0;;;32894:179;32874:199;32509:615;-1:-1:-1;;32509:615:0:o;38156:100::-;38210:13;38243:5;38236:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38156:100;:::o;40102:204::-;40170:7;40195:16;40203:7;40195;:16::i;:::-;40190:64;;40220:34;;-1:-1:-1;;;40220:34:0;;;;;;;;;;;40190:64;-1:-1:-1;40274:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40274:24:0;;40102:204::o;39650:386::-;39723:13;39739:16;39747:7;39739;:16::i;:::-;39723:32;-1:-1:-1;60550:10:0;-1:-1:-1;;;;;39772:28:0;;;39768:175;;39820:44;39837:5;60550:10;40757:164;:::i;39820:44::-;39815:128;;39892:35;;-1:-1:-1;;;39892:35:0;;;;;;;;;;;39815:128;39955:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39955:29:0;-1:-1:-1;;;;;39955:29:0;;;;;;;;;40000:28;;39955:24;;40000:28;;;;;;;39712:324;39650:386;;:::o;49367:2800::-;49501:27;49531;49550:7;49531:18;:27::i;:::-;49501:57;;49616:4;-1:-1:-1;;;;;49575:45:0;49591:19;-1:-1:-1;;;;;49575:45:0;;49571:86;;49629:28;;-1:-1:-1;;;49629:28:0;;;;;;;;;;;49571:86;49671:27;48097:21;;;47924:15;48139:4;48132:36;48221:4;48205:21;;48311:26;;60550:10;49064:30;;;-1:-1:-1;;;;;48762:26:0;;49043:19;;;49040:55;49850:174;;49937:43;49954:4;60550:10;40757:164;:::i;49937:43::-;49932:92;;49989:35;;-1:-1:-1;;;49989:35:0;;;;;;;;;;;49932:92;-1:-1:-1;;;;;50041:16:0;;50037:52;;50066:23;;-1:-1:-1;;;50066:23:0;;;;;;;;;;;50037:52;50238:15;50235:160;;;50378:1;50357:19;50350:30;50235:160;-1:-1:-1;;;;;50773:24:0;;;;;;;:18;:24;;;;;;50771:26;;-1:-1:-1;;50771:26:0;;;50842:22;;;;;;;;;50840:24;;-1:-1:-1;50840:24:0;;;37844:11;37820:22;37816:40;37803:62;-1:-1:-1;;;37803:62:0;51135:26;;;;:17;:26;;;;;:174;-1:-1:-1;;;51429:46:0;;51425:626;;51533:1;51523:11;;51501:19;51656:30;;;:17;:30;;;;;;51652:384;;51794:13;;51779:11;:28;51775:242;;51941:30;;;;:17;:30;;;;;:52;;;51775:242;51482:569;51425:626;52098:7;52094:2;-1:-1:-1;;;;;52079:27:0;52088:4;-1:-1:-1;;;;;52079:27:0;;;;;;;;;;;49490:2677;;;49367:2800;;;:::o;69365:65::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;;;;;;;;;69414:10:::1;:8;:10::i;:::-;69365:65::o:0;40992:185::-;41130:39;41147:4;41153:2;41157:7;41130:39;;;;;;;;;;;;:16;:39::i;:::-;40992:185;;;:::o;37945:144::-;38009:7;38052:27;38071:7;38052:18;:27::i;33188:224::-;33252:7;-1:-1:-1;;;;;33276:19:0;;33272:60;;33304:28;;-1:-1:-1;;;33304:28:0;;;;;;;;;;;33272:60;-1:-1:-1;;;;;;33350:25:0;;;;;:18;:25;;;;;;27743:13;33350:54;;33188:224::o;2501:103::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;2566:30:::1;2593:1;2566:18;:30::i;69298:61::-:0;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;69345:8:::1;:6;:8::i;69436:111::-:0;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;1923:6;;69500:41:::1;::::0;1923:6;;;-1:-1:-1;;;;;1923:6:0;69519:21:::1;69500:9;:41::i;38325:104::-:0;38381:13;38414:7;38407:14;;;;;:::i;63122:477::-;63179:20;63202:13;31829:12;;31616:7;31813:13;:28;;31563:315;63202:13;63179:36;;63238:1;63230:5;:9;63222:57;;;;-1:-1:-1;;;63222:57:0;;28256:2:1;63222:57:0;;;28238:21:1;28295:2;28275:18;;;28268:30;28334;28314:18;;;28307:58;28382:18;;63222:57:0;28054:352:1;63222:57:0;63302:1;63294:5;:9;63286:54;;;;-1:-1:-1;;;63286:54:0;;27549:2:1;63286:54:0;;;27531:21:1;27588:2;27568:18;;;27561:30;27627:27;27607:18;;;27600:55;27672:18;;63286:54:0;27347:349:1;63286:54:0;62770:4;63355:20;63370:5;63355:12;:20;:::i;:::-;:34;;63347:97;;;;-1:-1:-1;;;63347:97:0;;26776:2:1;63347:97:0;;;26758:21:1;26815:2;26795:18;;;26788:30;26854:34;26834:18;;;26827:62;-1:-1:-1;;;26905:18:1;;;26898:41;26956:19;;63347:97:0;26574:407:1;63347:97:0;62770:4;63459:12;:26;;63451:67;;;;-1:-1:-1;;;63451:67:0;;26426:2:1;63451:67:0;;;26408:21:1;26465:2;26445:18;;;26438:30;-1:-1:-1;;;26484:18:1;;;26477:51;26545:18;;63451:67:0;26224:345:1;63451:67:0;63525:33;63538:5;63545:12;63525;:33::i;:::-;63565:28;63575:10;63587:5;63565:9;:28::i;:::-;63172:427;63122:477;:::o;40378:308::-;-1:-1:-1;;;;;40477:31:0;;60550:10;40477:31;40473:61;;;40517:17;;-1:-1:-1;;;40517:17:0;;;;;;;;;;;40473:61;60550:10;40547:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;40547:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;40547:60:0;;;;;;;;;;40623:55;;24491:41:1;;;40547:49:0;;60550:10;40623:55;;24464:18:1;40623:55:0;;;;;;;40378:308;;:::o;41248:399::-;41415:31;41428:4;41434:2;41438:7;41415:12;:31::i;:::-;-1:-1:-1;;;;;41461:14:0;;;:19;41457:183;;41500:56;41531:4;41537:2;41541:7;41550:5;41500:30;:56::i;:::-;41495:145;;41584:40;;-1:-1:-1;;;41584:40:0;;;;;;;;;;;41495:145;41248:399;;;;:::o;64105:5185::-;64217:13;64265;31829:12;;31616:7;31813:13;:28;;31563:315;64265:13;64255:7;:23;64247:60;;;;-1:-1:-1;;;64247:60:0;;27903:2:1;64247:60:0;;;27885:21:1;27942:2;27922:18;;;27915:30;27981:26;27961:18;;;27954:54;28025:18;;64247:60:0;27701:348:1;64247:60:0;64316:17;64342;64368:22;;:::i;:::-;64517:14;;;64529:1;64517:14;;;;;;;;;64399:18;;;;;;;;64517:14;;;;;;;;;;;;;;;;;;;;;64491:40;;64560:1;64547:14;;64542:3369;64576:21;;;;:12;:21;;;;;:32;;;64563:45;;64542:3369;;;64647:21;;;;:12;:21;;;;;;;;:40;;;;;;;;;;64635:52;;;;;;;;;;;;64647:40;64635:52;;64647:40;64635:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64725:1;64713:13;;64708:3194;64740:9;:23;;;64728:9;:35;64708:3194;;;64866:21;:10;:19;:21::i;:::-;64920:20;:9;:18;:20::i;:::-;64805:169;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64791:8;64800:1;64791:11;;;;;;;;:::i;:::-;;;;;;:183;;;;65065:21;:10;:19;:21::i;:::-;65119:20;:9;:18;:20::i;:::-;65001:222;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64987:8;64996:1;64987:11;;;;;;;;:::i;:::-;;;;;;;;;;:236;65281:16;;:30;;:16;:19;;;;;:28;:30::i;:::-;65344:16;;:30;;65361:1;65344:19;;:30;65407:16;;:30;;65424:1;65407:19;;:30;65471:16;;:30;;65488:1;65471:19;;:30;65250:282;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65236:8;65245:1;65236:11;;;;;;;;:::i;:::-;;;;;;;;;;:296;65590:16;;:30;;65607:1;65590:19;;:30;65653:16;;:30;;65670:1;65653:19;;:30;65717:16;;:30;;65734:1;65717:19;;:30;65780:16;;:30;;65797:1;65780:19;;:30;65559:282;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65545:8;65554:1;65545:11;;;;;;;;:::i;:::-;;;;;;;;;;:296;65899:16;;:30;;65916:1;65899:19;;:30;65963:16;;:30;;65980:1;65963:19;;:30;66026:16;;:30;;66043:1;66026:19;;:30;66089:16;;:30;;66106:1;66089:19;;:30;65868:283;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65854:8;65863:1;65854:11;;;;;;;;:::i;:::-;;;;;;:297;;;;66252:29;:9;:18;;;:27;:29::i;:::-;66360:1;66348:9;:13;:152;;;;;;;;;;;;;;;;;66416:21;:10;:19;:21::i;:::-;66450:20;:9;:18;:20::i;:::-;66386:93;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66348:152;66178:369;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66164:8;66173:1;66164:11;;;;;;;;:::i;:::-;;;;;;:383;;;;66694:29;:9;:18;;;:27;:29::i;:::-;66799:21;:10;:19;:21::i;:::-;66873:1;66861:9;:13;:105;;;;;;;;;;;;;;;;;66920:20;:9;:18;:20::i;:::-;66899:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;66861:105;66574:450;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66560:8;66569:1;66560:11;;;;;;;;:::i;:::-;;;;;;:464;;;;67075:4;67094:8;67103:1;67094:11;;;;;;;;:::i;:::-;;;;;;;67120:8;67129:1;67120:11;;;;;;;;:::i;:::-;;;;;;;67146:8;67155:1;67146:11;;;;;;;;:::i;:::-;;;;;;;67172:8;67181:1;67172:11;;;;;;;;:::i;:::-;;;;;;;67198:8;67207:1;67198:11;;;;;;;;:::i;:::-;;;;;;;67224:8;67233:1;67224:11;;;;;;;;:::i;:::-;;;;;;;67250:8;67259:1;67250:11;;;;;;;;:::i;:::-;;;;;;;67044:230;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67037:237;;67307:1;67294:14;;67289:602;67323:9;:24;;;67310:10;:37;67289:602;;;67459:21;:10;:19;:21::i;:::-;67517:20;:9;:18;:20::i;:::-;67597:111;67643:12;67654:1;67643:10;:12;:::i;:::-;:15;:52;;67694:1;67643:52;;;67665:24;;;;:26;;67690:1;67665:26;:::i;:::-;67660:32;;:3;:32;:::i;:::-;67614:24;;;;67610:28;;:3;:28;:::i;:::-;67598:41;;:10;:41;:::i;:::-;:98;;;;:::i;:::-;67597:109;:111::i;:::-;67392:383;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67378:8;67387:1;67378:11;;;;;;;;:::i;:::-;;;;;;:397;;;;67830:4;67851:8;67860:1;67851:11;;;;;;;;:::i;:::-;;;;;;;67797:80;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67790:87;;67349:12;;;;;:::i;:::-;;;;67289:602;;;64765:11;;;;:::i;:::-;;;;64708:3194;;;64610:12;;;;:::i;:::-;;;;64542:3369;;;68018:1244;68182:18;:7;:16;:18::i;:::-;68699:4;68929;68068:1166;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68018:13;:1244::i;:::-;67945:1328;;;;;;;;:::i;:::-;;;;;;;;;;;;;67921:1361;;;;;;;;;64105:5185;;;:::o;63605:492::-;63664:13;63791:278;63841:200;;;;;;13004:66:1;12992:79;;13101:66;13096:2;13087:12;;13080:88;13198:66;13193:2;13184:12;;13177:88;13295:66;13290:2;13281:12;;13274:88;-1:-1:-1;;;13387:3:1;13378:13;;13371:63;13459:3;13450:13;;12790:679;63791:278:0;63718:362;;;;;;;;:::i;:::-;;;;;;;;;;;;;63694:395;;63605:492;:::o;2759:201::-;1923:6;;-1:-1:-1;;;;;1923:6:0;;;;;60550:10;2070:23;2062:68;;;;-1:-1:-1;;;2062:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2848:22:0;::::1;2840:73;;;::::0;-1:-1:-1;;;2840:73:0;;25329:2:1;2840:73:0::1;::::0;::::1;25311:21:1::0;25368:2;25348:18;;;25341:30;25407:34;25387:18;;;25380:62;-1:-1:-1;;;25458:18:1;;;25451:36;25504:19;;2840:73:0::1;25127:402:1::0;2840:73:0::1;2924:28;2943:8;2924:18;:28::i;:::-;2759:201:::0;:::o;41902:273::-;41959:4;42049:13;;42039:7;:23;41996:152;;;;-1:-1:-1;;42100:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;42100:43:0;:48;;41902:273::o;34862:1129::-;34929:7;34964;35066:13;;35059:4;:20;35055:869;;;35104:14;35121:23;;;:17;:23;;;;;;-1:-1:-1;;;35210:23:0;;35206:699;;35729:113;35736:11;35729:113;;-1:-1:-1;;;35807:6:0;35789:25;;;;:17;:25;;;;;;35729:113;;;35875:6;34862:1129;-1:-1:-1;;;34862:1129:0:o;35206:699::-;35081:843;35055:869;35952:31;;-1:-1:-1;;;35952:31:0;;;;;;;;;;;5420:120;4432:7;;;;4956:41;;;;-1:-1:-1;;;4956:41:0;;24980:2:1;4956:41:0;;;24962:21:1;25019:2;24999:18;;;24992:30;-1:-1:-1;;;25038:18:1;;;25031:50;25098:18;;4956:41:0;24778:344:1;4956:41:0;5479:7:::1;:15:::0;;-1:-1:-1;;5479:15:0::1;::::0;;5510:22:::1;60550:10:::0;5519:12:::1;5510:22;::::0;-1:-1:-1;;;;;23803:32:1;;;23785:51;;23773:2;23758:18;5510:22:0::1;;;;;;;5420:120::o:0;3120:191::-;3213:6;;;-1:-1:-1;;;;;3230:17:0;;;3213:6;3230:17;;;-1:-1:-1;;;;;;3230:17:0;;;;;;3263:40;;3213:6;;;;;;;;3263:40;;3194:16;;3263:40;3183:128;3120:191;:::o;5161:118::-;4432:7;;;;4686:9;4678:38;;;;-1:-1:-1;;;4678:38:0;;26081:2:1;4678:38:0;;;26063:21:1;26120:2;26100:18;;;26093:30;-1:-1:-1;;;26139:18:1;;;26132:46;26195:18;;4678:38:0;25879:340:1;4678:38:0;5221:7:::1;:14:::0;;-1:-1:-1;;5221:14:0::1;5231:4;5221:14;::::0;;5251:20:::1;5258:12;60550:10:::0;;60463:105;69553:173;69626:12;69644:8;-1:-1:-1;;;;;69644:13:0;69665:7;69644:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69625:52;;;69692:7;69684:36;;;;-1:-1:-1;;;69684:36:0;;25736:2:1;69684:36:0;;;25718:21:1;25775:2;25755:18;;;25748:30;-1:-1:-1;;;25794:18:1;;;25787:46;25850:18;;69684:36:0;25534:340:1;69732:1143:0;69832:1;69840:29;;:::i;:::-;69876:30;;:::i;:::-;69913:18;;69940:930;69964:9;69960:1;:13;69940:930;;;69992:19;70014:12;70025:1;70014:8;:12;:::i;:::-;70035:27;70065:25;;;:12;:25;;;;;70099:19;;;:31;;;69992:34;;-1:-1:-1;70141:722:0;70162:9;70158:1;:13;70141:722;;;70193:9;70189:257;70211:1;70207;:5;70189:257;;;70279:15;70296:10;70308:11;70321:1;70324;70262:64;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70262:64:0;;;;;;;;;70252:75;;70262:64;70252:75;;;;;-1:-1:-1;70358:14:0;70371:1;70252:75;70358:14;:::i;:::-;70341:8;70350:1;70341:11;;;;;;;:::i;:::-;;;;;70353:1;70341:14;;;;;;;:::i;:::-;;;;:31;70406:1;70389:8;70398:1;70389:11;;;;;;;:::i;:::-;;;;;70401:1;70389:14;;;;;;;:::i;:::-;;;;;:18;;;;:::i;:::-;:23;70385:48;;70432:1;70414:8;70423:1;70414:11;;;;;;;:::i;:::-;;;;;70426:1;70414:14;;;;;;;:::i;:::-;;;;:19;;;;;;;:::i;:::-;;;-1:-1:-1;70385:48:0;70214:3;;;;:::i;:::-;;;;70189:257;;;;70460:9;70456:198;70478:1;70474;:5;70456:198;;;70546:15;70563:10;70575:11;70588:1;70591;70529:64;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;70529:64:0;;;;;;;;;70519:75;;70529:64;70519:75;;;;;-1:-1:-1;70626:16:0;70639:3;70519:75;70626:16;:::i;:::-;70608:9;70618:1;70608:12;;;;;;;:::i;:::-;;;;;70621:1;70608:15;;;;;;;:::i;:::-;;;;:34;70481:3;;;;:::i;:::-;;;;70456:198;;;;70685:168;;;;;;;;70712:9;70722:1;70712:12;;;;;;;:::i;:::-;;;;;70685:168;;;;70747:8;70756:1;70747:11;;;;;;;:::i;:::-;;;;;:14;:18;;70764:1;70747:18;:::i;:::-;70685:168;;;;70840:1;70685:168;;;;70794:8;70803:1;70794:11;;;;;;;:::i;:::-;;;;;70806:1;70794:14;;;;:18;;70811:1;70794:18;:::i;:::-;70685:168;;70664:15;:18;;;;;;;;;;:189;;;;:18;;:189;;:::i;:::-;-1:-1:-1;70664:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;70173:3;;;;:::i;:::-;;;;70141:722;;;;69983:887;;69980:1;69975:6;;;;;:::i;:::-;;;69940:930;;;;69805:1070;;;;69732:1143;;:::o;42259:104::-;42328:27;42338:2;42342:8;42328:27;;;;;;;;;;;;:9;:27::i;56118:716::-;56302:88;;-1:-1:-1;;;56302:88:0;;56281:4;;-1:-1:-1;;;;;56302:45:0;;;;;:88;;60550:10;;56369:4;;56375:7;;56384:5;;56302:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56302:88:0;;;;;;;;-1:-1:-1;;56302:88:0;;;;;;;;;;;;:::i;:::-;;;56298:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56585:13:0;;56581:235;;56631:40;;-1:-1:-1;;;56631:40:0;;;;;;;;;;;56581:235;56774:6;56768:13;56759:6;56755:2;56751:15;56744:38;56298:529;-1:-1:-1;;;;;;56461:64:0;-1:-1:-1;;;56461:64:0;;-1:-1:-1;56298:529:0;56118:716;;;;;;:::o;12779:723::-;12835:13;13056:10;13052:53;;-1:-1:-1;;13083:10:0;;;;;;;;;;;;-1:-1:-1;;;13083:10:0;;;;;12779:723::o;13052:53::-;13130:5;13115:12;13171:78;13178:9;;13171:78;;13204:8;;;;:::i;:::-;;-1:-1:-1;13227:10:0;;-1:-1:-1;13235:2:0;13227:10;;:::i;:::-;;;13171:78;;;13259:19;13291:6;13281:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13281:17:0;;13259:39;;13309:154;13316:10;;13309:154;;13343:11;13353:1;13343:11;;:::i;:::-;;-1:-1:-1;13412:10:0;13420:2;13412:5;:10;:::i;:::-;13399:24;;:2;:24;:::i;:::-;13386:39;;13369:6;13376;13369:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13369:56:0;;;;;;;;-1:-1:-1;13440:11:0;13449:2;13440:11;;:::i;:::-;;;13309:154;;15002:3053;15060:13;15297:4;:11;15312:1;15297:16;15293:31;;;-1:-1:-1;;15315:9:0;;;;;;;;;-1:-1:-1;15315:9:0;;;15002:3053::o;15293:31::-;15377:19;15399:6;;;;;;;;;;;;;;;;;15377:28;;15816:20;15875:1;15856:4;:11;15870:1;15856:15;;;;:::i;:::-;15855:21;;;;:::i;:::-;15850:27;;:1;:27;:::i;:::-;15839:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15839:39:0;;15816:62;;16014:1;16007:5;16003:13;16118:2;16110:6;16106:15;16229:4;16281;16275:11;16269:4;16265:22;16191:1432;16315:6;16306:7;16303:19;16191:1432;;;16421:1;16412:7;16408:15;16397:26;;16460:7;16454:14;17113:4;17105:5;17101:2;17097:14;17093:25;17083:8;17079:40;17073:47;17062:9;17054:67;17167:1;17156:9;17152:17;17139:30;;17259:4;17251:5;17247:2;17243:14;17239:25;17229:8;17225:40;17219:47;17208:9;17200:67;17313:1;17302:9;17298:17;17285:30;;17404:4;17396:5;17393:1;17389:13;17385:24;17375:8;17371:39;17365:46;17354:9;17346:66;17458:1;17447:9;17443:17;17430:30;;17541:4;17534:5;17530:16;17520:8;17516:31;17510:38;17499:9;17491:58;;17595:1;17584:9;17580:17;17567:30;;16191:1432;;;16195:107;;17785:1;17778:4;17772:11;17768:19;17806:1;17801:123;;;;17943:1;17938:73;;;;17761:250;;17801:123;17854:4;17850:1;17839:9;17835:17;17827:32;17904:4;17900:1;17889:9;17885:17;17877:32;17801:123;;17938:73;17991:4;17987:1;17976:9;17972:17;17964:32;17761:250;-1:-1:-1;18041:6:0;;15002:3053;-1:-1:-1;;;;;15002:3053:0:o;42779:681::-;42902:19;42908:2;42912:8;42902:5;:19::i;:::-;-1:-1:-1;;;;;42963:14:0;;;:19;42959:483;;43003:11;43017:13;43065:14;;;43098:233;43129:62;43168:1;43172:2;43176:7;;;;;;43185:5;43129:30;:62::i;:::-;43124:167;;43227:40;;-1:-1:-1;;;43227:40:0;;;;;;;;;;;43124:167;43326:3;43318:5;:11;43098:233;;43413:3;43396:13;;:20;43392:34;;43418:8;;;43392:34;42984:458;;42779:681;;;:::o;43733:1529::-;43798:20;43821:13;-1:-1:-1;;;;;43849:16:0;;43845:48;;43874:19;;-1:-1:-1;;;43874:19:0;;;;;;;;;;;43845:48;43908:13;43904:44;;43930:18;;-1:-1:-1;;;43930:18:0;;;;;;;;;;;43904:44;-1:-1:-1;;;;;44436:22:0;;;;;;:18;:22;;27880:2;44436:22;;:70;;44474:31;44462:44;;44436:70;;;37844:11;37820:22;37816:40;-1:-1:-1;39554:15:0;;39529:23;39525:45;37813:51;37803:62;44749:31;;;;:17;:31;;;;;:173;44767:12;44998:23;;;45036:101;45063:35;;45088:9;;;;;-1:-1:-1;;;;;45063:35:0;;;45080:1;;45063:35;;45080:1;;45063:35;45132:3;45122:7;:13;45036:101;;45153:13;:19;-1:-1:-1;40992:185:0;;;:::o;-1:-1:-1:-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:268::-;3476:3;3514:5;3508:12;3541:6;3536:3;3529:19;3557:63;3613:6;3606:4;3601:3;3597:14;3590:4;3583:5;3579:16;3557:63;:::i;:::-;3674:2;3653:15;-1:-1:-1;;3649:29:1;3640:39;;;;3681:4;3636:50;;3424:268;-1:-1:-1;;3424:268:1:o;3697:184::-;3738:3;3776:5;3770:12;3791:52;3836:6;3831:3;3824:4;3817:5;3813:16;3791:52;:::i;:::-;3859:16;;;;;3697:184;-1:-1:-1;;3697:184:1:o;5330:466::-;5505:3;5543:6;5537:13;5559:53;5605:6;5600:3;5593:4;5585:6;5581:17;5559:53;:::i;:::-;5675:13;;5634:16;;;;5697:57;5675:13;5634:16;5731:4;5719:17;;5697:57;:::i;:::-;5770:20;;5330:466;-1:-1:-1;;;;5330:466:1:o;5801:1625::-;6252:3;6290:6;6284:13;6316:4;6329:51;6373:6;6368:3;6363:2;6355:6;6351:15;6329:51;:::i;:::-;6443:13;;6402:16;;;;6465:55;6443:13;6402:16;6487:15;;;6465:55;:::i;:::-;6587:13;;6542:20;;;6609:55;6587:13;6542:20;6631:15;;;6609:55;:::i;:::-;6731:13;;6686:20;;;6753:55;6731:13;6686:20;6775:15;;;6753:55;:::i;:::-;6875:13;;6830:20;;;6897:55;6875:13;6830:20;6919:15;;;6897:55;:::i;:::-;7019:13;;6974:20;;;7041:55;7019:13;6974:20;7063:15;;;7041:55;:::i;:::-;7163:13;;7118:20;;;7185:55;7163:13;7118:20;7207:15;;;7185:55;:::i;:::-;7307:13;;7262:20;;;7329:55;7307:13;7262:20;7351:15;;;7329:55;:::i;:::-;7400:20;;;;;5801:1625;-1:-1:-1;;;;;;;;;;;5801:1625:1:o;7431:1441::-;8110:3;8148:6;8142:13;8164:53;8210:6;8205:3;8198:4;8190:6;8186:17;8164:53;:::i;:::-;8248:6;8243:3;8239:16;8226:29;;-1:-1:-1;;;8300:2:1;8293:5;8286:17;8334:6;8328:13;8350:65;8406:8;8402:1;8395:5;8391:13;8384:4;8376:6;8372:17;8350:65;:::i;:::-;-1:-1:-1;;;8478:1:1;8434:20;;;;8470:10;;;8463:24;8512:13;;8534:62;8512:13;8583:1;8575:10;;8568:4;8556:17;;8534:62;:::i;:::-;8656:1;8615:17;;8648:10;;;8641:22;8688:13;;8710:62;8688:13;8759:1;8751:10;;8744:4;8732:17;;8710:62;:::i;:::-;-1:-1:-1;;;8832:1:1;8791:17;;;;8824:10;;;8817:23;8864:1;8856:10;;7431:1441;-1:-1:-1;;;;;;7431:1441:1:o;8877:1421::-;9556:3;9594:6;9588:13;9610:53;9656:6;9651:3;9644:4;9636:6;9632:17;9610:53;:::i;:::-;-1:-1:-1;;;9685:16:1;;;9710:18;;;9753:13;;9775:65;9753:13;9827:1;9816:13;;9809:4;9797:17;;9775:65;:::i;:::-;-1:-1:-1;;;9903:1:1;9859:20;;;;9895:10;;;9888:23;9936:13;;9958:62;9936:13;10007:1;9999:10;;9992:4;9980:17;;9958:62;:::i;:::-;-1:-1:-1;;;10080:1:1;10039:17;;;;10072:10;;;10065:24;10114:13;;10136:62;10114:13;10185:1;10177:10;;10170:4;10158:17;;10136:62;:::i;:::-;-1:-1:-1;;;10258:1:1;10217:17;;;;10250:10;;;10243:23;10290:1;10282:10;;8877:1421;-1:-1:-1;;;;;;8877:1421:1:o;10303:1422::-;10982:3;11020:6;11014:13;11036:53;11082:6;11077:3;11070:4;11062:6;11058:17;11036:53;:::i;:::-;-1:-1:-1;;;11111:16:1;;;11136:19;;;11180:13;;11202:65;11180:13;11254:1;11243:13;;11236:4;11224:17;;11202:65;:::i;:::-;-1:-1:-1;;;11330:1:1;11286:20;;;;11322:10;;;11315:23;11363:13;;11385:62;11363:13;11434:1;11426:10;;11419:4;11407:17;;11385:62;:::i;:::-;-1:-1:-1;;;11507:1:1;11466:17;;;;11499:10;;;11492:23;11540:13;;11562:62;11540:13;11611:1;11603:10;;11596:4;11584:17;;11562:62;:::i;:::-;-1:-1:-1;;;11684:1:1;11643:17;;;;11676:10;;;11669:24;11717:1;11709:10;;10303:1422;-1:-1:-1;;;;;;10303:1422:1:o;11730:1055::-;-1:-1:-1;;;12230:55:1;;12308:13;;12212:3;;12330:62;12308:13;12380:2;12371:12;;12364:4;12352:17;;12330:62;:::i;:::-;-1:-1:-1;;;12451:2:1;12411:16;;;12443:11;;;12436:24;12485:13;;12507:63;12485:13;12556:2;12548:11;;12541:4;12529:17;;12507:63;:::i;:::-;12635:66;12630:2;12589:17;;;;12622:11;;;12615:87;-1:-1:-1;;;12726:2:1;12718:11;;12711:41;12776:2;12768:11;;11730:1055;-1:-1:-1;;;;11730:1055:1:o;13474:950::-;-1:-1:-1;;;13974:49:1;;14046:13;;13956:3;;14068:62;14046:13;14118:2;14109:12;;14102:4;14090:17;;14068:62;:::i;:::-;-1:-1:-1;;;14189:2:1;14149:16;;;14181:11;;;14174:24;14223:13;;14245:63;14223:13;14294:2;14286:11;;14279:4;14267:17;;14245:63;:::i;:::-;-1:-1:-1;;;14368:2:1;14327:17;;;;14360:11;;;14353:38;14415:2;14407:11;;13474:950;-1:-1:-1;;;;13474:950:1:o;14429:1383::-;-1:-1:-1;;;15078:53:1;;15154:13;;15060:3;;15176:62;15154:13;15226:2;15217:12;;15210:4;15198:17;;15176:62;:::i;:::-;-1:-1:-1;;;15297:2:1;15257:16;;;15289:11;;;15282:24;15331:13;;15353:63;15331:13;15402:2;15394:11;;15387:4;15375:17;;15353:63;:::i;:::-;-1:-1:-1;;;15476:2:1;15435:17;;;;15468:11;;;15461:76;15562:13;;15584:63;15562:13;15633:2;15625:11;;15618:4;15606:17;;15584:63;:::i;:::-;15712:66;15707:2;15666:17;;;;15699:11;;;15692:87;15803:2;15795:11;;14429:1383;-1:-1:-1;;;;;14429:1383:1:o;15817:1599::-;16478:66;16473:3;16466:79;16575:66;16570:2;16565:3;16561:12;16554:88;16681:7;16676:3;16672:17;16667:2;16662:3;16658:12;16651:39;16448:3;16719:6;16713:13;16735:60;16788:6;16783:2;16778:3;16774:12;16769:2;16761:6;16757:15;16735:60;:::i;:::-;16859:66;16854:2;16814:16;;;16846:11;;;16839:87;-1:-1:-1;;;16950:2:1;16942:11;;16935:49;17009:13;;17031:62;17009:13;17078:3;17070:12;;17065:2;17053:15;;17031:62;:::i;:::-;-1:-1:-1;;;17153:3:1;17112:17;;;;17145:12;;;17138:32;17195:13;;17217:62;17195:13;17264:3;17256:12;;17251:2;17239:15;;17217:62;:::i;:::-;-1:-1:-1;;;17339:3:1;17298:17;;;;17331:12;;;17324:58;17406:3;17398:12;;15817:1599;-1:-1:-1;;;;;15817:1599:1:o;17421:572::-;-1:-1:-1;;;17779:3:1;17772:16;17754:3;17817:6;17811:13;17833:61;17887:6;17883:1;17878:3;17874:11;17867:4;17859:6;17855:17;17833:61;:::i;:::-;-1:-1:-1;;;17953:1:1;17913:16;;;;17945:10;;;17938:23;-1:-1:-1;17985:1:1;17977:10;;17421:572;-1:-1:-1;17421:572:1:o;17998:2484::-;18756:66;18751:3;18744:79;18853:66;18848:2;18843:3;18839:12;18832:88;18726:3;18949:6;18943:13;18965:60;19018:6;19013:2;19008:3;19004:12;18999:2;18991:6;18987:15;18965:60;:::i;:::-;19089:66;19084:2;19044:16;;;19076:11;;;19069:87;19185:66;19180:2;19172:11;;19165:87;19282:66;19276:3;19268:12;;19261:88;19379:66;19373:3;19365:12;;19358:88;-1:-1:-1;;;19470:3:1;19462:12;;19455:66;19551;19545:3;19537:12;;19530:88;19648:66;19642:3;19634:12;;19627:88;19745:66;19739:3;19731:12;;19724:88;19842:66;19836:3;19828:12;;19821:88;19939:66;19933:3;19925:12;;19918:88;20036:66;20030:3;20022:12;;20015:88;20133:66;20127:3;20119:12;;20112:88;20230:66;20224:3;20216:12;;20209:88;-1:-1:-1;;;20321:3:1;20313:12;;20306:28;20350:126;20380:95;20405:69;20435:38;20468:3;20460:12;;20452:6;20435:38;:::i;:::-;3963:66;3951:79;;4060:34;4055:2;4046:12;;4039:56;4125:66;4120:2;4111:12;;4104:88;4222:66;4217:2;4208:12;;4201:88;4320:66;4314:3;4305:13;;4298:89;-1:-1:-1;;;4412:3:1;4403:13;;4396:59;4480:3;4471:13;;3886:604;20405:69;20397:6;20380:95;:::i;:::-;4572:66;4560:79;;4669:66;4664:2;4655:12;;4648:88;4766:66;4761:2;4752:12;;4745:88;4863:66;4858:2;4849:12;;4842:88;4961:66;4955:3;4946:13;;4939:89;5059:66;5053:3;5044:13;;5037:89;5157:66;5151:3;5142:13;;5135:89;-1:-1:-1;;;5249:3:1;5240:13;;5233:57;5315:3;5306:13;;4495:830;20350:126;20343:133;17998:2484;-1:-1:-1;;;;;;17998:2484:1:o;20487:448::-;20749:31;20744:3;20737:44;20719:3;20810:6;20804:13;20826:62;20881:6;20876:2;20871:3;20867:12;20860:4;20852:6;20848:17;20826:62;:::i;:::-;20908:16;;;;20926:2;20904:25;;20487:448;-1:-1:-1;;20487:448:1:o;21150:953::-;-1:-1:-1;;;21650:43:1;;21716:13;;21632:3;;21738:61;21716:13;21788:1;21779:11;;21772:4;21760:17;;21738:61;:::i;:::-;-1:-1:-1;;;21858:1:1;21818:16;;;21850:10;;;21843:31;21899:13;;21921:63;21899:13;21970:2;21962:11;;21955:4;21943:17;;21921:63;:::i;:::-;-1:-1:-1;;;22044:2:1;22003:17;;;;22036:11;;;22029:41;22094:2;22086:11;;21150:953;-1:-1:-1;;;;21150:953:1:o;22108:1030::-;22620:66;22615:3;22608:79;22590:3;22716:6;22710:13;22732:62;22787:6;22782:2;22777:3;22773:12;22766:4;22758:6;22754:17;22732:62;:::i;:::-;22858:66;22853:2;22813:16;;;22845:11;;;22838:87;22950:13;;22972:63;22950:13;23021:2;23013:11;;23006:4;22994:17;;22972:63;:::i;:::-;-1:-1:-1;;;23095:2:1;23054:17;;;;23087:11;;;23080:25;23129:2;23121:11;;22108:1030;-1:-1:-1;;;;22108:1030:1:o;23143:491::-;23384:19;;;23441:2;23437:15;;;;-1:-1:-1;;23433:53:1;23428:2;23419:12;;23412:75;23512:2;23503:12;;23496:28;;;;23549:2;23540:12;;23533:28;23586:3;23577:13;;23570:29;23624:3;23615:13;;23143:491::o;23847:499::-;-1:-1:-1;;;;;24116:15:1;;;24098:34;;24168:15;;24163:2;24148:18;;24141:43;24215:2;24200:18;;24193:34;;;24263:3;24258:2;24243:18;;24236:31;;;24041:4;;24284:56;;24320:19;;24312:6;24284:56;:::i;24543:230::-;24692:2;24681:9;24674:21;24655:4;24712:55;24763:2;24752:9;24748:18;24740:6;24712:55;:::i;26986:356::-;27188:2;27170:21;;;27207:18;;;27200:30;27266:34;27261:2;27246:18;;27239:62;27333:2;27318:18;;26986:356::o;28593:128::-;28633:3;28664:1;28660:6;28657:1;28654:13;28651:39;;;28670:18;;:::i;:::-;-1:-1:-1;28706:9:1;;28593:128::o;28726:120::-;28766:1;28792;28782:35;;28797:18;;:::i;:::-;-1:-1:-1;28831:9:1;;28726:120::o;28851:168::-;28891:7;28957:1;28953;28949:6;28945:14;28942:1;28939:21;28934:1;28927:9;28920:17;28916:45;28913:71;;;28964:18;;:::i;:::-;-1:-1:-1;29004:9:1;;28851:168::o;29024:125::-;29064:4;29092:1;29089;29086:8;29083:34;;;29097:18;;:::i;:::-;-1:-1:-1;29134:9:1;;29024:125::o;29154:258::-;29226:1;29236:113;29250:6;29247:1;29244:13;29236:113;;;29326:11;;;29320:18;29307:11;;;29300:39;29272:2;29265:10;29236:113;;;29367:6;29364:1;29361:13;29358:48;;;-1:-1:-1;;29402:1:1;29384:16;;29377:27;29154:258::o;29417:380::-;29496:1;29492:12;;;;29539;;;29560:61;;29614:4;29606:6;29602:17;29592:27;;29560:61;29667:2;29659:6;29656:14;29636:18;29633:38;29630:161;;;29713:10;29708:3;29704:20;29701:1;29694:31;29748:4;29745:1;29738:15;29776:4;29773:1;29766:15;29630:161;;29417:380;;;:::o;29802:135::-;29841:3;-1:-1:-1;;29862:17:1;;29859:43;;;29882:18;;:::i;:::-;-1:-1:-1;29929:1:1;29918:13;;29802:135::o;29942:112::-;29974:1;30000;29990:35;;30005:18;;:::i;:::-;-1:-1:-1;30039:9:1;;29942:112::o;30059:127::-;30120:10;30115:3;30111:20;30108:1;30101:31;30151:4;30148:1;30141:15;30175:4;30172:1;30165:15;30191:127;30252:10;30247:3;30243:20;30240:1;30233:31;30283:4;30280:1;30273:15;30307:4;30304:1;30297:15;30323:127;30384:10;30379:3;30375:20;30372:1;30365:31;30415:4;30412:1;30405:15;30439:4;30436:1;30429:15;30455:127;30516:10;30511:3;30507:20;30504:1;30497:31;30547:4;30544:1;30537:15;30571:4;30568:1;30561:15;30587:131;-1:-1:-1;;;;;;30661:32:1;;30651:43;;30641:71;;30708:1;30705;30698:12

Swarm Source

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