ETH Price: $3,444.38 (-2.60%)
Gas: 3 Gwei

Dogens NFT (yDogens)
 

Overview

TokenID

489

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DogensNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

/**
Shiba Doge Killer, We Never FOGET 11/9
A group of people who are related through their experiences


website https://www.dogens.io
twitter https://twitter.com/DogensToken
telegram https://t.me/dogenstoken



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

pragma solidity ^0.8.0;

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // 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);
    }

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

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


// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/DogensNft.sol

pragma solidity ^0.8.4;




contract DogensNft is ERC721A, Ownable {
    uint256 MAX_MINTS = 500;
    uint256 MAX_SUPPLY = 500;
    uint256 public mintRate = 0.05 ether;
    bool public saleEnable = true;
    mapping(address => uint) public ref;

    // Royalties address
    address public royaltyAddress = 0x4321cADc9435738B999d50a1F947c540E7641156;

    // Royalties basis points (percentage using 2 decimals - 1000 = 100, 500 = 50, 0 = 0) 10% artist 90% flipper
    uint256 private royaltyBasisPoints = 100; // 10%

    event RoyaltyBasisPoints(uint256 indexed _royaltyBasisPoints);
    event MintedNft(uint256 indexed _quantity, address add);

    string public baseURI =
        "ipfs://bafybeian7s22weqfozkarj4462oefrilnvqwtwfpqig4ajg4mh25amzwne/";

    address signerAddress = 0xb22E21F3A676d7Dfc02208709F42856eC9774978;

    constructor() ERC721A("Dogens NFT", "yDogens") {}

    // Token Id start from 1
    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function TotalBurned() public view returns (uint256) {
        return _totalBurned();
    }

    function next() public view returns (uint256) {
        return _nextTokenId();
    }

    function toggleSale(bool status) public onlyOwner {
        require(saleEnable != status);
        saleEnable = status;
    }

    function getSigner(
        address _toAddress,
        uint _quantity,
        address _refAddrses,
        bytes memory signature
    ) internal pure returns (address) {
        bytes32 hash = keccak256(
            abi.encodePacked(_toAddress, _quantity, _refAddrses)
        );
        bytes32 message = ECDSA.toEthSignedMessageHash(hash);
        address signer = ECDSA.recover(message, signature);
        return signer;
    }

    function mint(uint256 quantity) external payable {
        require(saleEnable, "Sale is not Enabled");
        // _safeMint's second argument now takes in a quantity, not a tokenId.
        require(
            quantity + _numberMinted(_msgSender()) <= MAX_MINTS,
            "Exceeded the limit"
        );
        require(
            totalSupply() + quantity <= MAX_SUPPLY,
            "Not enough tokens left"
        );
        require(msg.value >= (mintRate * quantity), "Not enough ether sent");

        _safeMint(_msgSender(), quantity);

        emit MintedNft(quantity, _msgSender());
    }

    function mintbyref(
        address _toAddress,
        uint256 _quantity,
        address _refAddress,
        bytes memory _signature
    ) external payable {
        require(saleEnable, "Sale is not Enabled");
        // _safeMint's second argument now takes in a quantity, not a tokenId.
        require(
            _quantity + _numberMinted(_msgSender()) <= MAX_MINTS,
            "Exceeded the limit"
        );
        require(
            totalSupply() + _quantity <= MAX_SUPPLY,
            "Not enough tokens left"
        );
        require(msg.value >= (mintRate * _quantity), "Not enough ether sent");
        require(
            _refAddress != _toAddress && _toAddress == msg.sender,
            "Don't cheat"
        );
        require(
            getSigner(_toAddress, _quantity, _refAddress, _signature) ==
                signerAddress,
            "Don't cheat"
        );

        _safeMint(_msgSender(), _quantity);
        ref[_refAddress] += _quantity;

        emit MintedNft(_quantity, _msgSender());
    }

    function vipmint(uint256 _quantity, address add) external onlyOwner {
        require(saleEnable, "Sale is not Enabled");
        // _safeMint's second argument now takes in a quantity, not a tokenId.
        require(
            _quantity + _numberMinted(_msgSender()) <= MAX_MINTS,
            "Exceeded the limit"
        );
        require(
            totalSupply() + _quantity <= MAX_SUPPLY,
            "Not enough tokens left"
        );
        _safeMint(add, _quantity);
        emit MintedNft(_quantity, add);
    }

    function withdraw() external payable onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    // returns base uri
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function setMintRate(uint256 _mintRate) public onlyOwner {
        mintRate = _mintRate;
    }

    // Set royalty  address
    function setRoyaltyAddress(address _address) external onlyOwner {
        royaltyAddress = _address;
    }

    // Set base URI
    function setBaseURI(string memory _uri) external onlyOwner {
        baseURI = _uri;
    }

    // Set royalty basis points
    function setRoyaltyBasisPoints(uint256 _basisPoints) external onlyOwner {
        royaltyBasisPoints = _basisPoints;
        emit RoyaltyBasisPoints(_basisPoints);
    }

    // TokenURI
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Nonexistent token");

        return
            string(abi.encodePacked(_baseURI(), _toString(tokenId), ".json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"add","type":"address"}],"name":"MintedNft","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_royaltyBasisPoints","type":"uint256"}],"name":"RoyaltyBasisPoints","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TotalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_refAddress","type":"address"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintbyref","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"next","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ref","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"saleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintRate","type":"uint256"}],"name":"setMintRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_basisPoints","type":"uint256"}],"name":"setRoyaltyBasisPoints","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":"bool","name":"status","type":"bool"}],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"add","type":"address"}],"name":"vipmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526101f46009556101f4600a5566b1a2bc2ec50000600b556001600c60006101000a81548160ff021916908315150217905550734321cadc9435738b999d50a1f947c540e7641156600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600f5560405180608001604052806043815260200162003e1e6043913960109080519060200190620000c1929190620002d8565b5073b22e21f3a676d7dfc02208709f42856ec9774978601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200012457600080fd5b506040518060400160405280600a81526020017f446f67656e73204e4654000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f79446f67656e73000000000000000000000000000000000000000000000000008152508160029080519060200190620001a9929190620002d8565b508060039080519060200190620001c2929190620002d8565b50620001d36200020160201b60201c565b6000819055505050620001fb620001ef6200020a60201b60201c565b6200021260201b60201c565b620003ed565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002e69062000388565b90600052602060002090601f0160209004810192826200030a576000855562000356565b82601f106200032557805160ff191683800117855562000356565b8280016001018555821562000356579182015b828111156200035557825182559160200191906001019062000338565b5b50905062000365919062000369565b5090565b5b80821115620003845760008160009055506001016200036a565b5090565b60006002820490506001821680620003a157607f821691505b60208210811415620003b857620003b7620003be565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613a2180620003fd6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063dbe2193f1161006f578063dbe2193f1461067a578063e985e9c5146106a3578063f2fde38b146106e0578063fc72789514610709578063fe4ca84714610732576101ee565b8063b88d4fde146105b9578063c4b6ebdf146105d5578063c87b56dd14610612578063ca0dcf161461064f576101ee565b8063a22cb465116100dc578063a22cb46514610513578063aab402e51461053c578063ad2f852a14610565578063b6b8194014610590576101ee565b8063715018a61461048a5780638da5cb5b146104a157806395d89b41146104cc578063a0712d68146104f7576101ee565b80632d6fd3c61161018557806355f804b31161015457806355f804b3146103bc5780636352211e146103e55780636c0360eb1461042257806370a082311461044d576101ee565b80632d6fd3c61461034f5780633ccfd60b1461036b57806342842e0e146103755780634c8fe52614610391576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806315bfafcd146102dd57806318160ddd1461030857806323b872dd14610333576101ee565b806301ffc9a7146101f357806306d254da1461023057806306fdde0314610259578063081812fc14610284575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612bcc565b61075d565b60405161022791906130f2565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190612959565b6107ef565b005b34801561026557600080fd5b5061026e61083b565b60405161027b9190613152565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612c6f565b6108cd565b6040516102b8919061308b565b60405180910390f35b6102db60048036038101906102d69190612adc565b61094c565b005b3480156102e957600080fd5b506102f2610a90565b6040516102ff91906132f4565b60405180910390f35b34801561031457600080fd5b5061031d610a9f565b60405161032a91906132f4565b60405180910390f35b61034d600480360381019061034891906129c6565b610ab6565b005b61036960048036038101906103649190612b1c565b610ddb565b005b61037361111d565b005b61038f600480360381019061038a91906129c6565b611175565b005b34801561039d57600080fd5b506103a6611195565b6040516103b391906132f4565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190612c26565b6111a4565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612c6f565b6111c6565b604051610419919061308b565b60405180910390f35b34801561042e57600080fd5b506104376111d8565b6040516104449190613152565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612959565b611266565b60405161048191906132f4565b60405180910390f35b34801561049657600080fd5b5061049f61131f565b005b3480156104ad57600080fd5b506104b6611333565b6040516104c3919061308b565b60405180910390f35b3480156104d857600080fd5b506104e161135d565b6040516104ee9190613152565b60405180910390f35b610511600480360381019061050c9190612c6f565b6113ef565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a9c565b611597565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b9f565b6116a2565b005b34801561057157600080fd5b5061057a6116e7565b604051610587919061308b565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612c6f565b61170d565b005b6105d360048036038101906105ce9190612a19565b61174c565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612959565b6117bf565b60405161060991906132f4565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c6f565b6117d7565b6040516106469190613152565b60405180910390f35b34801561065b57600080fd5b50610664611859565b60405161067191906132f4565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190612c6f565b61185f565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190612986565b611871565b6040516106d791906130f2565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612959565b611905565b005b34801561071557600080fd5b50610730600480360381019061072b9190612c9c565b611989565b005b34801561073e57600080fd5b50610747611adc565b60405161075491906130f2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6107f7611aef565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606002805461084a90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461087690613556565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611b6d565b61090e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610957826111c6565b90508073ffffffffffffffffffffffffffffffffffffffff16610978611bcc565b73ffffffffffffffffffffffffffffffffffffffff16146109db576109a48161099f611bcc565b611871565b6109da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a9a611bd4565b905090565b6000610aa9611bde565b6001546000540303905090565b6000610ac182611be7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3484611cb5565b91509150610b4a8187610b45611bcc565b611cdc565b610b9657610b5f86610b5a611bcc565b611871565b610b95576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c0a8686866001611d20565b8015610c1557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce385610cbf888887611d26565b7c020000000000000000000000000000000000000000000000000000000017611d4e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d6b576000600185019050600060046000838152602001908152602001600020541415610d69576000548114610d68578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd38686866001611d79565b505050505050565b600c60009054906101000a900460ff16610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906131d4565b60405180910390fd5b600954610e3d610e38611d7f565b611d87565b84610e4891906133d9565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906131f4565b60405180910390fd5b600a5483610e95610a9f565b610e9f91906133d9565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613254565b60405180910390fd5b82600b54610eee919061342f565b341015610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906132d4565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f9757503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90613294565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661101b85858585611dde565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613294565b60405180910390fd5b61108261107c611d7f565b84611e37565b82600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d191906133d9565b92505081905550827fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c611102611d7f565b60405161110f919061308b565b60405180910390a250505050565b611125611aef565b61112d611333565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611172573d6000803e3d6000fd5b50565b6111908383836040518060200160405280600081525061174c565b505050565b600061119f611e55565b905090565b6111ac611aef565b80601090805190602001906111c292919061276d565b5050565b60006111d182611be7565b9050919050565b601080546111e590613556565b80601f016020809104026020016040519081016040528092919081815260200182805461121190613556565b801561125e5780601f106112335761010080835404028352916020019161125e565b820191906000526020600020905b81548152906001019060200180831161124157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611327611aef565b6113316000611e5e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461136c90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461139890613556565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1661143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906131d4565b60405180910390fd5b60095461145161144c611d7f565b611d87565b8261145c91906133d9565b111561149d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611494906131f4565b60405180910390fd5b600a54816114a9610a9f565b6114b391906133d9565b11156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613254565b60405180910390fd5b80600b54611502919061342f565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906132d4565b60405180910390fd5b61155561154f611d7f565b82611e37565b807fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c61157f611d7f565b60405161158c919061308b565b60405180910390a250565b80600760006115a4611bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611651611bcc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169691906130f2565b60405180910390a35050565b6116aa611aef565b801515600c60009054906101000a900460ff16151514156116ca57600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611715611aef565b80600f81905550807fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c660405160405180910390a250565b611757848484610ab6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117b95761178284848484611f24565b6117b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d6020528060005260406000206000915090505481565b60606117e282611b6d565b611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613234565b60405180910390fd5b611829612084565b61183283612116565b604051602001611843929190613036565b6040516020818303038152906040529050919050565b600b5481565b611867611aef565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190d611aef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906131b4565b60405180910390fd5b61198681611e5e565b50565b611991611aef565b600c60009054906101000a900460ff166119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d7906131d4565b60405180910390fd5b6009546119f36119ee611d7f565b611d87565b836119fe91906133d9565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906131f4565b60405180910390fd5b600a5482611a4b610a9f565b611a5591906133d9565b1115611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613254565b60405180910390fd5b611aa08183611e37565b817fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c82604051611ad0919061308b565b60405180910390a25050565b600c60009054906101000a900460ff1681565b611af7611d7f565b73ffffffffffffffffffffffffffffffffffffffff16611b15611333565b73ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b62906132b4565b60405180910390fd5b565b600081611b78611bde565b11158015611b87575060005482105b8015611bc5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b60006001905090565b60008082905080611bf6611bde565b11611c7e57600054811015611c7d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c7b575b6000811415611c71576004600083600190039350838152602001908152602001600020549050611c46565b8092505050611cb0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d3d86868461216f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600080858585604051602001611df693929190612ff9565b6040516020818303038152906040528051906020012090506000611e1982612178565b90506000611e2782866121a8565b9050809350505050949350505050565b611e518282604051806020016040528060008152506121cf565b5050565b60008054905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f4a611bcc565b8786866040518563ffffffff1660e01b8152600401611f6c94939291906130a6565b602060405180830381600087803b158015611f8657600080fd5b505af1925050508015611fb757506040513d601f19601f82011682018060405250810190611fb49190612bf9565b60015b612031573d8060008114611fe7576040519150601f19603f3d011682016040523d82523d6000602084013e611fec565b606091505b50600081511415612029576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461209390613556565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90613556565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561215a57600184039350600a81066030018453600a81049050806121555761215a565b61212f565b50828103602084039350808452505050919050565b60009392505050565b60008160405160200161218b9190613065565b604051602081830303815290604052805190602001209050919050565b60008060006121b7858561226c565b915091506121c4816122be565b819250505092915050565b6121d98383612493565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461226757600080549050600083820390505b6122196000868380600101945086611f24565b61224f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061220657816000541461226457600080fd5b50505b505050565b6000806041835114156122ae5760008060006020860151925060408601519150606086015160001a90506122a287828585612650565b945094505050506122b7565b60006002915091505b9250929050565b600060048111156122d2576122d1613620565b5b8160048111156122e5576122e4613620565b5b14156122f057612490565b6001600481111561230457612303613620565b5b81600481111561231757612316613620565b5b1415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90613174565b60405180910390fd5b6002600481111561236c5761236b613620565b5b81600481111561237f5761237e613620565b5b14156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790613194565b60405180910390fd5b600360048111156123d4576123d3613620565b5b8160048111156123e7576123e6613620565b5b1415612428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241f90613214565b60405180910390fd5b60048081111561243b5761243a613620565b5b81600481111561244e5761244d613620565b5b141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613274565b60405180910390fd5b5b50565b60008054905060008214156124d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e16000848385611d20565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612558836125496000866000611d26565b6125528561275d565b17611d4e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125be565b506000821415612635576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061264b6000848385611d79565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561268b576000600391509150612754565b601b8560ff16141580156126a35750601c8560ff1614155b156126b5576000600491509150612754565b6000600187878787604051600081526020016040526040516126da949392919061310d565b6020604051602081039080840390855afa1580156126fc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274b57600060019250925050612754565b80600092509250505b94509492505050565b60006001821460e11b9050919050565b82805461277990613556565b90600052602060002090601f01602090048101928261279b57600085556127e2565b82601f106127b457805160ff19168380011785556127e2565b828001600101855582156127e2579182015b828111156127e15782518255916020019190600101906127c6565b5b5090506127ef91906127f3565b5090565b5b8082111561280c5760008160009055506001016127f4565b5090565b600061282361281e84613334565b61330f565b90508281526020810184848401111561283f5761283e6136b2565b5b61284a848285613514565b509392505050565b600061286561286084613365565b61330f565b905082815260208101848484011115612881576128806136b2565b5b61288c848285613514565b509392505050565b6000813590506128a38161398f565b92915050565b6000813590506128b8816139a6565b92915050565b6000813590506128cd816139bd565b92915050565b6000815190506128e2816139bd565b92915050565b600082601f8301126128fd576128fc6136ad565b5b813561290d848260208601612810565b91505092915050565b600082601f83011261292b5761292a6136ad565b5b813561293b848260208601612852565b91505092915050565b600081359050612953816139d4565b92915050565b60006020828403121561296f5761296e6136bc565b5b600061297d84828501612894565b91505092915050565b6000806040838503121561299d5761299c6136bc565b5b60006129ab85828601612894565b92505060206129bc85828601612894565b9150509250929050565b6000806000606084860312156129df576129de6136bc565b5b60006129ed86828701612894565b93505060206129fe86828701612894565b9250506040612a0f86828701612944565b9150509250925092565b60008060008060808587031215612a3357612a326136bc565b5b6000612a4187828801612894565b9450506020612a5287828801612894565b9350506040612a6387828801612944565b925050606085013567ffffffffffffffff811115612a8457612a836136b7565b5b612a90878288016128e8565b91505092959194509250565b60008060408385031215612ab357612ab26136bc565b5b6000612ac185828601612894565b9250506020612ad2858286016128a9565b9150509250929050565b60008060408385031215612af357612af26136bc565b5b6000612b0185828601612894565b9250506020612b1285828601612944565b9150509250929050565b60008060008060808587031215612b3657612b356136bc565b5b6000612b4487828801612894565b9450506020612b5587828801612944565b9350506040612b6687828801612894565b925050606085013567ffffffffffffffff811115612b8757612b866136b7565b5b612b93878288016128e8565b91505092959194509250565b600060208284031215612bb557612bb46136bc565b5b6000612bc3848285016128a9565b91505092915050565b600060208284031215612be257612be16136bc565b5b6000612bf0848285016128be565b91505092915050565b600060208284031215612c0f57612c0e6136bc565b5b6000612c1d848285016128d3565b91505092915050565b600060208284031215612c3c57612c3b6136bc565b5b600082013567ffffffffffffffff811115612c5a57612c596136b7565b5b612c6684828501612916565b91505092915050565b600060208284031215612c8557612c846136bc565b5b6000612c9384828501612944565b91505092915050565b60008060408385031215612cb357612cb26136bc565b5b6000612cc185828601612944565b9250506020612cd285828601612894565b9150509250929050565b612ce581613489565b82525050565b612cfc612cf782613489565b6135b9565b82525050565b612d0b8161349b565b82525050565b612d1a816134a7565b82525050565b612d31612d2c826134a7565b6135cb565b82525050565b6000612d4282613396565b612d4c81856133ac565b9350612d5c818560208601613523565b612d65816136c1565b840191505092915050565b6000612d7b826133a1565b612d8581856133bd565b9350612d95818560208601613523565b612d9e816136c1565b840191505092915050565b6000612db4826133a1565b612dbe81856133ce565b9350612dce818560208601613523565b80840191505092915050565b6000612de76018836133bd565b9150612df2826136df565b602082019050919050565b6000612e0a601f836133bd565b9150612e1582613708565b602082019050919050565b6000612e2d601c836133ce565b9150612e3882613731565b601c82019050919050565b6000612e506026836133bd565b9150612e5b8261375a565b604082019050919050565b6000612e736013836133bd565b9150612e7e826137a9565b602082019050919050565b6000612e966012836133bd565b9150612ea1826137d2565b602082019050919050565b6000612eb96022836133bd565b9150612ec4826137fb565b604082019050919050565b6000612edc6011836133bd565b9150612ee78261384a565b602082019050919050565b6000612eff6016836133bd565b9150612f0a82613873565b602082019050919050565b6000612f226022836133bd565b9150612f2d8261389c565b604082019050919050565b6000612f45600b836133bd565b9150612f50826138eb565b602082019050919050565b6000612f686005836133ce565b9150612f7382613914565b600582019050919050565b6000612f8b6020836133bd565b9150612f968261393d565b602082019050919050565b6000612fae6015836133bd565b9150612fb982613966565b602082019050919050565b612fcd816134fd565b82525050565b612fe4612fdf826134fd565b6135e7565b82525050565b612ff381613507565b82525050565b60006130058286612ceb565b6014820191506130158285612fd3565b6020820191506130258284612ceb565b601482019150819050949350505050565b60006130428285612da9565b915061304e8284612da9565b915061305982612f5b565b91508190509392505050565b600061307082612e20565b915061307c8284612d20565b60208201915081905092915050565b60006020820190506130a06000830184612cdc565b92915050565b60006080820190506130bb6000830187612cdc565b6130c86020830186612cdc565b6130d56040830185612fc4565b81810360608301526130e78184612d37565b905095945050505050565b60006020820190506131076000830184612d02565b92915050565b60006080820190506131226000830187612d11565b61312f6020830186612fea565b61313c6040830185612d11565b6131496060830184612d11565b95945050505050565b6000602082019050818103600083015261316c8184612d70565b905092915050565b6000602082019050818103600083015261318d81612dda565b9050919050565b600060208201905081810360008301526131ad81612dfd565b9050919050565b600060208201905081810360008301526131cd81612e43565b9050919050565b600060208201905081810360008301526131ed81612e66565b9050919050565b6000602082019050818103600083015261320d81612e89565b9050919050565b6000602082019050818103600083015261322d81612eac565b9050919050565b6000602082019050818103600083015261324d81612ecf565b9050919050565b6000602082019050818103600083015261326d81612ef2565b9050919050565b6000602082019050818103600083015261328d81612f15565b9050919050565b600060208201905081810360008301526132ad81612f38565b9050919050565b600060208201905081810360008301526132cd81612f7e565b9050919050565b600060208201905081810360008301526132ed81612fa1565b9050919050565b60006020820190506133096000830184612fc4565b92915050565b600061331961332a565b90506133258282613588565b919050565b6000604051905090565b600067ffffffffffffffff82111561334f5761334e61367e565b5b613358826136c1565b9050602081019050919050565b600067ffffffffffffffff8211156133805761337f61367e565b5b613389826136c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e4826134fd565b91506133ef836134fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613424576134236135f1565b5b828201905092915050565b600061343a826134fd565b9150613445836134fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561347e5761347d6135f1565b5b828202905092915050565b6000613494826134dd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613541578082015181840152602081019050613526565b83811115613550576000848401525b50505050565b6000600282049050600182168061356e57607f821691505b602082108114156135825761358161364f565b5b50919050565b613591826136c1565b810181811067ffffffffffffffff821117156135b0576135af61367e565b5b80604052505050565b60006135c4826135d5565b9050919050565b6000819050919050565b60006135e0826136d2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420456e61626c656400000000000000000000000000600082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6e2774206368656174000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61399881613489565b81146139a357600080fd5b50565b6139af8161349b565b81146139ba57600080fd5b50565b6139c6816134b1565b81146139d157600080fd5b50565b6139dd816134fd565b81146139e857600080fd5b5056fea264697066735822122097964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e4864736f6c63430008070033697066733a2f2f62616679626569616e37733232776571666f7a6b61726a343436326f656672696c6e7671777477667071696734616a67346d683235616d7a776e652f

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063b88d4fde116100a0578063dbe2193f1161006f578063dbe2193f1461067a578063e985e9c5146106a3578063f2fde38b146106e0578063fc72789514610709578063fe4ca84714610732576101ee565b8063b88d4fde146105b9578063c4b6ebdf146105d5578063c87b56dd14610612578063ca0dcf161461064f576101ee565b8063a22cb465116100dc578063a22cb46514610513578063aab402e51461053c578063ad2f852a14610565578063b6b8194014610590576101ee565b8063715018a61461048a5780638da5cb5b146104a157806395d89b41146104cc578063a0712d68146104f7576101ee565b80632d6fd3c61161018557806355f804b31161015457806355f804b3146103bc5780636352211e146103e55780636c0360eb1461042257806370a082311461044d576101ee565b80632d6fd3c61461034f5780633ccfd60b1461036b57806342842e0e146103755780634c8fe52614610391576101ee565b8063095ea7b3116101c1578063095ea7b3146102c157806315bfafcd146102dd57806318160ddd1461030857806323b872dd14610333576101ee565b806301ffc9a7146101f357806306d254da1461023057806306fdde0314610259578063081812fc14610284575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612bcc565b61075d565b60405161022791906130f2565b60405180910390f35b34801561023c57600080fd5b5061025760048036038101906102529190612959565b6107ef565b005b34801561026557600080fd5b5061026e61083b565b60405161027b9190613152565b60405180910390f35b34801561029057600080fd5b506102ab60048036038101906102a69190612c6f565b6108cd565b6040516102b8919061308b565b60405180910390f35b6102db60048036038101906102d69190612adc565b61094c565b005b3480156102e957600080fd5b506102f2610a90565b6040516102ff91906132f4565b60405180910390f35b34801561031457600080fd5b5061031d610a9f565b60405161032a91906132f4565b60405180910390f35b61034d600480360381019061034891906129c6565b610ab6565b005b61036960048036038101906103649190612b1c565b610ddb565b005b61037361111d565b005b61038f600480360381019061038a91906129c6565b611175565b005b34801561039d57600080fd5b506103a6611195565b6040516103b391906132f4565b60405180910390f35b3480156103c857600080fd5b506103e360048036038101906103de9190612c26565b6111a4565b005b3480156103f157600080fd5b5061040c60048036038101906104079190612c6f565b6111c6565b604051610419919061308b565b60405180910390f35b34801561042e57600080fd5b506104376111d8565b6040516104449190613152565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f9190612959565b611266565b60405161048191906132f4565b60405180910390f35b34801561049657600080fd5b5061049f61131f565b005b3480156104ad57600080fd5b506104b6611333565b6040516104c3919061308b565b60405180910390f35b3480156104d857600080fd5b506104e161135d565b6040516104ee9190613152565b60405180910390f35b610511600480360381019061050c9190612c6f565b6113ef565b005b34801561051f57600080fd5b5061053a60048036038101906105359190612a9c565b611597565b005b34801561054857600080fd5b50610563600480360381019061055e9190612b9f565b6116a2565b005b34801561057157600080fd5b5061057a6116e7565b604051610587919061308b565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b29190612c6f565b61170d565b005b6105d360048036038101906105ce9190612a19565b61174c565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612959565b6117bf565b60405161060991906132f4565b60405180910390f35b34801561061e57600080fd5b5061063960048036038101906106349190612c6f565b6117d7565b6040516106469190613152565b60405180910390f35b34801561065b57600080fd5b50610664611859565b60405161067191906132f4565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190612c6f565b61185f565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190612986565b611871565b6040516106d791906130f2565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190612959565b611905565b005b34801561071557600080fd5b50610730600480360381019061072b9190612c9c565b611989565b005b34801561073e57600080fd5b50610747611adc565b60405161075491906130f2565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107e85750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6107f7611aef565b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606002805461084a90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461087690613556565b80156108c35780601f10610898576101008083540402835291602001916108c3565b820191906000526020600020905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b60006108d882611b6d565b61090e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610957826111c6565b90508073ffffffffffffffffffffffffffffffffffffffff16610978611bcc565b73ffffffffffffffffffffffffffffffffffffffff16146109db576109a48161099f611bcc565b611871565b6109da576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a9a611bd4565b905090565b6000610aa9611bde565b6001546000540303905090565b6000610ac182611be7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b28576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b3484611cb5565b91509150610b4a8187610b45611bcc565b611cdc565b610b9657610b5f86610b5a611bcc565b611871565b610b95576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bfd576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c0a8686866001611d20565b8015610c1557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ce385610cbf888887611d26565b7c020000000000000000000000000000000000000000000000000000000017611d4e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d6b576000600185019050600060046000838152602001908152602001600020541415610d69576000548114610d68578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610dd38686866001611d79565b505050505050565b600c60009054906101000a900460ff16610e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e21906131d4565b60405180910390fd5b600954610e3d610e38611d7f565b611d87565b84610e4891906133d9565b1115610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e80906131f4565b60405180910390fd5b600a5483610e95610a9f565b610e9f91906133d9565b1115610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed790613254565b60405180910390fd5b82600b54610eee919061342f565b341015610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f27906132d4565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610f9757503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90613294565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661101b85858585611dde565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106890613294565b60405180910390fd5b61108261107c611d7f565b84611e37565b82600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d191906133d9565b92505081905550827fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c611102611d7f565b60405161110f919061308b565b60405180910390a250505050565b611125611aef565b61112d611333565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611172573d6000803e3d6000fd5b50565b6111908383836040518060200160405280600081525061174c565b505050565b600061119f611e55565b905090565b6111ac611aef565b80601090805190602001906111c292919061276d565b5050565b60006111d182611be7565b9050919050565b601080546111e590613556565b80601f016020809104026020016040519081016040528092919081815260200182805461121190613556565b801561125e5780601f106112335761010080835404028352916020019161125e565b820191906000526020600020905b81548152906001019060200180831161124157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611327611aef565b6113316000611e5e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461136c90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461139890613556565b80156113e55780601f106113ba576101008083540402835291602001916113e5565b820191906000526020600020905b8154815290600101906020018083116113c857829003601f168201915b5050505050905090565b600c60009054906101000a900460ff1661143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611435906131d4565b60405180910390fd5b60095461145161144c611d7f565b611d87565b8261145c91906133d9565b111561149d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611494906131f4565b60405180910390fd5b600a54816114a9610a9f565b6114b391906133d9565b11156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb90613254565b60405180910390fd5b80600b54611502919061342f565b341015611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b906132d4565b60405180910390fd5b61155561154f611d7f565b82611e37565b807fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c61157f611d7f565b60405161158c919061308b565b60405180910390a250565b80600760006115a4611bcc565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611651611bcc565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161169691906130f2565b60405180910390a35050565b6116aa611aef565b801515600c60009054906101000a900460ff16151514156116ca57600080fd5b80600c60006101000a81548160ff02191690831515021790555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611715611aef565b80600f81905550807fce3498f3236889c7e9256b3643e0f7fae5a1b912f2ac0daa1d89236c70b522c660405160405180910390a250565b611757848484610ab6565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117b95761178284848484611f24565b6117b8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600d6020528060005260406000206000915090505481565b60606117e282611b6d565b611821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181890613234565b60405180910390fd5b611829612084565b61183283612116565b604051602001611843929190613036565b6040516020818303038152906040529050919050565b600b5481565b611867611aef565b80600b8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61190d611aef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561197d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611974906131b4565b60405180910390fd5b61198681611e5e565b50565b611991611aef565b600c60009054906101000a900460ff166119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d7906131d4565b60405180910390fd5b6009546119f36119ee611d7f565b611d87565b836119fe91906133d9565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a36906131f4565b60405180910390fd5b600a5482611a4b610a9f565b611a5591906133d9565b1115611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90613254565b60405180910390fd5b611aa08183611e37565b817fb069a28fab2f4a275fc364c15d220c5884271a144db6d116d13dcb79c8181c6c82604051611ad0919061308b565b60405180910390a25050565b600c60009054906101000a900460ff1681565b611af7611d7f565b73ffffffffffffffffffffffffffffffffffffffff16611b15611333565b73ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b62906132b4565b60405180910390fd5b565b600081611b78611bde565b11158015611b87575060005482105b8015611bc5575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6000600154905090565b60006001905090565b60008082905080611bf6611bde565b11611c7e57600054811015611c7d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611c7b575b6000811415611c71576004600083600190039350838152602001908152602001600020549050611c46565b8092505050611cb0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d3d86868461216f565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600080858585604051602001611df693929190612ff9565b6040516020818303038152906040528051906020012090506000611e1982612178565b90506000611e2782866121a8565b9050809350505050949350505050565b611e518282604051806020016040528060008152506121cf565b5050565b60008054905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f4a611bcc565b8786866040518563ffffffff1660e01b8152600401611f6c94939291906130a6565b602060405180830381600087803b158015611f8657600080fd5b505af1925050508015611fb757506040513d601f19601f82011682018060405250810190611fb49190612bf9565b60015b612031573d8060008114611fe7576040519150601f19603f3d011682016040523d82523d6000602084013e611fec565b606091505b50600081511415612029576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606010805461209390613556565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90613556565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561215a57600184039350600a81066030018453600a81049050806121555761215a565b61212f565b50828103602084039350808452505050919050565b60009392505050565b60008160405160200161218b9190613065565b604051602081830303815290604052805190602001209050919050565b60008060006121b7858561226c565b915091506121c4816122be565b819250505092915050565b6121d98383612493565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461226757600080549050600083820390505b6122196000868380600101945086611f24565b61224f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061220657816000541461226457600080fd5b50505b505050565b6000806041835114156122ae5760008060006020860151925060408601519150606086015160001a90506122a287828585612650565b945094505050506122b7565b60006002915091505b9250929050565b600060048111156122d2576122d1613620565b5b8160048111156122e5576122e4613620565b5b14156122f057612490565b6001600481111561230457612303613620565b5b81600481111561231757612316613620565b5b1415612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90613174565b60405180910390fd5b6002600481111561236c5761236b613620565b5b81600481111561237f5761237e613620565b5b14156123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b790613194565b60405180910390fd5b600360048111156123d4576123d3613620565b5b8160048111156123e7576123e6613620565b5b1415612428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241f90613214565b60405180910390fd5b60048081111561243b5761243a613620565b5b81600481111561244e5761244d613620565b5b141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690613274565b60405180910390fd5b5b50565b60008054905060008214156124d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124e16000848385611d20565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612558836125496000866000611d26565b6125528561275d565b17611d4e565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146125f957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125be565b506000821415612635576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061264b6000848385611d79565b505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561268b576000600391509150612754565b601b8560ff16141580156126a35750601c8560ff1614155b156126b5576000600491509150612754565b6000600187878787604051600081526020016040526040516126da949392919061310d565b6020604051602081039080840390855afa1580156126fc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561274b57600060019250925050612754565b80600092509250505b94509492505050565b60006001821460e11b9050919050565b82805461277990613556565b90600052602060002090601f01602090048101928261279b57600085556127e2565b82601f106127b457805160ff19168380011785556127e2565b828001600101855582156127e2579182015b828111156127e15782518255916020019190600101906127c6565b5b5090506127ef91906127f3565b5090565b5b8082111561280c5760008160009055506001016127f4565b5090565b600061282361281e84613334565b61330f565b90508281526020810184848401111561283f5761283e6136b2565b5b61284a848285613514565b509392505050565b600061286561286084613365565b61330f565b905082815260208101848484011115612881576128806136b2565b5b61288c848285613514565b509392505050565b6000813590506128a38161398f565b92915050565b6000813590506128b8816139a6565b92915050565b6000813590506128cd816139bd565b92915050565b6000815190506128e2816139bd565b92915050565b600082601f8301126128fd576128fc6136ad565b5b813561290d848260208601612810565b91505092915050565b600082601f83011261292b5761292a6136ad565b5b813561293b848260208601612852565b91505092915050565b600081359050612953816139d4565b92915050565b60006020828403121561296f5761296e6136bc565b5b600061297d84828501612894565b91505092915050565b6000806040838503121561299d5761299c6136bc565b5b60006129ab85828601612894565b92505060206129bc85828601612894565b9150509250929050565b6000806000606084860312156129df576129de6136bc565b5b60006129ed86828701612894565b93505060206129fe86828701612894565b9250506040612a0f86828701612944565b9150509250925092565b60008060008060808587031215612a3357612a326136bc565b5b6000612a4187828801612894565b9450506020612a5287828801612894565b9350506040612a6387828801612944565b925050606085013567ffffffffffffffff811115612a8457612a836136b7565b5b612a90878288016128e8565b91505092959194509250565b60008060408385031215612ab357612ab26136bc565b5b6000612ac185828601612894565b9250506020612ad2858286016128a9565b9150509250929050565b60008060408385031215612af357612af26136bc565b5b6000612b0185828601612894565b9250506020612b1285828601612944565b9150509250929050565b60008060008060808587031215612b3657612b356136bc565b5b6000612b4487828801612894565b9450506020612b5587828801612944565b9350506040612b6687828801612894565b925050606085013567ffffffffffffffff811115612b8757612b866136b7565b5b612b93878288016128e8565b91505092959194509250565b600060208284031215612bb557612bb46136bc565b5b6000612bc3848285016128a9565b91505092915050565b600060208284031215612be257612be16136bc565b5b6000612bf0848285016128be565b91505092915050565b600060208284031215612c0f57612c0e6136bc565b5b6000612c1d848285016128d3565b91505092915050565b600060208284031215612c3c57612c3b6136bc565b5b600082013567ffffffffffffffff811115612c5a57612c596136b7565b5b612c6684828501612916565b91505092915050565b600060208284031215612c8557612c846136bc565b5b6000612c9384828501612944565b91505092915050565b60008060408385031215612cb357612cb26136bc565b5b6000612cc185828601612944565b9250506020612cd285828601612894565b9150509250929050565b612ce581613489565b82525050565b612cfc612cf782613489565b6135b9565b82525050565b612d0b8161349b565b82525050565b612d1a816134a7565b82525050565b612d31612d2c826134a7565b6135cb565b82525050565b6000612d4282613396565b612d4c81856133ac565b9350612d5c818560208601613523565b612d65816136c1565b840191505092915050565b6000612d7b826133a1565b612d8581856133bd565b9350612d95818560208601613523565b612d9e816136c1565b840191505092915050565b6000612db4826133a1565b612dbe81856133ce565b9350612dce818560208601613523565b80840191505092915050565b6000612de76018836133bd565b9150612df2826136df565b602082019050919050565b6000612e0a601f836133bd565b9150612e1582613708565b602082019050919050565b6000612e2d601c836133ce565b9150612e3882613731565b601c82019050919050565b6000612e506026836133bd565b9150612e5b8261375a565b604082019050919050565b6000612e736013836133bd565b9150612e7e826137a9565b602082019050919050565b6000612e966012836133bd565b9150612ea1826137d2565b602082019050919050565b6000612eb96022836133bd565b9150612ec4826137fb565b604082019050919050565b6000612edc6011836133bd565b9150612ee78261384a565b602082019050919050565b6000612eff6016836133bd565b9150612f0a82613873565b602082019050919050565b6000612f226022836133bd565b9150612f2d8261389c565b604082019050919050565b6000612f45600b836133bd565b9150612f50826138eb565b602082019050919050565b6000612f686005836133ce565b9150612f7382613914565b600582019050919050565b6000612f8b6020836133bd565b9150612f968261393d565b602082019050919050565b6000612fae6015836133bd565b9150612fb982613966565b602082019050919050565b612fcd816134fd565b82525050565b612fe4612fdf826134fd565b6135e7565b82525050565b612ff381613507565b82525050565b60006130058286612ceb565b6014820191506130158285612fd3565b6020820191506130258284612ceb565b601482019150819050949350505050565b60006130428285612da9565b915061304e8284612da9565b915061305982612f5b565b91508190509392505050565b600061307082612e20565b915061307c8284612d20565b60208201915081905092915050565b60006020820190506130a06000830184612cdc565b92915050565b60006080820190506130bb6000830187612cdc565b6130c86020830186612cdc565b6130d56040830185612fc4565b81810360608301526130e78184612d37565b905095945050505050565b60006020820190506131076000830184612d02565b92915050565b60006080820190506131226000830187612d11565b61312f6020830186612fea565b61313c6040830185612d11565b6131496060830184612d11565b95945050505050565b6000602082019050818103600083015261316c8184612d70565b905092915050565b6000602082019050818103600083015261318d81612dda565b9050919050565b600060208201905081810360008301526131ad81612dfd565b9050919050565b600060208201905081810360008301526131cd81612e43565b9050919050565b600060208201905081810360008301526131ed81612e66565b9050919050565b6000602082019050818103600083015261320d81612e89565b9050919050565b6000602082019050818103600083015261322d81612eac565b9050919050565b6000602082019050818103600083015261324d81612ecf565b9050919050565b6000602082019050818103600083015261326d81612ef2565b9050919050565b6000602082019050818103600083015261328d81612f15565b9050919050565b600060208201905081810360008301526132ad81612f38565b9050919050565b600060208201905081810360008301526132cd81612f7e565b9050919050565b600060208201905081810360008301526132ed81612fa1565b9050919050565b60006020820190506133096000830184612fc4565b92915050565b600061331961332a565b90506133258282613588565b919050565b6000604051905090565b600067ffffffffffffffff82111561334f5761334e61367e565b5b613358826136c1565b9050602081019050919050565b600067ffffffffffffffff8211156133805761337f61367e565b5b613389826136c1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133e4826134fd565b91506133ef836134fd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613424576134236135f1565b5b828201905092915050565b600061343a826134fd565b9150613445836134fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561347e5761347d6135f1565b5b828202905092915050565b6000613494826134dd565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613541578082015181840152602081019050613526565b83811115613550576000848401525b50505050565b6000600282049050600182168061356e57607f821691505b602082108114156135825761358161364f565b5b50919050565b613591826136c1565b810181811067ffffffffffffffff821117156135b0576135af61367e565b5b80604052505050565b60006135c4826135d5565b9050919050565b6000819050919050565b60006135e0826136d2565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f7420456e61626c656400000000000000000000000000600082015250565b7f457863656564656420746865206c696d69740000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4e6f7420656e6f75676820746f6b656e73206c65667400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f446f6e2774206368656174000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b61399881613489565b81146139a357600080fd5b50565b6139af8161349b565b81146139ba57600080fd5b50565b6139c6816134b1565b81146139d157600080fd5b50565b6139dd816134fd565b81146139e857600080fd5b5056fea264697066735822122097964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e4864736f6c63430008070033

Deployed Bytecode Sourcemap

66793:5202:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33693:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71224:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34595:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41086:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40519:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67808:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30346:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44725:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69216:1065;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70836:114;;;:::i;:::-;;47646:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67909:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71361:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35988:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67434:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31530:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14472:103;;;;;;;;;;;;;:::i;:::-;;13824:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34771:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68591:617;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41644:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68003:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67049:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71494:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48437:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66979:35;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71691:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66900:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71091:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42035:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14730:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70289:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66943:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33693:639;33778:4;34117:10;34102:25;;:11;:25;;;;:102;;;;34194:10;34179:25;;:11;:25;;;;34102:102;:179;;;;34271:10;34256:25;;:11;:25;;;;34102:179;34082:199;;33693:639;;;:::o;71224:108::-;13710:13;:11;:13::i;:::-;71316:8:::1;71299:14;;:25;;;;;;;;;;;;;;;;;;71224:108:::0;:::o;34595:100::-;34649:13;34682:5;34675:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34595:100;:::o;41086:218::-;41162:7;41187:16;41195:7;41187;:16::i;:::-;41182:64;;41212:34;;;;;;;;;;;;;;41182:64;41266:15;:24;41282:7;41266:24;;;;;;;;;;;:30;;;;;;;;;;;;41259:37;;41086:218;;;:::o;40519:408::-;40608:13;40624:16;40632:7;40624;:16::i;:::-;40608:32;;40680:5;40657:28;;:19;:17;:19::i;:::-;:28;;;40653:175;;40705:44;40722:5;40729:19;:17;:19::i;:::-;40705:16;:44::i;:::-;40700:128;;40777:35;;;;;;;;;;;;;;40700:128;40653:175;40873:2;40840:15;:24;40856:7;40840:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40911:7;40907:2;40891:28;;40900:5;40891:28;;;;;;;;;;;;40597:330;40519:408;;:::o;67808:93::-;67852:7;67879:14;:12;:14::i;:::-;67872:21;;67808:93;:::o;30346:323::-;30407:7;30635:15;:13;:15::i;:::-;30620:12;;30604:13;;:28;:46;30597:53;;30346:323;:::o;44725:2825::-;44867:27;44897;44916:7;44897:18;:27::i;:::-;44867:57;;44982:4;44941:45;;44957:19;44941:45;;;44937:86;;44995:28;;;;;;;;;;;;;;44937:86;45037:27;45066:23;45093:35;45120:7;45093:26;:35::i;:::-;45036:92;;;;45228:68;45253:15;45270:4;45276:19;:17;:19::i;:::-;45228:24;:68::i;:::-;45223:180;;45316:43;45333:4;45339:19;:17;:19::i;:::-;45316:16;:43::i;:::-;45311:92;;45368:35;;;;;;;;;;;;;;45311:92;45223:180;45434:1;45420:16;;:2;:16;;;45416:52;;;45445:23;;;;;;;;;;;;;;45416:52;45481:43;45503:4;45509:2;45513:7;45522:1;45481:21;:43::i;:::-;45617:15;45614:160;;;45757:1;45736:19;45729:30;45614:160;46154:18;:24;46173:4;46154:24;;;;;;;;;;;;;;;;46152:26;;;;;;;;;;;;46223:18;:22;46242:2;46223:22;;;;;;;;;;;;;;;;46221:24;;;;;;;;;;;46545:146;46582:2;46631:45;46646:4;46652:2;46656:19;46631:14;:45::i;:::-;26745:8;46603:73;46545:18;:146::i;:::-;46516:17;:26;46534:7;46516:26;;;;;;;;;;;:175;;;;46862:1;26745:8;46811:19;:47;:52;46807:627;;;46884:19;46916:1;46906:7;:11;46884:33;;47073:1;47039:17;:30;47057:11;47039:30;;;;;;;;;;;;:35;47035:384;;;47177:13;;47162:11;:28;47158:242;;47357:19;47324:17;:30;47342:11;47324:30;;;;;;;;;;;:52;;;;47158:242;47035:384;46865:569;46807:627;47481:7;47477:2;47462:27;;47471:4;47462:27;;;;;;;;;;;;47500:42;47521:4;47527:2;47531:7;47540:1;47500:20;:42::i;:::-;44856:2694;;;44725:2825;;;:::o;69216:1065::-;69399:10;;;;;;;;;;;69391:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;69589:9;;69558:27;69572:12;:10;:12::i;:::-;69558:13;:27::i;:::-;69546:9;:39;;;;:::i;:::-;:52;;69524:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;69706:10;;69693:9;69677:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;69655:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;69810:9;69799:8;;:20;;;;:::i;:::-;69785:9;:35;;69777:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;69894:10;69879:25;;:11;:25;;;;:53;;;;;69922:10;69908:24;;:10;:24;;;69879:53;69857:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;70082:13;;;;;;;;;;;70004:91;;:57;70014:10;70026:9;70037:11;70050:10;70004:9;:57::i;:::-;:91;;;69982:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;70147:34;70157:12;:10;:12::i;:::-;70171:9;70147;:34::i;:::-;70212:9;70192:3;:16;70196:11;70192:16;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;70249:9;70239:34;70260:12;:10;:12::i;:::-;70239:34;;;;;;:::i;:::-;;;;;;;;69216:1065;;;;:::o;70836:114::-;13710:13;:11;:13::i;:::-;70902:7:::1;:5;:7::i;:::-;70894:25;;:48;70920:21;70894:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70836:114::o:0;47646:193::-;47792:39;47809:4;47815:2;47819:7;47792:39;;;;;;;;;;;;:16;:39::i;:::-;47646:193;;;:::o;67909:86::-;67946:7;67973:14;:12;:14::i;:::-;67966:21;;67909:86;:::o;71361:92::-;13710:13;:11;:13::i;:::-;71441:4:::1;71431:7;:14;;;;;;;;;;;;:::i;:::-;;71361:92:::0;:::o;35988:152::-;36060:7;36103:27;36122:7;36103:18;:27::i;:::-;36080:52;;35988:152;;;:::o;67434:102::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31530:233::-;31602:7;31643:1;31626:19;;:5;:19;;;31622:60;;;31654:28;;;;;;;;;;;;;;31622:60;25689:13;31700:18;:25;31719:5;31700:25;;;;;;;;;;;;;;;;:55;31693:62;;31530:233;;;:::o;14472:103::-;13710:13;:11;:13::i;:::-;14537:30:::1;14564:1;14537:18;:30::i;:::-;14472:103::o:0;13824:87::-;13870:7;13897:6;;;;;;;;;;;13890:13;;13824:87;:::o;34771:104::-;34827:13;34860:7;34853:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34771:104;:::o;68591:617::-;68659:10;;;;;;;;;;;68651:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;68848:9;;68817:27;68831:12;:10;:12::i;:::-;68817:13;:27::i;:::-;68806:8;:38;;;;:::i;:::-;:51;;68784:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;68964:10;;68952:8;68936:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;68914:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;69068:8;69057;;:19;;;;:::i;:::-;69043:9;:34;;69035:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69116:33;69126:12;:10;:12::i;:::-;69140:8;69116:9;:33::i;:::-;69177:8;69167:33;69187:12;:10;:12::i;:::-;69167:33;;;;;;:::i;:::-;;;;;;;;68591:617;:::o;41644:234::-;41791:8;41739:18;:39;41758:19;:17;:19::i;:::-;41739:39;;;;;;;;;;;;;;;:49;41779:8;41739:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41851:8;41815:55;;41830:19;:17;:19::i;:::-;41815:55;;;41861:8;41815:55;;;;;;:::i;:::-;;;;;;;;41644:234;;:::o;68003:128::-;13710:13;:11;:13::i;:::-;68086:6:::1;68072:20;;:10;;;;;;;;;;;:20;;;;68064:29;;;::::0;::::1;;68117:6;68104:10;;:19;;;;;;;;;;;;;;;;;;68003:128:::0;:::o;67049:74::-;;;;;;;;;;;;;:::o;71494:172::-;13710:13;:11;:13::i;:::-;71598:12:::1;71577:18;:33;;;;71645:12;71626:32;;;;;;;;;;71494:172:::0;:::o;48437:407::-;48612:31;48625:4;48631:2;48635:7;48612:12;:31::i;:::-;48676:1;48658:2;:14;;;:19;48654:183;;48697:56;48728:4;48734:2;48738:7;48747:5;48697:30;:56::i;:::-;48692:145;;48781:40;;;;;;;;;;;;;;48692:145;48654:183;48437:407;;;;:::o;66979:35::-;;;;;;;;;;;;;;;;;:::o;71691:301::-;71809:13;71848:16;71856:7;71848;:16::i;:::-;71840:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71943:10;:8;:10::i;:::-;71955:18;71965:7;71955:9;:18::i;:::-;71926:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71899:85;;71691:301;;;:::o;66900:36::-;;;;:::o;71091:96::-;13710:13;:11;:13::i;:::-;71170:9:::1;71159:8;:20;;;;71091:96:::0;:::o;42035:164::-;42132:4;42156:18;:25;42175:5;42156:25;;;;;;;;;;;;;;;:35;42182:8;42156:35;;;;;;;;;;;;;;;;;;;;;;;;;42149:42;;42035:164;;;;:::o;14730:201::-;13710:13;:11;:13::i;:::-;14839:1:::1;14819:22;;:8;:22;;;;14811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14895:28;14914:8;14895:18;:28::i;:::-;14730:201:::0;:::o;70289:539::-;13710:13;:11;:13::i;:::-;70376:10:::1;;;;;;;;;;;70368:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;70566:9;;70535:27;70549:12;:10;:12::i;:::-;70535:13;:27::i;:::-;70523:9;:39;;;;:::i;:::-;:52;;70501:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;70683:10;;70670:9;70654:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;70632:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;70754:25;70764:3;70769:9;70754;:25::i;:::-;70805:9;70795:25;70816:3;70795:25;;;;;;:::i;:::-;;;;;;;;70289:539:::0;;:::o;66943:29::-;;;;;;;;;;;;;:::o;13989:132::-;14064:12;:10;:12::i;:::-;14053:23;;:7;:5;:7::i;:::-;:23;;;14045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13989:132::o;42457:282::-;42522:4;42578:7;42559:15;:13;:15::i;:::-;:26;;:66;;;;;42612:13;;42602:7;:23;42559:66;:153;;;;;42711:1;26465:8;42663:17;:26;42681:7;42663:26;;;;;;;;;;;;:44;:49;42559:153;42539:173;;42457:282;;;:::o;64765:105::-;64825:7;64852:10;64845:17;;64765:105;:::o;31145:102::-;31200:7;31227:12;;31220:19;;31145:102;:::o;67707:93::-;67764:7;67791:1;67784:8;;67707:93;:::o;37143:1275::-;37210:7;37230:12;37245:7;37230:22;;37313:4;37294:15;:13;:15::i;:::-;:23;37290:1061;;37347:13;;37340:4;:20;37336:1015;;;37385:14;37402:17;:23;37420:4;37402:23;;;;;;;;;;;;37385:40;;37519:1;26465:8;37491:6;:24;:29;37487:845;;;38156:113;38173:1;38163:6;:11;38156:113;;;38216:17;:25;38234:6;;;;;;;38216:25;;;;;;;;;;;;38207:34;;38156:113;;;38302:6;38295:13;;;;;;37487:845;37362:989;37336:1015;37290:1061;38379:31;;;;;;;;;;;;;;37143:1275;;;;:::o;43620:485::-;43722:27;43751:23;43792:38;43833:15;:24;43849:7;43833:24;;;;;;;;;;;43792:65;;44010:18;43987:41;;44067:19;44061:26;44042:45;;43972:126;43620:485;;;:::o;42848:659::-;42997:11;43162:16;43155:5;43151:28;43142:37;;43322:16;43311:9;43307:32;43294:45;;43472:15;43461:9;43458:30;43450:5;43439:9;43436:20;43433:56;43423:66;;42848:659;;;;;:::o;49506:159::-;;;;;:::o;64074:311::-;64209:7;64229:16;26869:3;64255:19;:41;;64229:68;;26869:3;64323:31;64334:4;64340:2;64344:9;64323:10;:31::i;:::-;64315:40;;:62;;64308:69;;;64074:311;;;;;:::o;38966:450::-;39046:14;39214:16;39207:5;39203:28;39194:37;;39391:5;39377:11;39352:23;39348:41;39345:52;39338:5;39335:63;39325:73;;38966:450;;;;:::o;50330:158::-;;;;;:::o;12375:98::-;12428:7;12455:10;12448:17;;12375:98;:::o;31845:178::-;31906:7;25689:13;25827:2;31934:18;:25;31953:5;31934:25;;;;;;;;;;;;;;;;:50;;31933:82;31926:89;;31845:178;;;:::o;68139:444::-;68305:7;68325:12;68381:10;68393:9;68404:11;68364:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68340:87;;;;;;68325:102;;68438:15;68456:34;68485:4;68456:28;:34::i;:::-;68438:52;;68501:14;68518:33;68532:7;68541:9;68518:13;:33::i;:::-;68501:50;;68569:6;68562:13;;;;;68139:444;;;;;;:::o;58597:112::-;58674:27;58684:2;58688:8;58674:27;;;;;;;;;;;;:9;:27::i;:::-;58597:112;;:::o;30033:103::-;30088:7;30115:13;;30108:20;;30033:103;:::o;15091:191::-;15165:16;15184:6;;;;;;;;;;;15165:25;;15210:8;15201:6;;:17;;;;;;;;;;;;;;;;;;15265:8;15234:40;;15255:8;15234:40;;;;;;;;;;;;15154:128;15091:191;:::o;50928:716::-;51091:4;51137:2;51112:45;;;51158:19;:17;:19::i;:::-;51179:4;51185:7;51194:5;51112:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51412:1;51395:6;:13;:18;51391:235;;;51441:40;;;;;;;;;;;;;;51391:235;51584:6;51578:13;51569:6;51565:2;51561:15;51554:38;51108:529;51281:54;;;51271:64;;;:6;:64;;;;51264:71;;;50928:716;;;;;;:::o;70983:100::-;71035:13;71068:7;71061:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70983:100;:::o;64972:1745::-;65037:17;65471:4;65464;65458:11;65454:22;65563:1;65557:4;65550:15;65638:4;65635:1;65631:12;65624:19;;65720:1;65715:3;65708:14;65824:3;66063:5;66045:428;66071:1;66045:428;;;66111:1;66106:3;66102:11;66095:18;;66282:2;66276:4;66272:13;66268:2;66264:22;66259:3;66251:36;66376:2;66370:4;66366:13;66358:21;;66443:4;66433:25;;66451:5;;66433:25;66045:428;;;66049:21;66512:3;66507;66503:13;66627:4;66622:3;66618:14;66611:21;;66692:6;66687:3;66680:19;65076:1634;;;64972:1745;;;:::o;63775:147::-;63912:6;63775:147;;;;;:::o;10381:269::-;10450:7;10636:4;10583:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10573:69;;;;;;10566:76;;10381:269;;;:::o;6579:231::-;6657:7;6678:17;6697:18;6719:27;6730:4;6736:9;6719:10;:27::i;:::-;6677:69;;;;6757:18;6769:5;6757:11;:18::i;:::-;6793:9;6786:16;;;;6579:231;;;;:::o;57824:689::-;57955:19;57961:2;57965:8;57955:5;:19::i;:::-;58034:1;58016:2;:14;;;:19;58012:483;;58056:11;58070:13;;58056:27;;58102:13;58124:8;58118:3;:14;58102:30;;58151:233;58182:62;58221:1;58225:2;58229:7;;;;;;58238:5;58182:30;:62::i;:::-;58177:167;;58280:40;;;;;;;;;;;;;;58177:167;58379:3;58371:5;:11;58151:233;;58466:3;58449:13;;:20;58445:34;;58471:8;;;58445:34;58037:458;;58012:483;57824:689;;;:::o;5030:747::-;5111:7;5120:12;5169:2;5149:9;:16;:22;5145:625;;;5188:9;5212;5236:7;5493:4;5482:9;5478:20;5472:27;5467:32;;5543:4;5532:9;5528:20;5522:27;5517:32;;5601:4;5590:9;5586:20;5580:27;5577:1;5572:36;5567:41;;5644:25;5655:4;5661:1;5664;5667;5644:10;:25::i;:::-;5637:32;;;;;;;;;5145:625;5718:1;5722:35;5702:56;;;;5030:747;;;;;;:::o;3301:643::-;3379:20;3370:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3366:571;;;3416:7;;3366:571;3477:29;3468:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3464:473;;;3523:34;;;;;;;;;;:::i;:::-;;;;;;;;3464:473;3588:35;3579:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3575:362;;;3640:41;;;;;;;;;;:::i;:::-;;;;;;;;3575:362;3712:30;3703:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3699:238;;;3759:44;;;;;;;;;;:::i;:::-;;;;;;;;3699:238;3834:30;3825:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3821:116;;;3881:44;;;;;;;;;;:::i;:::-;;;;;;;;3821:116;3301:643;;:::o;52106:2966::-;52179:20;52202:13;;52179:36;;52242:1;52230:8;:13;52226:44;;;52252:18;;;;;;;;;;;;;;52226:44;52283:61;52313:1;52317:2;52321:12;52335:8;52283:21;:61::i;:::-;52827:1;25827:2;52797:1;:26;;52796:32;52784:8;:45;52758:18;:22;52777:2;52758:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53106:139;53143:2;53197:33;53220:1;53224:2;53228:1;53197:14;:33::i;:::-;53164:30;53185:8;53164:20;:30::i;:::-;:66;53106:18;:139::i;:::-;53072:17;:31;53090:12;53072:31;;;;;;;;;;;:173;;;;53262:16;53293:11;53322:8;53307:12;:23;53293:37;;53843:16;53839:2;53835:25;53823:37;;54215:12;54175:8;54134:1;54072:25;54013:1;53952;53925:335;54586:1;54572:12;54568:20;54526:346;54627:3;54618:7;54615:16;54526:346;;54845:7;54835:8;54832:1;54805:25;54802:1;54799;54794:59;54680:1;54671:7;54667:15;54656:26;;54526:346;;;54530:77;54917:1;54905:8;:13;54901:45;;;54927:19;;;;;;;;;;;;;;54901:45;54979:3;54963:13;:19;;;;52532:2462;;55004:60;55033:1;55037:2;55041:12;55055:8;55004:20;:60::i;:::-;52168:2904;52106:2966;;:::o;8031:1632::-;8162:7;8171:12;9096:66;9091:1;9083:10;;:79;9079:163;;;9195:1;9199:30;9179:51;;;;;;9079:163;9261:2;9256:1;:7;;;;:18;;;;;9272:2;9267:1;:7;;;;9256:18;9252:102;;;9307:1;9311:30;9291:51;;;;;;9252:102;9451:14;9468:24;9478:4;9484:1;9487;9490;9468:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9451:41;;9525:1;9507:20;;:6;:20;;;9503:103;;;9560:1;9564:29;9544:50;;;;;;;9503:103;9626:6;9634:20;9618:37;;;;;8031:1632;;;;;;;;:::o;39518:324::-;39588:14;39821:1;39811:8;39808:15;39782:24;39778:46;39768:56;;39518:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:943::-;5715:6;5723;5731;5739;5788:3;5776:9;5767:7;5763:23;5759:33;5756:120;;;5795:79;;:::i;:::-;5756:120;5915:1;5940:53;5985:7;5976:6;5965:9;5961:22;5940:53;:::i;:::-;5930:63;;5886:117;6042:2;6068:53;6113:7;6104:6;6093:9;6089:22;6068:53;:::i;:::-;6058:63;;6013:118;6170:2;6196:53;6241:7;6232:6;6221:9;6217:22;6196:53;:::i;:::-;6186:63;;6141:118;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:62;6538:7;6529:6;6518:9;6514:22;6484:62;:::i;:::-;6474:72;;6269:287;5620:943;;;;;;;:::o;6569:323::-;6625:6;6674:2;6662:9;6653:7;6649:23;6645:32;6642:119;;;6680:79;;:::i;:::-;6642:119;6800:1;6825:50;6867:7;6858:6;6847:9;6843:22;6825:50;:::i;:::-;6815:60;;6771:114;6569:323;;;;:::o;6898:327::-;6956:6;7005:2;6993:9;6984:7;6980:23;6976:32;6973:119;;;7011:79;;:::i;:::-;6973:119;7131:1;7156:52;7200:7;7191:6;7180:9;7176:22;7156:52;:::i;:::-;7146:62;;7102:116;6898:327;;;;:::o;7231:349::-;7300:6;7349:2;7337:9;7328:7;7324:23;7320:32;7317:119;;;7355:79;;:::i;:::-;7317:119;7475:1;7500:63;7555:7;7546:6;7535:9;7531:22;7500:63;:::i;:::-;7490:73;;7446:127;7231:349;;;;:::o;7586:509::-;7655:6;7704:2;7692:9;7683:7;7679:23;7675:32;7672:119;;;7710:79;;:::i;:::-;7672:119;7858:1;7847:9;7843:17;7830:31;7888:18;7880:6;7877:30;7874:117;;;7910:79;;:::i;:::-;7874:117;8015:63;8070:7;8061:6;8050:9;8046:22;8015:63;:::i;:::-;8005:73;;7801:287;7586:509;;;;:::o;8101:329::-;8160:6;8209:2;8197:9;8188:7;8184:23;8180:32;8177:119;;;8215:79;;:::i;:::-;8177:119;8335:1;8360:53;8405:7;8396:6;8385:9;8381:22;8360:53;:::i;:::-;8350:63;;8306:117;8101:329;;;;:::o;8436:474::-;8504:6;8512;8561:2;8549:9;8540:7;8536:23;8532:32;8529:119;;;8567:79;;:::i;:::-;8529:119;8687:1;8712:53;8757:7;8748:6;8737:9;8733:22;8712:53;:::i;:::-;8702:63;;8658:117;8814:2;8840:53;8885:7;8876:6;8865:9;8861:22;8840:53;:::i;:::-;8830:63;;8785:118;8436:474;;;;;:::o;8916:118::-;9003:24;9021:5;9003:24;:::i;:::-;8998:3;8991:37;8916:118;;:::o;9040:157::-;9145:45;9165:24;9183:5;9165:24;:::i;:::-;9145:45;:::i;:::-;9140:3;9133:58;9040:157;;:::o;9203:109::-;9284:21;9299:5;9284:21;:::i;:::-;9279:3;9272:34;9203:109;;:::o;9318:118::-;9405:24;9423:5;9405:24;:::i;:::-;9400:3;9393:37;9318:118;;:::o;9442:157::-;9547:45;9567:24;9585:5;9567:24;:::i;:::-;9547:45;:::i;:::-;9542:3;9535:58;9442:157;;:::o;9605:360::-;9691:3;9719:38;9751:5;9719:38;:::i;:::-;9773:70;9836:6;9831:3;9773:70;:::i;:::-;9766:77;;9852:52;9897:6;9892:3;9885:4;9878:5;9874:16;9852:52;:::i;:::-;9929:29;9951:6;9929:29;:::i;:::-;9924:3;9920:39;9913:46;;9695:270;9605:360;;;;:::o;9971:364::-;10059:3;10087:39;10120:5;10087:39;:::i;:::-;10142:71;10206:6;10201:3;10142:71;:::i;:::-;10135:78;;10222:52;10267:6;10262:3;10255:4;10248:5;10244:16;10222:52;:::i;:::-;10299:29;10321:6;10299:29;:::i;:::-;10294:3;10290:39;10283:46;;10063:272;9971:364;;;;:::o;10341:377::-;10447:3;10475:39;10508:5;10475:39;:::i;:::-;10530:89;10612:6;10607:3;10530:89;:::i;:::-;10523:96;;10628:52;10673:6;10668:3;10661:4;10654:5;10650:16;10628:52;:::i;:::-;10705:6;10700:3;10696:16;10689:23;;10451:267;10341:377;;;;:::o;10724:366::-;10866:3;10887:67;10951:2;10946:3;10887:67;:::i;:::-;10880:74;;10963:93;11052:3;10963:93;:::i;:::-;11081:2;11076:3;11072:12;11065:19;;10724:366;;;:::o;11096:::-;11238:3;11259:67;11323:2;11318:3;11259:67;:::i;:::-;11252:74;;11335:93;11424:3;11335:93;:::i;:::-;11453:2;11448:3;11444:12;11437:19;;11096:366;;;:::o;11468:402::-;11628:3;11649:85;11731:2;11726:3;11649:85;:::i;:::-;11642:92;;11743:93;11832:3;11743:93;:::i;:::-;11861:2;11856:3;11852:12;11845:19;;11468:402;;;:::o;11876:366::-;12018:3;12039:67;12103:2;12098:3;12039:67;:::i;:::-;12032:74;;12115:93;12204:3;12115:93;:::i;:::-;12233:2;12228:3;12224:12;12217:19;;11876:366;;;:::o;12248:::-;12390:3;12411:67;12475:2;12470:3;12411:67;:::i;:::-;12404:74;;12487:93;12576:3;12487:93;:::i;:::-;12605:2;12600:3;12596:12;12589:19;;12248:366;;;:::o;12620:::-;12762:3;12783:67;12847:2;12842:3;12783:67;:::i;:::-;12776:74;;12859:93;12948:3;12859:93;:::i;:::-;12977:2;12972:3;12968:12;12961:19;;12620:366;;;:::o;12992:::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:::-;13506:3;13527:67;13591:2;13586:3;13527:67;:::i;:::-;13520:74;;13603:93;13692:3;13603:93;:::i;:::-;13721:2;13716:3;13712:12;13705:19;;13364:366;;;:::o;13736:::-;13878:3;13899:67;13963:2;13958:3;13899:67;:::i;:::-;13892:74;;13975:93;14064:3;13975:93;:::i;:::-;14093:2;14088:3;14084:12;14077:19;;13736:366;;;:::o;14108:::-;14250:3;14271:67;14335:2;14330:3;14271:67;:::i;:::-;14264:74;;14347:93;14436:3;14347:93;:::i;:::-;14465:2;14460:3;14456:12;14449:19;;14108:366;;;:::o;14480:::-;14622:3;14643:67;14707:2;14702:3;14643:67;:::i;:::-;14636:74;;14719:93;14808:3;14719:93;:::i;:::-;14837:2;14832:3;14828:12;14821:19;;14480:366;;;:::o;14852:400::-;15012:3;15033:84;15115:1;15110:3;15033:84;:::i;:::-;15026:91;;15126:93;15215:3;15126:93;:::i;:::-;15244:1;15239:3;15235:11;15228:18;;14852:400;;;:::o;15258:366::-;15400:3;15421:67;15485:2;15480:3;15421:67;:::i;:::-;15414:74;;15497:93;15586:3;15497:93;:::i;:::-;15615:2;15610:3;15606:12;15599:19;;15258:366;;;:::o;15630:::-;15772:3;15793:67;15857:2;15852:3;15793:67;:::i;:::-;15786:74;;15869:93;15958:3;15869:93;:::i;:::-;15987:2;15982:3;15978:12;15971:19;;15630:366;;;:::o;16002:118::-;16089:24;16107:5;16089:24;:::i;:::-;16084:3;16077:37;16002:118;;:::o;16126:157::-;16231:45;16251:24;16269:5;16251:24;:::i;:::-;16231:45;:::i;:::-;16226:3;16219:58;16126:157;;:::o;16289:112::-;16372:22;16388:5;16372:22;:::i;:::-;16367:3;16360:35;16289:112;;:::o;16407:538::-;16575:3;16590:75;16661:3;16652:6;16590:75;:::i;:::-;16690:2;16685:3;16681:12;16674:19;;16703:75;16774:3;16765:6;16703:75;:::i;:::-;16803:2;16798:3;16794:12;16787:19;;16816:75;16887:3;16878:6;16816:75;:::i;:::-;16916:2;16911:3;16907:12;16900:19;;16936:3;16929:10;;16407:538;;;;;;:::o;16951:701::-;17232:3;17254:95;17345:3;17336:6;17254:95;:::i;:::-;17247:102;;17366:95;17457:3;17448:6;17366:95;:::i;:::-;17359:102;;17478:148;17622:3;17478:148;:::i;:::-;17471:155;;17643:3;17636:10;;16951:701;;;;;:::o;17658:522::-;17871:3;17893:148;18037:3;17893:148;:::i;:::-;17886:155;;18051:75;18122:3;18113:6;18051:75;:::i;:::-;18151:2;18146:3;18142:12;18135:19;;18171:3;18164:10;;17658:522;;;;:::o;18186:222::-;18279:4;18317:2;18306:9;18302:18;18294:26;;18330:71;18398:1;18387:9;18383:17;18374:6;18330:71;:::i;:::-;18186:222;;;;:::o;18414:640::-;18609:4;18647:3;18636:9;18632:19;18624:27;;18661:71;18729:1;18718:9;18714:17;18705:6;18661:71;:::i;:::-;18742:72;18810:2;18799:9;18795:18;18786:6;18742:72;:::i;:::-;18824;18892:2;18881:9;18877:18;18868:6;18824:72;:::i;:::-;18943:9;18937:4;18933:20;18928:2;18917:9;18913:18;18906:48;18971:76;19042:4;19033:6;18971:76;:::i;:::-;18963:84;;18414:640;;;;;;;:::o;19060:210::-;19147:4;19185:2;19174:9;19170:18;19162:26;;19198:65;19260:1;19249:9;19245:17;19236:6;19198:65;:::i;:::-;19060:210;;;;:::o;19276:545::-;19449:4;19487:3;19476:9;19472:19;19464:27;;19501:71;19569:1;19558:9;19554:17;19545:6;19501:71;:::i;:::-;19582:68;19646:2;19635:9;19631:18;19622:6;19582:68;:::i;:::-;19660:72;19728:2;19717:9;19713:18;19704:6;19660:72;:::i;:::-;19742;19810:2;19799:9;19795:18;19786:6;19742:72;:::i;:::-;19276:545;;;;;;;:::o;19827:313::-;19940:4;19978:2;19967:9;19963:18;19955:26;;20027:9;20021:4;20017:20;20013:1;20002:9;19998:17;19991:47;20055:78;20128:4;20119:6;20055:78;:::i;:::-;20047:86;;19827:313;;;;:::o;20146:419::-;20312:4;20350:2;20339:9;20335:18;20327:26;;20399:9;20393:4;20389:20;20385:1;20374:9;20370:17;20363:47;20427:131;20553:4;20427:131;:::i;:::-;20419:139;;20146:419;;;:::o;20571:::-;20737:4;20775:2;20764:9;20760:18;20752:26;;20824:9;20818:4;20814:20;20810:1;20799:9;20795:17;20788:47;20852:131;20978:4;20852:131;:::i;:::-;20844:139;;20571:419;;;:::o;20996:::-;21162:4;21200:2;21189:9;21185:18;21177:26;;21249:9;21243:4;21239:20;21235:1;21224:9;21220:17;21213:47;21277:131;21403:4;21277:131;:::i;:::-;21269:139;;20996:419;;;:::o;21421:::-;21587:4;21625:2;21614:9;21610:18;21602:26;;21674:9;21668:4;21664:20;21660:1;21649:9;21645:17;21638:47;21702:131;21828:4;21702:131;:::i;:::-;21694:139;;21421:419;;;:::o;21846:::-;22012:4;22050:2;22039:9;22035:18;22027:26;;22099:9;22093:4;22089:20;22085:1;22074:9;22070:17;22063:47;22127:131;22253:4;22127:131;:::i;:::-;22119:139;;21846:419;;;:::o;22271:::-;22437:4;22475:2;22464:9;22460:18;22452:26;;22524:9;22518:4;22514:20;22510:1;22499:9;22495:17;22488:47;22552:131;22678:4;22552:131;:::i;:::-;22544:139;;22271:419;;;:::o;22696:::-;22862:4;22900:2;22889:9;22885:18;22877:26;;22949:9;22943:4;22939:20;22935:1;22924:9;22920:17;22913:47;22977:131;23103:4;22977:131;:::i;:::-;22969:139;;22696:419;;;:::o;23121:::-;23287:4;23325:2;23314:9;23310:18;23302:26;;23374:9;23368:4;23364:20;23360:1;23349:9;23345:17;23338:47;23402:131;23528:4;23402:131;:::i;:::-;23394:139;;23121:419;;;:::o;23546:::-;23712:4;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23546:419;;;:::o;23971:::-;24137:4;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:131;24378:4;24252:131;:::i;:::-;24244:139;;23971:419;;;:::o;24396:::-;24562:4;24600:2;24589:9;24585:18;24577:26;;24649:9;24643:4;24639:20;24635:1;24624:9;24620:17;24613:47;24677:131;24803:4;24677:131;:::i;:::-;24669:139;;24396:419;;;:::o;24821:::-;24987:4;25025:2;25014:9;25010:18;25002:26;;25074:9;25068:4;25064:20;25060:1;25049:9;25045:17;25038:47;25102:131;25228:4;25102:131;:::i;:::-;25094:139;;24821:419;;;:::o;25246:222::-;25339:4;25377:2;25366:9;25362:18;25354:26;;25390:71;25458:1;25447:9;25443:17;25434:6;25390:71;:::i;:::-;25246:222;;;;:::o;25474:129::-;25508:6;25535:20;;:::i;:::-;25525:30;;25564:33;25592:4;25584:6;25564:33;:::i;:::-;25474:129;;;:::o;25609:75::-;25642:6;25675:2;25669:9;25659:19;;25609:75;:::o;25690:307::-;25751:4;25841:18;25833:6;25830:30;25827:56;;;25863:18;;:::i;:::-;25827:56;25901:29;25923:6;25901:29;:::i;:::-;25893:37;;25985:4;25979;25975:15;25967:23;;25690:307;;;:::o;26003:308::-;26065:4;26155:18;26147:6;26144:30;26141:56;;;26177:18;;:::i;:::-;26141:56;26215:29;26237:6;26215:29;:::i;:::-;26207:37;;26299:4;26293;26289:15;26281:23;;26003:308;;;:::o;26317:98::-;26368:6;26402:5;26396:12;26386:22;;26317:98;;;:::o;26421:99::-;26473:6;26507:5;26501:12;26491:22;;26421:99;;;:::o;26526:168::-;26609:11;26643:6;26638:3;26631:19;26683:4;26678:3;26674:14;26659:29;;26526:168;;;;:::o;26700:169::-;26784:11;26818:6;26813:3;26806:19;26858:4;26853:3;26849:14;26834:29;;26700:169;;;;:::o;26875:148::-;26977:11;27014:3;26999:18;;26875:148;;;;:::o;27029:305::-;27069:3;27088:20;27106:1;27088:20;:::i;:::-;27083:25;;27122:20;27140:1;27122:20;:::i;:::-;27117:25;;27276:1;27208:66;27204:74;27201:1;27198:81;27195:107;;;27282:18;;:::i;:::-;27195:107;27326:1;27323;27319:9;27312:16;;27029:305;;;;:::o;27340:348::-;27380:7;27403:20;27421:1;27403:20;:::i;:::-;27398:25;;27437:20;27455:1;27437:20;:::i;:::-;27432:25;;27625:1;27557:66;27553:74;27550:1;27547:81;27542:1;27535:9;27528:17;27524:105;27521:131;;;27632:18;;:::i;:::-;27521:131;27680:1;27677;27673:9;27662:20;;27340:348;;;;:::o;27694:96::-;27731:7;27760:24;27778:5;27760:24;:::i;:::-;27749:35;;27694:96;;;:::o;27796:90::-;27830:7;27873:5;27866:13;27859:21;27848:32;;27796:90;;;:::o;27892:77::-;27929:7;27958:5;27947:16;;27892:77;;;:::o;27975:149::-;28011:7;28051:66;28044:5;28040:78;28029:89;;27975:149;;;:::o;28130:126::-;28167:7;28207:42;28200:5;28196:54;28185:65;;28130:126;;;:::o;28262:77::-;28299:7;28328:5;28317:16;;28262:77;;;:::o;28345:86::-;28380:7;28420:4;28413:5;28409:16;28398:27;;28345:86;;;:::o;28437:154::-;28521:6;28516:3;28511;28498:30;28583:1;28574:6;28569:3;28565:16;28558:27;28437:154;;;:::o;28597:307::-;28665:1;28675:113;28689:6;28686:1;28683:13;28675:113;;;28774:1;28769:3;28765:11;28759:18;28755:1;28750:3;28746:11;28739:39;28711:2;28708:1;28704:10;28699:15;;28675:113;;;28806:6;28803:1;28800:13;28797:101;;;28886:1;28877:6;28872:3;28868:16;28861:27;28797:101;28646:258;28597:307;;;:::o;28910:320::-;28954:6;28991:1;28985:4;28981:12;28971:22;;29038:1;29032:4;29028:12;29059:18;29049:81;;29115:4;29107:6;29103:17;29093:27;;29049:81;29177:2;29169:6;29166:14;29146:18;29143:38;29140:84;;;29196:18;;:::i;:::-;29140:84;28961:269;28910:320;;;:::o;29236:281::-;29319:27;29341:4;29319:27;:::i;:::-;29311:6;29307:40;29449:6;29437:10;29434:22;29413:18;29401:10;29398:34;29395:62;29392:88;;;29460:18;;:::i;:::-;29392:88;29500:10;29496:2;29489:22;29279:238;29236:281;;:::o;29523:100::-;29562:7;29591:26;29611:5;29591:26;:::i;:::-;29580:37;;29523:100;;;:::o;29629:79::-;29668:7;29697:5;29686:16;;29629:79;;;:::o;29714:94::-;29753:7;29782:20;29796:5;29782:20;:::i;:::-;29771:31;;29714:94;;;:::o;29814:79::-;29853:7;29882:5;29871:16;;29814:79;;;:::o;29899:180::-;29947:77;29944:1;29937:88;30044:4;30041:1;30034:15;30068:4;30065:1;30058:15;30085:180;30133:77;30130:1;30123:88;30230:4;30227:1;30220:15;30254:4;30251:1;30244:15;30271:180;30319:77;30316:1;30309:88;30416:4;30413:1;30406:15;30440:4;30437:1;30430:15;30457:180;30505:77;30502:1;30495:88;30602:4;30599:1;30592:15;30626:4;30623:1;30616:15;30643:117;30752:1;30749;30742:12;30766:117;30875:1;30872;30865:12;30889:117;30998:1;30995;30988:12;31012:117;31121:1;31118;31111:12;31135:102;31176:6;31227:2;31223:7;31218:2;31211:5;31207:14;31203:28;31193:38;;31135:102;;;:::o;31243:94::-;31276:8;31324:5;31320:2;31316:14;31295:35;;31243:94;;;:::o;31343:174::-;31483:26;31479:1;31471:6;31467:14;31460:50;31343:174;:::o;31523:181::-;31663:33;31659:1;31651:6;31647:14;31640:57;31523:181;:::o;31710:214::-;31850:66;31846:1;31838:6;31834:14;31827:90;31710:214;:::o;31930:225::-;32070:34;32066:1;32058:6;32054:14;32047:58;32139:8;32134:2;32126:6;32122:15;32115:33;31930:225;:::o;32161:169::-;32301:21;32297:1;32289:6;32285:14;32278:45;32161:169;:::o;32336:168::-;32476:20;32472:1;32464:6;32460:14;32453:44;32336:168;:::o;32510:221::-;32650:34;32646:1;32638:6;32634:14;32627:58;32719:4;32714:2;32706:6;32702:15;32695:29;32510:221;:::o;32737:167::-;32877:19;32873:1;32865:6;32861:14;32854:43;32737:167;:::o;32910:172::-;33050:24;33046:1;33038:6;33034:14;33027:48;32910:172;:::o;33088:221::-;33228:34;33224:1;33216:6;33212:14;33205:58;33297:4;33292:2;33284:6;33280:15;33273:29;33088:221;:::o;33315:161::-;33455:13;33451:1;33443:6;33439:14;33432:37;33315:161;:::o;33482:155::-;33622:7;33618:1;33610:6;33606:14;33599:31;33482:155;:::o;33643:182::-;33783:34;33779:1;33771:6;33767:14;33760:58;33643:182;:::o;33831:171::-;33971:23;33967:1;33959:6;33955:14;33948:47;33831:171;:::o;34008:122::-;34081:24;34099:5;34081:24;:::i;:::-;34074:5;34071:35;34061:63;;34120:1;34117;34110:12;34061:63;34008:122;:::o;34136:116::-;34206:21;34221:5;34206:21;:::i;:::-;34199:5;34196:32;34186:60;;34242:1;34239;34232:12;34186:60;34136:116;:::o;34258:120::-;34330:23;34347:5;34330:23;:::i;:::-;34323:5;34320:34;34310:62;;34368:1;34365;34358:12;34310:62;34258:120;:::o;34384:122::-;34457:24;34475:5;34457:24;:::i;:::-;34450:5;34447:35;34437:63;;34496:1;34493;34486:12;34437:63;34384:122;:::o

Swarm Source

ipfs://97964de2d0e9e991a876ebfcd05c0f85b52d6c5ef2286d6d7930844a842e0e48
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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