ETH Price: $2,359.52 (+1.26%)

Token

SecretSnackSandwich (SSS)
 

Overview

Max Total Supply

32 SSS

Holders

26

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hsuchaochao.eth
Balance
1 SSS
0xd994932a46f1f2b456624327e8807455b7644b9d
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:
SecretSandwich

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 2023-01-08
*/

/**
 *Submitted for verification at Etherscan.io on 2022-06-26
*/

// File: Address.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: Context.sol

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

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

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

// File: IERC20.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: IERC721A.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: ERC721A.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

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

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

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

// File: Ownable.sol

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

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

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

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

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

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

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

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

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

// File: SafeERC20.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: SecretSandwich.sol

contract SecretSandwich is ERC721A, Ownable {
    using SafeERC20 for IERC20;

    IERC20 public immutable paymentToken;
    uint256 public immutable maxSupply;

    uint256 public price;
    uint256 public mintStart;
    uint256 public maxMint;

    address public royaltyReceiver;

    string public baseTokenURI;

    mapping(address => uint256) public mints;

    event BalanceWithdrawn(address to, uint256 amount);
    event Mint(address indexed minter, uint256 amount);
    event MaxMintUpdated(uint256 oldMaxMint, uint256 newMaxMint);
    event PriceUpdated(uint256 oldPrice, uint256 newPrice);
    event RoyaltyReceiverUpdated(address oldRoyaltyReceiver, address newRoyaltyReceiver);
    event UriUpdated(string oldUri, string newUri);

    error EmptyUri();
    error ExceedMaxMint();
    error ExceedMaxSupply();
    error SaleNotStarted();
    error ZeroAddress();
    error ZeroMaxMint();
    error ZeroMaxSupply();
    error ZeroPrice();

    /// @param _maxSupply The initial max NFT max supply.
    /// @param _paymentToken The ERC-20 token used for purchasing the NFT
    /// @param _price The price of each NFT
    /// @param _mintStart The timestamp when accounts can start minting
    /// @param _maxMint The max number of mint per address
    /// @param _royaltyReceiver Royalty receiver
    /// @dev The price of each NFT should be in _paymentTokens' decimal places, ie. 6 decimal places for USDC
    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _maxSupply,
        address _paymentToken,
        uint256 _price,
        uint256 _mintStart,
        uint256 _maxMint,
        address _royaltyReceiver
    ) ERC721A(_name, _symbol) {
        if (_paymentToken == address(0)) revert ZeroAddress();
        if (_royaltyReceiver == address(0)) revert ZeroAddress();
        if (_price == 0) revert ZeroPrice();
        if (_maxSupply == 0) revert ZeroMaxSupply();
        if (_maxMint == 0) revert ZeroMaxMint();

        paymentToken = IERC20(_paymentToken);
        royaltyReceiver = _royaltyReceiver;
        price = _price;
        maxSupply = _maxSupply;
        mintStart = _mintStart;
        maxMint = _maxMint;
    }

    /// @param _baseTokenUri the collection's URL
    function setBaseTokenURI(string memory _baseTokenUri) external onlyOwner {
        if (bytes(_baseTokenUri).length == 0) revert EmptyUri();
        string memory oldBaseTokenUri = baseTokenURI;
        baseTokenURI = _baseTokenUri;
        emit UriUpdated(oldBaseTokenUri, _baseTokenUri);
    }

    /// @param _price each NFT's price
    function setPrice(uint256 _price) external onlyOwner {
        if (_price == 0) revert ZeroPrice();
        uint256 oldPrice = price;
        price = _price;
        emit PriceUpdated(oldPrice, _price);
    }

    /// @param _royaltyReceiver Royalty receiver
    function setRoyaltyReceiver(address _royaltyReceiver) external onlyOwner {
        if (_royaltyReceiver == address(0)) revert ZeroAddress();
        address oldRoyaltyReceiver = royaltyReceiver;
        royaltyReceiver = _royaltyReceiver;
        emit RoyaltyReceiverUpdated(oldRoyaltyReceiver, _royaltyReceiver);
    }

    /// @param _maxMint The max number of mint per address
    function setMaxMint(uint256 _maxMint)
        external
        onlyOwner
    {
        if (_maxMint == 0) revert ZeroMaxMint();
        uint256 oldMaxMint = maxMint;
        maxMint = _maxMint;
        emit MaxMintUpdated(oldMaxMint, _maxMint);
    }

    /// @param amount Amount of NFT to mint
    /// @dev no need to check amount > 0 because ERC721a already does it
    function mint(uint256 amount) external {
        if (mintStart > block.timestamp) revert SaleNotStarted();
        if (mints[msg.sender] + amount > maxMint) revert ExceedMaxMint();
        if (totalSupply() + amount > maxSupply) revert ExceedMaxSupply();

        mints[msg.sender] += amount;

        paymentToken.safeTransferFrom(
            msg.sender,
            address(this),
            price * amount
        );

        _safeMint(msg.sender, amount);

        emit Mint(msg.sender, amount);
    }

    /// @param to Address to withdraw balance to
    function withdrawBalance(address to) external onlyOwner {
        if (to == address(0)) revert ZeroAddress();
        uint256 balance = paymentToken.balanceOf(address(this));
        paymentToken.safeTransfer(to, balance);

        emit BalanceWithdrawn(to, balance);
    }

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (
        address receiver,
        uint256 royaltyAmount
    ) {
        receiver = royaltyReceiver;
        royaltyAmount = _salePrice * 500 / 10000;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_mintStart","type":"uint256"},{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"EmptyUri","type":"error"},{"inputs":[],"name":"ExceedMaxMint","type":"error"},{"inputs":[],"name":"ExceedMaxSupply","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":"SaleNotStarted","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"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroMaxMint","type":"error"},{"inputs":[],"name":"ZeroMaxSupply","type":"error"},{"inputs":[],"name":"ZeroPrice","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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceWithdrawn","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":false,"internalType":"uint256","name":"oldMaxMint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxMint","type":"uint256"}],"name":"MaxMintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldRoyaltyReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"newRoyaltyReceiver","type":"address"}],"name":"RoyaltyReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"oldUri","type":"string"},{"indexed":false,"internalType":"string","name":"newUri","type":"string"}],"name":"UriUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","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":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040523480156200001157600080fd5b5060405162004045380380620040458339818101604052810190620000379190620004f9565b87878160029080519060200190620000519291906200039d565b5080600390805190602001906200006a9291906200039d565b506200007b620002ca60201b60201c565b6000819055505050620000a362000097620002cf60201b60201c565b620002d760201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200010b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000173576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415620001af576040517f4dfba02300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000861415620001eb576040517f31c9364300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141562000227576040517f3c43693400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550836009819055508560a0818152505082600a8190555081600b819055505050505050505050620007f6565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003ab90620006d3565b90600052602060002090601f016020900481019282620003cf57600085556200041b565b82601f10620003ea57805160ff19168380011785556200041b565b828001600101855582156200041b579182015b828111156200041a578251825591602001919060010190620003fd565b5b5090506200042a91906200042e565b5090565b5b80821115620004495760008160009055506001016200042f565b5090565b6000620004646200045e8462000629565b62000600565b905082815260208101848484011115620004835762000482620007a2565b5b620004908482856200069d565b509392505050565b600081519050620004a981620007c2565b92915050565b600082601f830112620004c757620004c66200079d565b5b8151620004d98482602086016200044d565b91505092915050565b600081519050620004f381620007dc565b92915050565b600080600080600080600080610100898b0312156200051d576200051c620007ac565b5b600089015167ffffffffffffffff8111156200053e576200053d620007a7565b5b6200054c8b828c01620004af565b985050602089015167ffffffffffffffff81111562000570576200056f620007a7565b5b6200057e8b828c01620004af565b9750506040620005918b828c01620004e2565b9650506060620005a48b828c0162000498565b9550506080620005b78b828c01620004e2565b94505060a0620005ca8b828c01620004e2565b93505060c0620005dd8b828c01620004e2565b92505060e0620005f08b828c0162000498565b9150509295985092959890939650565b60006200060c6200061f565b90506200061a828262000709565b919050565b6000604051905090565b600067ffffffffffffffff8211156200064757620006466200076e565b5b6200065282620007b1565b9050602081019050919050565b60006200066c8262000673565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b83811115620006cd576000848401525b50505050565b60006002820490506001821680620006ec57607f821691505b602082108114156200070357620007026200073f565b5b50919050565b6200071482620007b1565b810181811067ffffffffffffffff821117156200073657620007356200076e565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620007cd816200065f565b8114620007d957600080fd5b50565b620007e78162000693565b8114620007f357600080fd5b50565b60805160601c60a05161380a6200083b600039600081816117290152611bb8015260008181610c8b015281816111c20152818161127201526117fe015261380a6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637501f7411161010f578063a0712d68116100a2578063d547cfb711610071578063d547cfb714610592578063d5abeb01146105b0578063e985e9c5146105ce578063f2fde38b146105fe576101f0565b8063a0712d681461050e578063a22cb4651461052a578063b88d4fde14610546578063c87b56dd14610562576101f0565b806391b7f5ed116100de57806391b7f5ed1461049857806395d89b41146104b45780639fbc8713146104d2578063a035b1fe146104f0576101f0565b80637501f74114610424578063756af45f146104425780638da5cb5b1461045e5780638dc251e31461047c576101f0565b80633013ce29116101875780635660f851116101565780635660f8511461038a5780636352211e146103ba57806370a08231146103ea578063715018a61461041a576101f0565b80633013ce291461031857806330176e131461033657806342842e0e14610352578063547520fe1461036e576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad578063255e4685146102c95780632a55205a146102e7576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612cb9565b61061a565b60405161021c91906130e0565b60405180910390f35b61022d6106ac565b60405161023a9190613116565b60405180910390f35b61025d60048036038101906102589190612d5c565b61073e565b60405161026a9190612ff0565b60405180910390f35b61028d60048036038101906102889190612c4c565b6107ba565b005b6102976108fb565b6040516102a4919061320f565b60405180910390f35b6102c760048036038101906102c29190612b36565b610912565b005b6102d1610c37565b6040516102de919061320f565b60405180910390f35b61030160048036038101906102fc9190612db6565b610c3d565b60405161030f9291906130b7565b60405180910390f35b610320610c89565b60405161032d91906130fb565b60405180910390f35b610350600480360381019061034b9190612d13565b610cad565b005b61036c60048036038101906103679190612b36565b610e48565b005b61038860048036038101906103839190612d5c565b610e68565b005b6103a4600480360381019061039f9190612ac9565b610f6a565b6040516103b1919061320f565b60405180910390f35b6103d460048036038101906103cf9190612d5c565b610f82565b6040516103e19190612ff0565b60405180910390f35b61040460048036038101906103ff9190612ac9565b610f94565b604051610411919061320f565b60405180910390f35b61042261104d565b005b61042c6110d5565b604051610439919061320f565b60405180910390f35b61045c60048036038101906104579190612ac9565b6110db565b005b6104666112f3565b6040516104739190612ff0565b60405180910390f35b61049660048036038101906104919190612ac9565b61131d565b005b6104b260048036038101906104ad9190612d5c565b6114a5565b005b6104bc6115a7565b6040516104c99190613116565b60405180910390f35b6104da611639565b6040516104e79190612ff0565b60405180910390f35b6104f861165f565b604051610505919061320f565b60405180910390f35b61052860048036038101906105239190612d5c565b611665565b005b610544600480360381019061053f9190612c0c565b61189e565b005b610560600480360381019061055b9190612b89565b611a16565b005b61057c60048036038101906105779190612d5c565b611a89565b6040516105899190613116565b60405180910390f35b61059a611b28565b6040516105a79190613116565b60405180910390f35b6105b8611bb6565b6040516105c5919061320f565b60405180910390f35b6105e860048036038101906105e39190612af6565b611bda565b6040516105f591906130e0565b60405180910390f35b61061860048036038101906106139190612ac9565b611c6e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106bb906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546106e7906134f5565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b600061074982611d66565b61077f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c582610f82565b90508073ffffffffffffffffffffffffffffffffffffffff166107e6611dc5565b73ffffffffffffffffffffffffffffffffffffffff1614610849576108128161080d611dc5565b611bda565b610848576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610905611dcd565b6001546000540303905090565b600061091d82611dd2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610984576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061099084611ea0565b915091506109a681876109a1611dc5565b611ec2565b6109f2576109bb866109b6611dc5565b611bda565b6109f1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610a59576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a668686866001611f06565b8015610a7157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b3f85610b1b888887611f0c565b7c020000000000000000000000000000000000000000000000000000000017611f34565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610bc7576000600185019050600060046000838152602001908152602001600020541415610bc5576000548114610bc4578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c2f8686866001611f5f565b505050505050565b600a5481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f484610c7691906133af565b610c80919061337e565b90509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cb5611f65565b73ffffffffffffffffffffffffffffffffffffffff16610cd36112f3565b73ffffffffffffffffffffffffffffffffffffffff1614610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d20906131af565b60405180910390fd5b600081511415610d65576040517fd64becfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054610d74906134f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da0906134f5565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050905081600d9080519060200190610e0a9291906128b3565b507f7d8ebb5abe647a67ba3a2649e11557ae5aa256cf3449245e0c840c98132e5a378183604051610e3c929190613138565b60405180910390a15050565b610e6383838360405180602001604052806000815250611a16565b505050565b610e70611f65565b73ffffffffffffffffffffffffffffffffffffffff16610e8e6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb906131af565b60405180910390fd5b6000811415610f1f576040517f3c43693400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b54905081600b819055507fc37cc9c3c37fdcacbe05156c2f68f96e3d3ecec5a381a8929651bf7a317f0d1c8183604051610f5e92919061322a565b60405180910390a15050565b600e6020528060005260406000206000915090505481565b6000610f8d82611dd2565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611055611f65565b73ffffffffffffffffffffffffffffffffffffffff166110736112f3565b73ffffffffffffffffffffffffffffffffffffffff16146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906131af565b60405180910390fd5b6110d36000611f6d565b565b600b5481565b6110e3611f65565b73ffffffffffffffffffffffffffffffffffffffff166111016112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112199190612ff0565b60206040518083038186803b15801561123157600080fd5b505afa158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190612d89565b90506112b682827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166120339092919063ffffffff16565b7fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f182826040516112e79291906130b7565b60405180910390a15050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611325611f65565b73ffffffffffffffffffffffffffffffffffffffff166113436112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611390906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611400576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f67b490a6eb879b67b91826b576ca0a1ba79f82484d43c4e330e3948dac8182d7818360405161149992919061300b565b60405180910390a15050565b6114ad611f65565b73ffffffffffffffffffffffffffffffffffffffff166114cb6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611518906131af565b60405180910390fd5b600081141561155c576040517f4dfba02300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006009549050816009819055507f945c1c4e99aa89f648fbfe3df471b916f719e16d960fcec0737d4d56bd696838818360405161159b92919061322a565b60405180910390a15050565b6060600380546115b6906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546115e2906134f5565b801561162f5780601f106116045761010080835404028352916020019161162f565b820191906000526020600020905b81548152906001019060200180831161161257829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b42600a5411156116a1576040517f2d0a346e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ef9190613328565b1115611727576040517fa16631ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816117516108fb565b61175b9190613328565b1115611793576040517f1e186f7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190613328565b925050819055506118433330836009546117fc91906133af565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166120b9909392919063ffffffff16565b61184d3382612142565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051611893919061320f565b60405180910390a250565b6118a6611dc5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611918611dc5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c5611dc5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a0a91906130e0565b60405180910390a35050565b611a21848484610912565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a8357611a4c84848484612160565b611a82576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a9482611d66565b611aca576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ad46122c0565b9050600081511415611af55760405180602001604052806000815250611b20565b80611aff84612352565b604051602001611b10929190612fcc565b6040516020818303038152906040525b915050919050565b600d8054611b35906134f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b61906134f5565b8015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c76611f65565b73ffffffffffffffffffffffffffffffffffffffff16611c946112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce1906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d519061316f565b60405180910390fd5b611d6381611f6d565b50565b600081611d71611dcd565b11158015611d80575060005482105b8015611dbe575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611de1611dcd565b11611e6957600054811015611e685760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e66575b6000811415611e5c576004600083600190039350838152602001908152602001600020549050611e31565b8092505050611e9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f238686846123ac565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120b48363a9059cbb60e01b84846040516024016120529291906130b7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123b5565b505050565b61213c846323b872dd60e01b8585856040516024016120da93929190613034565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123b5565b50505050565b61215c82826040518060200160405280600081525061247c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612186611dc5565b8786866040518563ffffffff1660e01b81526004016121a8949392919061306b565b602060405180830381600087803b1580156121c257600080fd5b505af19250505080156121f357506040513d601f19601f820116820180604052508101906121f09190612ce6565b60015b61226d573d8060008114612223576040519150601f19603f3d011682016040523d82523d6000602084013e612228565b606091505b50600081511415612265576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546122cf906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546122fb906134f5565b80156123485780601f1061231d57610100808354040283529160200191612348565b820191906000526020600020905b81548152906001019060200180831161232b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561239857600183039250600a81066030018353600a81049050612378565b508181036020830392508083525050919050565b60009392505050565b6000612417826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125199092919063ffffffff16565b905060008151111561247757808060200190518101906124379190612c8c565b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d906131ef565b60405180910390fd5b5b505050565b6124868383612531565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461251457600080549050600083820390505b6124c66000868380600101945086612160565b6124fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124b357816000541461251157600080fd5b50505b505050565b60606125288484600085612705565b90509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561259e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125d9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e66000848385611f06565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061265d8361264e6000866000611f0c565b61265785612819565b17611f34565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612681578060008190555050506127006000848385611f5f565b505050565b60608247101561274a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127419061318f565b60405180910390fd5b61275385612829565b612792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612789906131cf565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127bb9190612fb5565b60006040518083038185875af1925050503d80600081146127f8576040519150601f19603f3d011682016040523d82523d6000602084013e6127fd565b606091505b509150915061280d82828661284c565b92505050949350505050565b60006001821460e11b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561285c578290506128ac565b60008351111561286f5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a39190613116565b60405180910390fd5b9392505050565b8280546128bf906134f5565b90600052602060002090601f0160209004810192826128e15760008555612928565b82601f106128fa57805160ff1916838001178555612928565b82800160010185558215612928579182015b8281111561292757825182559160200191906001019061290c565b5b5090506129359190612939565b5090565b5b8082111561295257600081600090555060010161293a565b5090565b600061296961296484613278565b613253565b90508281526020810184848401111561298557612984613619565b5b6129908482856134b3565b509392505050565b60006129ab6129a6846132a9565b613253565b9050828152602081018484840111156129c7576129c6613619565b5b6129d28482856134b3565b509392505050565b6000813590506129e981613778565b92915050565b6000813590506129fe8161378f565b92915050565b600081519050612a138161378f565b92915050565b600081359050612a28816137a6565b92915050565b600081519050612a3d816137a6565b92915050565b600082601f830112612a5857612a57613614565b5b8135612a68848260208601612956565b91505092915050565b600082601f830112612a8657612a85613614565b5b8135612a96848260208601612998565b91505092915050565b600081359050612aae816137bd565b92915050565b600081519050612ac3816137bd565b92915050565b600060208284031215612adf57612ade613623565b5b6000612aed848285016129da565b91505092915050565b60008060408385031215612b0d57612b0c613623565b5b6000612b1b858286016129da565b9250506020612b2c858286016129da565b9150509250929050565b600080600060608486031215612b4f57612b4e613623565b5b6000612b5d868287016129da565b9350506020612b6e868287016129da565b9250506040612b7f86828701612a9f565b9150509250925092565b60008060008060808587031215612ba357612ba2613623565b5b6000612bb1878288016129da565b9450506020612bc2878288016129da565b9350506040612bd387828801612a9f565b925050606085013567ffffffffffffffff811115612bf457612bf361361e565b5b612c0087828801612a43565b91505092959194509250565b60008060408385031215612c2357612c22613623565b5b6000612c31858286016129da565b9250506020612c42858286016129ef565b9150509250929050565b60008060408385031215612c6357612c62613623565b5b6000612c71858286016129da565b9250506020612c8285828601612a9f565b9150509250929050565b600060208284031215612ca257612ca1613623565b5b6000612cb084828501612a04565b91505092915050565b600060208284031215612ccf57612cce613623565b5b6000612cdd84828501612a19565b91505092915050565b600060208284031215612cfc57612cfb613623565b5b6000612d0a84828501612a2e565b91505092915050565b600060208284031215612d2957612d28613623565b5b600082013567ffffffffffffffff811115612d4757612d4661361e565b5b612d5384828501612a71565b91505092915050565b600060208284031215612d7257612d71613623565b5b6000612d8084828501612a9f565b91505092915050565b600060208284031215612d9f57612d9e613623565b5b6000612dad84828501612ab4565b91505092915050565b60008060408385031215612dcd57612dcc613623565b5b6000612ddb85828601612a9f565b9250506020612dec85828601612a9f565b9150509250929050565b612dff81613409565b82525050565b612e0e8161341b565b82525050565b6000612e1f826132da565b612e2981856132f0565b9350612e398185602086016134c2565b612e4281613628565b840191505092915050565b6000612e58826132da565b612e628185613301565b9350612e728185602086016134c2565b80840191505092915050565b612e878161347d565b82525050565b6000612e98826132e5565b612ea2818561330c565b9350612eb28185602086016134c2565b612ebb81613628565b840191505092915050565b6000612ed1826132e5565b612edb818561331d565b9350612eeb8185602086016134c2565b80840191505092915050565b6000612f0460268361330c565b9150612f0f82613639565b604082019050919050565b6000612f2760268361330c565b9150612f3282613688565b604082019050919050565b6000612f4a60208361330c565b9150612f55826136d7565b602082019050919050565b6000612f6d601d8361330c565b9150612f7882613700565b602082019050919050565b6000612f90602a8361330c565b9150612f9b82613729565b604082019050919050565b612faf81613473565b82525050565b6000612fc18284612e4d565b915081905092915050565b6000612fd88285612ec6565b9150612fe48284612ec6565b91508190509392505050565b60006020820190506130056000830184612df6565b92915050565b60006040820190506130206000830185612df6565b61302d6020830184612df6565b9392505050565b60006060820190506130496000830186612df6565b6130566020830185612df6565b6130636040830184612fa6565b949350505050565b60006080820190506130806000830187612df6565b61308d6020830186612df6565b61309a6040830185612fa6565b81810360608301526130ac8184612e14565b905095945050505050565b60006040820190506130cc6000830185612df6565b6130d96020830184612fa6565b9392505050565b60006020820190506130f56000830184612e05565b92915050565b60006020820190506131106000830184612e7e565b92915050565b600060208201905081810360008301526131308184612e8d565b905092915050565b600060408201905081810360008301526131528185612e8d565b905081810360208301526131668184612e8d565b90509392505050565b6000602082019050818103600083015261318881612ef7565b9050919050565b600060208201905081810360008301526131a881612f1a565b9050919050565b600060208201905081810360008301526131c881612f3d565b9050919050565b600060208201905081810360008301526131e881612f60565b9050919050565b6000602082019050818103600083015261320881612f83565b9050919050565b60006020820190506132246000830184612fa6565b92915050565b600060408201905061323f6000830185612fa6565b61324c6020830184612fa6565b9392505050565b600061325d61326e565b90506132698282613527565b919050565b6000604051905090565b600067ffffffffffffffff821115613293576132926135e5565b5b61329c82613628565b9050602081019050919050565b600067ffffffffffffffff8211156132c4576132c36135e5565b5b6132cd82613628565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061333382613473565b915061333e83613473565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561337357613372613558565b5b828201905092915050565b600061338982613473565b915061339483613473565b9250826133a4576133a3613587565b5b828204905092915050565b60006133ba82613473565b91506133c583613473565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133fe576133fd613558565b5b828202905092915050565b600061341482613453565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006134888261348f565b9050919050565b600061349a826134a1565b9050919050565b60006134ac82613453565b9050919050565b82818337600083830152505050565b60005b838110156134e05780820151818401526020810190506134c5565b838111156134ef576000848401525b50505050565b6000600282049050600182168061350d57607f821691505b60208210811415613521576135206135b6565b5b50919050565b61353082613628565b810181811067ffffffffffffffff8211171561354f5761354e6135e5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b61378181613409565b811461378c57600080fd5b50565b6137988161341b565b81146137a357600080fd5b50565b6137af81613427565b81146137ba57600080fd5b50565b6137c681613473565b81146137d157600080fd5b5056fea26469706673582212205902b3dd6f0d156d067a4838bfa89f6ddd8c7187061fdbf3b30c40b9dd4f0edb64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000002710000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000ee6b28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000d3649ed5226b275e1c36f38326d4be0e0a32bf3c0000000000000000000000000000000000000000000000000000000000000013536563726574536e61636b53616e64776963680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035353530000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637501f7411161010f578063a0712d68116100a2578063d547cfb711610071578063d547cfb714610592578063d5abeb01146105b0578063e985e9c5146105ce578063f2fde38b146105fe576101f0565b8063a0712d681461050e578063a22cb4651461052a578063b88d4fde14610546578063c87b56dd14610562576101f0565b806391b7f5ed116100de57806391b7f5ed1461049857806395d89b41146104b45780639fbc8713146104d2578063a035b1fe146104f0576101f0565b80637501f74114610424578063756af45f146104425780638da5cb5b1461045e5780638dc251e31461047c576101f0565b80633013ce29116101875780635660f851116101565780635660f8511461038a5780636352211e146103ba57806370a08231146103ea578063715018a61461041a576101f0565b80633013ce291461031857806330176e131461033657806342842e0e14610352578063547520fe1461036e576101f0565b806318160ddd116101c357806318160ddd1461028f57806323b872dd146102ad578063255e4685146102c95780632a55205a146102e7576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612cb9565b61061a565b60405161021c91906130e0565b60405180910390f35b61022d6106ac565b60405161023a9190613116565b60405180910390f35b61025d60048036038101906102589190612d5c565b61073e565b60405161026a9190612ff0565b60405180910390f35b61028d60048036038101906102889190612c4c565b6107ba565b005b6102976108fb565b6040516102a4919061320f565b60405180910390f35b6102c760048036038101906102c29190612b36565b610912565b005b6102d1610c37565b6040516102de919061320f565b60405180910390f35b61030160048036038101906102fc9190612db6565b610c3d565b60405161030f9291906130b7565b60405180910390f35b610320610c89565b60405161032d91906130fb565b60405180910390f35b610350600480360381019061034b9190612d13565b610cad565b005b61036c60048036038101906103679190612b36565b610e48565b005b61038860048036038101906103839190612d5c565b610e68565b005b6103a4600480360381019061039f9190612ac9565b610f6a565b6040516103b1919061320f565b60405180910390f35b6103d460048036038101906103cf9190612d5c565b610f82565b6040516103e19190612ff0565b60405180910390f35b61040460048036038101906103ff9190612ac9565b610f94565b604051610411919061320f565b60405180910390f35b61042261104d565b005b61042c6110d5565b604051610439919061320f565b60405180910390f35b61045c60048036038101906104579190612ac9565b6110db565b005b6104666112f3565b6040516104739190612ff0565b60405180910390f35b61049660048036038101906104919190612ac9565b61131d565b005b6104b260048036038101906104ad9190612d5c565b6114a5565b005b6104bc6115a7565b6040516104c99190613116565b60405180910390f35b6104da611639565b6040516104e79190612ff0565b60405180910390f35b6104f861165f565b604051610505919061320f565b60405180910390f35b61052860048036038101906105239190612d5c565b611665565b005b610544600480360381019061053f9190612c0c565b61189e565b005b610560600480360381019061055b9190612b89565b611a16565b005b61057c60048036038101906105779190612d5c565b611a89565b6040516105899190613116565b60405180910390f35b61059a611b28565b6040516105a79190613116565b60405180910390f35b6105b8611bb6565b6040516105c5919061320f565b60405180910390f35b6105e860048036038101906105e39190612af6565b611bda565b6040516105f591906130e0565b60405180910390f35b61061860048036038101906106139190612ac9565b611c6e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106bb906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546106e7906134f5565b80156107345780601f1061070957610100808354040283529160200191610734565b820191906000526020600020905b81548152906001019060200180831161071757829003601f168201915b5050505050905090565b600061074982611d66565b61077f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c582610f82565b90508073ffffffffffffffffffffffffffffffffffffffff166107e6611dc5565b73ffffffffffffffffffffffffffffffffffffffff1614610849576108128161080d611dc5565b611bda565b610848576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610905611dcd565b6001546000540303905090565b600061091d82611dd2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610984576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061099084611ea0565b915091506109a681876109a1611dc5565b611ec2565b6109f2576109bb866109b6611dc5565b611bda565b6109f1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610a59576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a668686866001611f06565b8015610a7157600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610b3f85610b1b888887611f0c565b7c020000000000000000000000000000000000000000000000000000000017611f34565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610bc7576000600185019050600060046000838152602001908152602001600020541415610bc5576000548114610bc4578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610c2f8686866001611f5f565b505050505050565b600a5481565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506127106101f484610c7691906133af565b610c80919061337e565b90509250929050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b610cb5611f65565b73ffffffffffffffffffffffffffffffffffffffff16610cd36112f3565b73ffffffffffffffffffffffffffffffffffffffff1614610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d20906131af565b60405180910390fd5b600081511415610d65576040517fd64becfd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054610d74906134f5565b80601f0160208091040260200160405190810160405280929190818152602001828054610da0906134f5565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050905081600d9080519060200190610e0a9291906128b3565b507f7d8ebb5abe647a67ba3a2649e11557ae5aa256cf3449245e0c840c98132e5a378183604051610e3c929190613138565b60405180910390a15050565b610e6383838360405180602001604052806000815250611a16565b505050565b610e70611f65565b73ffffffffffffffffffffffffffffffffffffffff16610e8e6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614610ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edb906131af565b60405180910390fd5b6000811415610f1f576040517f3c43693400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b54905081600b819055507fc37cc9c3c37fdcacbe05156c2f68f96e3d3ecec5a381a8929651bf7a317f0d1c8183604051610f5e92919061322a565b60405180910390a15050565b600e6020528060005260406000206000915090505481565b6000610f8d82611dd2565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ffc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611055611f65565b73ffffffffffffffffffffffffffffffffffffffff166110736112f3565b73ffffffffffffffffffffffffffffffffffffffff16146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c0906131af565b60405180910390fd5b6110d36000611f6d565b565b600b5481565b6110e3611f65565b73ffffffffffffffffffffffffffffffffffffffff166111016112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111be576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112199190612ff0565b60206040518083038186803b15801561123157600080fd5b505afa158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190612d89565b90506112b682827f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166120339092919063ffffffff16565b7fddc398b321237a8d40ac914388309c2f52a08c134e4dc4ce61e32f57cb7d80f182826040516112e79291906130b7565b60405180910390a15050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611325611f65565b73ffffffffffffffffffffffffffffffffffffffff166113436112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611399576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611390906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611400576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f67b490a6eb879b67b91826b576ca0a1ba79f82484d43c4e330e3948dac8182d7818360405161149992919061300b565b60405180910390a15050565b6114ad611f65565b73ffffffffffffffffffffffffffffffffffffffff166114cb6112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611521576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611518906131af565b60405180910390fd5b600081141561155c576040517f4dfba02300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006009549050816009819055507f945c1c4e99aa89f648fbfe3df471b916f719e16d960fcec0737d4d56bd696838818360405161159b92919061322a565b60405180910390a15050565b6060600380546115b6906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546115e2906134f5565b801561162f5780601f106116045761010080835404028352916020019161162f565b820191906000526020600020905b81548152906001019060200180831161161257829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b42600a5411156116a1576040517f2d0a346e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116ef9190613328565b1115611727576040517fa16631ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000002710816117516108fb565b61175b9190613328565b1115611793576040517f1e186f7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117e29190613328565b925050819055506118433330836009546117fc91906133af565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166120b9909392919063ffffffff16565b61184d3382612142565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051611893919061320f565b60405180910390a250565b6118a6611dc5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561190b576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611918611dc5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119c5611dc5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a0a91906130e0565b60405180910390a35050565b611a21848484610912565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a8357611a4c84848484612160565b611a82576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611a9482611d66565b611aca576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611ad46122c0565b9050600081511415611af55760405180602001604052806000815250611b20565b80611aff84612352565b604051602001611b10929190612fcc565b6040516020818303038152906040525b915050919050565b600d8054611b35906134f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b61906134f5565b8015611bae5780601f10611b8357610100808354040283529160200191611bae565b820191906000526020600020905b815481529060010190602001808311611b9157829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000271081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c76611f65565b73ffffffffffffffffffffffffffffffffffffffff16611c946112f3565b73ffffffffffffffffffffffffffffffffffffffff1614611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce1906131af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d519061316f565b60405180910390fd5b611d6381611f6d565b50565b600081611d71611dcd565b11158015611d80575060005482105b8015611dbe575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611de1611dcd565b11611e6957600054811015611e685760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e66575b6000811415611e5c576004600083600190039350838152602001908152602001600020549050611e31565b8092505050611e9b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611f238686846123ac565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120b48363a9059cbb60e01b84846040516024016120529291906130b7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123b5565b505050565b61213c846323b872dd60e01b8585856040516024016120da93929190613034565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123b5565b50505050565b61215c82826040518060200160405280600081525061247c565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612186611dc5565b8786866040518563ffffffff1660e01b81526004016121a8949392919061306b565b602060405180830381600087803b1580156121c257600080fd5b505af19250505080156121f357506040513d601f19601f820116820180604052508101906121f09190612ce6565b60015b61226d573d8060008114612223576040519150601f19603f3d011682016040523d82523d6000602084013e612228565b606091505b50600081511415612265576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546122cf906134f5565b80601f01602080910402602001604051908101604052809291908181526020018280546122fb906134f5565b80156123485780601f1061231d57610100808354040283529160200191612348565b820191906000526020600020905b81548152906001019060200180831161232b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561239857600183039250600a81066030018353600a81049050612378565b508181036020830392508083525050919050565b60009392505050565b6000612417826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166125199092919063ffffffff16565b905060008151111561247757808060200190518101906124379190612c8c565b612476576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246d906131ef565b60405180910390fd5b5b505050565b6124868383612531565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461251457600080549050600083820390505b6124c66000868380600101945086612160565b6124fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124b357816000541461251157600080fd5b50505b505050565b60606125288484600085612705565b90509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561259e576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156125d9576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125e66000848385611f06565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061265d8361264e6000866000611f0c565b61265785612819565b17611f34565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612681578060008190555050506127006000848385611f5f565b505050565b60608247101561274a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127419061318f565b60405180910390fd5b61275385612829565b612792576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612789906131cf565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127bb9190612fb5565b60006040518083038185875af1925050503d80600081146127f8576040519150601f19603f3d011682016040523d82523d6000602084013e6127fd565b606091505b509150915061280d82828661284c565b92505050949350505050565b60006001821460e11b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060831561285c578290506128ac565b60008351111561286f5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a39190613116565b60405180910390fd5b9392505050565b8280546128bf906134f5565b90600052602060002090601f0160209004810192826128e15760008555612928565b82601f106128fa57805160ff1916838001178555612928565b82800160010185558215612928579182015b8281111561292757825182559160200191906001019061290c565b5b5090506129359190612939565b5090565b5b8082111561295257600081600090555060010161293a565b5090565b600061296961296484613278565b613253565b90508281526020810184848401111561298557612984613619565b5b6129908482856134b3565b509392505050565b60006129ab6129a6846132a9565b613253565b9050828152602081018484840111156129c7576129c6613619565b5b6129d28482856134b3565b509392505050565b6000813590506129e981613778565b92915050565b6000813590506129fe8161378f565b92915050565b600081519050612a138161378f565b92915050565b600081359050612a28816137a6565b92915050565b600081519050612a3d816137a6565b92915050565b600082601f830112612a5857612a57613614565b5b8135612a68848260208601612956565b91505092915050565b600082601f830112612a8657612a85613614565b5b8135612a96848260208601612998565b91505092915050565b600081359050612aae816137bd565b92915050565b600081519050612ac3816137bd565b92915050565b600060208284031215612adf57612ade613623565b5b6000612aed848285016129da565b91505092915050565b60008060408385031215612b0d57612b0c613623565b5b6000612b1b858286016129da565b9250506020612b2c858286016129da565b9150509250929050565b600080600060608486031215612b4f57612b4e613623565b5b6000612b5d868287016129da565b9350506020612b6e868287016129da565b9250506040612b7f86828701612a9f565b9150509250925092565b60008060008060808587031215612ba357612ba2613623565b5b6000612bb1878288016129da565b9450506020612bc2878288016129da565b9350506040612bd387828801612a9f565b925050606085013567ffffffffffffffff811115612bf457612bf361361e565b5b612c0087828801612a43565b91505092959194509250565b60008060408385031215612c2357612c22613623565b5b6000612c31858286016129da565b9250506020612c42858286016129ef565b9150509250929050565b60008060408385031215612c6357612c62613623565b5b6000612c71858286016129da565b9250506020612c8285828601612a9f565b9150509250929050565b600060208284031215612ca257612ca1613623565b5b6000612cb084828501612a04565b91505092915050565b600060208284031215612ccf57612cce613623565b5b6000612cdd84828501612a19565b91505092915050565b600060208284031215612cfc57612cfb613623565b5b6000612d0a84828501612a2e565b91505092915050565b600060208284031215612d2957612d28613623565b5b600082013567ffffffffffffffff811115612d4757612d4661361e565b5b612d5384828501612a71565b91505092915050565b600060208284031215612d7257612d71613623565b5b6000612d8084828501612a9f565b91505092915050565b600060208284031215612d9f57612d9e613623565b5b6000612dad84828501612ab4565b91505092915050565b60008060408385031215612dcd57612dcc613623565b5b6000612ddb85828601612a9f565b9250506020612dec85828601612a9f565b9150509250929050565b612dff81613409565b82525050565b612e0e8161341b565b82525050565b6000612e1f826132da565b612e2981856132f0565b9350612e398185602086016134c2565b612e4281613628565b840191505092915050565b6000612e58826132da565b612e628185613301565b9350612e728185602086016134c2565b80840191505092915050565b612e878161347d565b82525050565b6000612e98826132e5565b612ea2818561330c565b9350612eb28185602086016134c2565b612ebb81613628565b840191505092915050565b6000612ed1826132e5565b612edb818561331d565b9350612eeb8185602086016134c2565b80840191505092915050565b6000612f0460268361330c565b9150612f0f82613639565b604082019050919050565b6000612f2760268361330c565b9150612f3282613688565b604082019050919050565b6000612f4a60208361330c565b9150612f55826136d7565b602082019050919050565b6000612f6d601d8361330c565b9150612f7882613700565b602082019050919050565b6000612f90602a8361330c565b9150612f9b82613729565b604082019050919050565b612faf81613473565b82525050565b6000612fc18284612e4d565b915081905092915050565b6000612fd88285612ec6565b9150612fe48284612ec6565b91508190509392505050565b60006020820190506130056000830184612df6565b92915050565b60006040820190506130206000830185612df6565b61302d6020830184612df6565b9392505050565b60006060820190506130496000830186612df6565b6130566020830185612df6565b6130636040830184612fa6565b949350505050565b60006080820190506130806000830187612df6565b61308d6020830186612df6565b61309a6040830185612fa6565b81810360608301526130ac8184612e14565b905095945050505050565b60006040820190506130cc6000830185612df6565b6130d96020830184612fa6565b9392505050565b60006020820190506130f56000830184612e05565b92915050565b60006020820190506131106000830184612e7e565b92915050565b600060208201905081810360008301526131308184612e8d565b905092915050565b600060408201905081810360008301526131528185612e8d565b905081810360208301526131668184612e8d565b90509392505050565b6000602082019050818103600083015261318881612ef7565b9050919050565b600060208201905081810360008301526131a881612f1a565b9050919050565b600060208201905081810360008301526131c881612f3d565b9050919050565b600060208201905081810360008301526131e881612f60565b9050919050565b6000602082019050818103600083015261320881612f83565b9050919050565b60006020820190506132246000830184612fa6565b92915050565b600060408201905061323f6000830185612fa6565b61324c6020830184612fa6565b9392505050565b600061325d61326e565b90506132698282613527565b919050565b6000604051905090565b600067ffffffffffffffff821115613293576132926135e5565b5b61329c82613628565b9050602081019050919050565b600067ffffffffffffffff8211156132c4576132c36135e5565b5b6132cd82613628565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061333382613473565b915061333e83613473565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561337357613372613558565b5b828201905092915050565b600061338982613473565b915061339483613473565b9250826133a4576133a3613587565b5b828204905092915050565b60006133ba82613473565b91506133c583613473565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156133fe576133fd613558565b5b828202905092915050565b600061341482613453565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006134888261348f565b9050919050565b600061349a826134a1565b9050919050565b60006134ac82613453565b9050919050565b82818337600083830152505050565b60005b838110156134e05780820151818401526020810190506134c5565b838111156134ef576000848401525b50505050565b6000600282049050600182168061350d57607f821691505b60208210811415613521576135206135b6565b5b50919050565b61353082613628565b810181811067ffffffffffffffff8211171561354f5761354e6135e5565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b61378181613409565b811461378c57600080fd5b50565b6137988161341b565b81146137a357600080fd5b50565b6137af81613427565b81146137ba57600080fd5b50565b6137c681613473565b81146137d157600080fd5b5056fea26469706673582212205902b3dd6f0d156d067a4838bfa89f6ddd8c7187061fdbf3b30c40b9dd4f0edb64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000002710000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000ee6b28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000d3649ed5226b275e1c36f38326d4be0e0a32bf3c0000000000000000000000000000000000000000000000000000000000000013536563726574536e61636b53616e64776963680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035353530000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): SecretSnackSandwich
Arg [1] : _symbol (string): SSS
Arg [2] : _maxSupply (uint256): 10000
Arg [3] : _paymentToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : _price (uint256): 250000000
Arg [5] : _mintStart (uint256): 0
Arg [6] : _maxMint (uint256): 10000
Arg [7] : _royaltyReceiver (address): 0xd3649eD5226B275E1c36F38326d4be0e0A32bf3c

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 000000000000000000000000000000000000000000000000000000000ee6b280
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [7] : 000000000000000000000000d3649ed5226b275e1c36f38326d4be0e0a32bf3c
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [9] : 536563726574536e61636b53616e647769636800000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [11] : 5353530000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

63208:5416:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26659:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32306:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34252:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33800:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25713:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43517:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63407:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68197:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;63294:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65513:299;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35142:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66523:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63543:40;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32095:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27338:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58442:103;;;:::i;:::-;;63438:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67489:279;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57791:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66131:324;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65860:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32475:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63469:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63380:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66908:523;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34528:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35398:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32650:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63508:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63337:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34907:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58700:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26659:615;26744:4;27059:10;27044:25;;:11;:25;;;;:102;;;;27136:10;27121:25;;:11;:25;;;;27044:102;:179;;;;27213:10;27198:25;;:11;:25;;;;27044:179;27024:199;;26659:615;;;:::o;32306:100::-;32360:13;32393:5;32386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32306:100;:::o;34252:204::-;34320:7;34345:16;34353:7;34345;:16::i;:::-;34340:64;;34370:34;;;;;;;;;;;;;;34340:64;34424:15;:24;34440:7;34424:24;;;;;;;;;;;;;;;;;;;;;34417:31;;34252:204;;;:::o;33800:386::-;33873:13;33889:16;33897:7;33889;:16::i;:::-;33873:32;;33945:5;33922:28;;:19;:17;:19::i;:::-;:28;;;33918:175;;33970:44;33987:5;33994:19;:17;:19::i;:::-;33970:16;:44::i;:::-;33965:128;;34042:35;;;;;;;;;;;;;;33965:128;33918:175;34132:2;34105:15;:24;34121:7;34105:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34170:7;34166:2;34150:28;;34159:5;34150:28;;;;;;;;;;;;33862:324;33800:386;;:::o;25713:315::-;25766:7;25994:15;:13;:15::i;:::-;25979:12;;25963:13;;:28;:46;25956:53;;25713:315;:::o;43517:2800::-;43651:27;43681;43700:7;43681:18;:27::i;:::-;43651:57;;43766:4;43725:45;;43741:19;43725:45;;;43721:86;;43779:28;;;;;;;;;;;;;;43721:86;43821:27;43850:23;43877:28;43897:7;43877:19;:28::i;:::-;43820:85;;;;44005:62;44024:15;44041:4;44047:19;:17;:19::i;:::-;44005:18;:62::i;:::-;44000:174;;44087:43;44104:4;44110:19;:17;:19::i;:::-;44087:16;:43::i;:::-;44082:92;;44139:35;;;;;;;;;;;;;;44082:92;44000:174;44205:1;44191:16;;:2;:16;;;44187:52;;;44216:23;;;;;;;;;;;;;;44187:52;44252:43;44274:4;44280:2;44284:7;44293:1;44252:21;:43::i;:::-;44388:15;44385:160;;;44528:1;44507:19;44500:30;44385:160;44923:18;:24;44942:4;44923:24;;;;;;;;;;;;;;;;44921:26;;;;;;;;;;;;44992:18;:22;45011:2;44992:22;;;;;;;;;;;;;;;;44990:24;;;;;;;;;;;45314:145;45351:2;45399:45;45414:4;45420:2;45424:19;45399:14;:45::i;:::-;22941:8;45372:72;45314:18;:145::i;:::-;45285:17;:26;45303:7;45285:26;;;;;;;;;;;:174;;;;45629:1;22941:8;45579:19;:46;:51;45575:626;;;45651:19;45683:1;45673:7;:11;45651:33;;45840:1;45806:17;:30;45824:11;45806:30;;;;;;;;;;;;:35;45802:384;;;45944:13;;45929:11;:28;45925:242;;46124:19;46091:17;:30;46109:11;46091:30;;;;;;;;;;;:52;;;;45925:242;45802:384;45632:569;45575:626;46248:7;46244:2;46229:27;;46238:4;46229:27;;;;;;;;;;;;46267:42;46288:4;46294:2;46298:7;46307:1;46267:20;:42::i;:::-;43640:2677;;;43517:2800;;;:::o;63407:24::-;;;;:::o;68197:244::-;68289:16;68316:21;68367:15;;;;;;;;;;;68356:26;;68428:5;68422:3;68409:10;:16;;;;:::i;:::-;:24;;;;:::i;:::-;68393:40;;68197:244;;;;;:::o;63294:36::-;;;:::o;65513:299::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65632:1:::1;65607:13;65601:27;:32;65597:55;;;65642:10;;;;;;;;;;;;;;65597:55;65663:29;65695:12;65663:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65733:13;65718:12;:28;;;;;;;;;;;;:::i;:::-;;65762:42;65773:15;65790:13;65762:42;;;;;;;:::i;:::-;;;;;;;;65586:226;65513:299:::0;:::o;35142:185::-;35280:39;35297:4;35303:2;35307:7;35280:39;;;;;;;;;;;;:16;:39::i;:::-;35142:185;;;:::o;66523:258::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66630:1:::1;66618:8;:13;66614:39;;;66640:13;;;;;;;;;;;;;;66614:39;66664:18;66685:7;;66664:28;;66713:8;66703:7;:18;;;;66737:36;66752:10;66764:8;66737:36;;;;;;;:::i;:::-;;;;;;;;66603:178;66523:258:::0;:::o;63543:40::-;;;;;;;;;;;;;;;;;:::o;32095:144::-;32159:7;32202:27;32221:7;32202:18;:27::i;:::-;32179:52;;32095:144;;;:::o;27338:224::-;27402:7;27443:1;27426:19;;:5;:19;;;27422:60;;;27454:28;;;;;;;;;;;;;;27422:60;21893:13;27500:18;:25;27519:5;27500:25;;;;;;;;;;;;;;;;:54;27493:61;;27338:224;;;:::o;58442:103::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58507:30:::1;58534:1;58507:18;:30::i;:::-;58442:103::o:0;63438:22::-;;;;:::o;67489:279::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67574:1:::1;67560:16;;:2;:16;;;67556:42;;;67585:13;;;;;;;;;;;;;;67556:42;67609:15;67627:12;:22;;;67658:4;67627:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67609:55;;67675:38;67701:2;67705:7;67675:12;:25;;;;:38;;;;;:::i;:::-;67731:29;67748:2;67752:7;67731:29;;;;;;;:::i;:::-;;;;;;;;67545:223;67489:279:::0;:::o;57791:87::-;57837:7;57864:6;;;;;;;;;;;57857:13;;57791:87;:::o;66131:324::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66247:1:::1;66219:30;;:16;:30;;;66215:56;;;66258:13;;;;;;;;;;;;;;66215:56;66282:26;66311:15;;;;;;;;;;;66282:44;;66355:16;66337:15;;:34;;;;;;;;;;;;;;;;;;66387:60;66410:18;66430:16;66387:60;;;;;;;:::i;:::-;;;;;;;;66204:251;66131:324:::0;:::o;65860:213::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65938:1:::1;65928:6;:11;65924:35;;;65948:11;;;;;;;;;;;;;;65924:35;65970:16;65989:5;;65970:24;;66013:6;66005:5;:14;;;;66035:30;66048:8;66058:6;66035:30;;;;;;;:::i;:::-;;;;;;;;65913:160;65860:213:::0;:::o;32475:104::-;32531:13;32564:7;32557:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32475:104;:::o;63469:30::-;;;;;;;;;;;;;:::o;63380:20::-;;;;:::o;66908:523::-;66974:15;66962:9;;:27;66958:56;;;66998:16;;;;;;;;;;;;;;66958:56;67058:7;;67049:6;67029:5;:17;67035:10;67029:17;;;;;;;;;;;;;;;;:26;;;;:::i;:::-;:36;67025:64;;;67074:15;;;;;;;;;;;;;;67025:64;67129:9;67120:6;67104:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;67100:64;;;67147:17;;;;;;;;;;;;;;67100:64;67198:6;67177:5;:17;67183:10;67177:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;67217:122;67261:10;67294:4;67322:6;67314:5;;:14;;;;:::i;:::-;67217:12;:29;;;;:122;;;;;;:::i;:::-;67352:29;67362:10;67374:6;67352:9;:29::i;:::-;67404:10;67399:24;;;67416:6;67399:24;;;;;;:::i;:::-;;;;;;;;66908:523;:::o;34528:308::-;34639:19;:17;:19::i;:::-;34627:31;;:8;:31;;;34623:61;;;34667:17;;;;;;;;;;;;;;34623:61;34749:8;34697:18;:39;34716:19;:17;:19::i;:::-;34697:39;;;;;;;;;;;;;;;:49;34737:8;34697:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34809:8;34773:55;;34788:19;:17;:19::i;:::-;34773:55;;;34819:8;34773:55;;;;;;:::i;:::-;;;;;;;;34528:308;;:::o;35398:399::-;35565:31;35578:4;35584:2;35588:7;35565:12;:31::i;:::-;35629:1;35611:2;:14;;;:19;35607:183;;35650:56;35681:4;35687:2;35691:7;35700:5;35650:30;:56::i;:::-;35645:145;;35734:40;;;;;;;;;;;;;;35645:145;35607:183;35398:399;;;;:::o;32650:318::-;32723:13;32754:16;32762:7;32754;:16::i;:::-;32749:59;;32779:29;;;;;;;;;;;;;;32749:59;32821:21;32845:10;:8;:10::i;:::-;32821:34;;32898:1;32879:7;32873:21;:26;;:87;;;;;;;;;;;;;;;;;32926:7;32935:18;32945:7;32935:9;:18::i;:::-;32909:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32873:87;32866:94;;;32650:318;;;:::o;63508:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63337:34::-;;;:::o;34907:164::-;35004:4;35028:18;:25;35047:5;35028:25;;;;;;;;;;;;;;;:35;35054:8;35028:35;;;;;;;;;;;;;;;;;;;;;;;;;35021:42;;34907:164;;;;:::o;58700:201::-;58022:12;:10;:12::i;:::-;58011:23;;:7;:5;:7::i;:::-;:23;;;58003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58809:1:::1;58789:22;;:8;:22;;;;58781:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58865:28;58884:8;58865:18;:28::i;:::-;58700:201:::0;:::o;36052:273::-;36109:4;36165:7;36146:15;:13;:15::i;:::-;:26;;:66;;;;;36199:13;;36189:7;:23;36146:66;:152;;;;;36297:1;22663:8;36250:17;:26;36268:7;36250:26;;;;;;;;;;;;:43;:48;36146:152;36126:172;;36052:273;;;:::o;54613:105::-;54673:7;54700:10;54693:17;;54613:105;:::o;25237:92::-;25293:7;25237:92;:::o;29012:1129::-;29079:7;29099:12;29114:7;29099:22;;29182:4;29163:15;:13;:15::i;:::-;:23;29159:915;;29216:13;;29209:4;:20;29205:869;;;29254:14;29271:17;:23;29289:4;29271:23;;;;;;;;;;;;29254:40;;29387:1;22663:8;29360:6;:23;:28;29356:699;;;29879:113;29896:1;29886:6;:11;29879:113;;;29939:17;:25;29957:6;;;;;;;29939:25;;;;;;;;;;;;29930:34;;29879:113;;;30025:6;30018:13;;;;;;29356:699;29231:843;29205:869;29159:915;30102:31;;;;;;;;;;;;;;29012:1129;;;;:::o;41853:652::-;41948:27;41977:23;42018:53;42074:15;42018:71;;42260:7;42254:4;42247:21;42295:22;42289:4;42282:36;42371:4;42365;42355:21;42332:44;;42467:19;42461:26;42442:45;;42198:300;41853:652;;;:::o;42618:645::-;42760:11;42922:15;42916:4;42912:26;42904:34;;43081:15;43070:9;43066:31;43053:44;;43228:15;43217:9;43214:30;43207:4;43196:9;43193:19;43190:55;43180:65;;42618:645;;;;;:::o;53446:159::-;;;;;:::o;51758:309::-;51893:7;51913:16;23064:3;51939:19;:40;;51913:67;;23064:3;52006:31;52017:4;52023:2;52027:9;52006:10;:31::i;:::-;51998:40;;:61;;51991:68;;;51758:309;;;;;:::o;31586:447::-;31666:14;31834:15;31827:5;31823:27;31814:36;;32008:5;31994:11;31970:22;31966:40;31963:51;31956:5;31953:62;31943:72;;31586:447;;;;:::o;54264:158::-;;;;;:::o;9135:98::-;9188:7;9215:10;9208:17;;9135:98;:::o;59061:191::-;59135:16;59154:6;;;;;;;;;;;59135:25;;59180:8;59171:6;;:17;;;;;;;;;;;;;;;;;;59235:8;59204:40;;59225:8;59204:40;;;;;;;;;;;;59124:128;59061:191;:::o;59881:211::-;59998:86;60018:5;60048:23;;;60073:2;60077:5;60025:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59998:19;:86::i;:::-;59881:211;;;:::o;60100:248::-;60244:96;60264:5;60294:27;;;60323:4;60329:2;60333:5;60271:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60244:19;:96::i;:::-;60100:248;;;;:::o;36409:104::-;36478:27;36488:2;36492:8;36478:27;;;;;;;;;;;;:9;:27::i;:::-;36409:104;;:::o;50268:716::-;50431:4;50477:2;50452:45;;;50498:19;:17;:19::i;:::-;50519:4;50525:7;50534:5;50452:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50448:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50752:1;50735:6;:13;:18;50731:235;;;50781:40;;;;;;;;;;;;;;50731:235;50924:6;50918:13;50909:6;50905:2;50901:15;50894:38;50448:529;50621:54;;;50611:64;;;:6;:64;;;;50604:71;;;50268:716;;;;;;:::o;68449:172::-;68563:13;68601:12;68594:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68449:172;:::o;54824:1960::-;54881:17;55300:3;55293:4;55287:11;55283:21;55276:28;;55391:3;55385:4;55378:17;55497:3;55953:5;56083:1;56078:3;56074:11;56067:18;;56220:2;56214:4;56210:13;56206:2;56202:22;56197:3;56189:36;56261:2;56255:4;56251:13;56243:21;;55845:697;56280:4;55845:697;;;56471:1;56466:3;56462:11;56455:18;;56522:2;56516:4;56512:13;56508:2;56504:22;56499:3;56491:36;56375:2;56369:4;56365:13;56357:21;;55845:697;;;55849:430;56581:3;56576;56572:13;56696:2;56691:3;56687:12;56680:19;;56759:6;56754:3;56747:19;54920:1857;;54824:1960;;;:::o;52643:147::-;52780:6;52643:147;;;;;:::o;62454:716::-;62878:23;62904:69;62932:4;62904:69;;;;;;;;;;;;;;;;;62912:5;62904:27;;;;:69;;;;;:::i;:::-;62878:95;;63008:1;62988:10;:17;:21;62984:179;;;63085:10;63074:30;;;;;;;;;;;;:::i;:::-;63066:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;62984:179;62524:646;62454:716;;:::o;36929:681::-;37052:19;37058:2;37062:8;37052:5;:19::i;:::-;37131:1;37113:2;:14;;;:19;37109:483;;37153:11;37167:13;;37153:27;;37199:13;37221:8;37215:3;:14;37199:30;;37248:233;37279:62;37318:1;37322:2;37326:7;;;;;;37335:5;37279:30;:62::i;:::-;37274:167;;37377:40;;;;;;;;;;;;;;37274:167;37476:3;37468:5;:11;37248:233;;37563:3;37546:13;;:20;37542:34;;37568:8;;;37542:34;37134:458;;37109:483;36929:681;;;:::o;3990:229::-;4127:12;4159:52;4181:6;4189:4;4195:1;4198:12;4159:21;:52::i;:::-;4152:59;;3990:229;;;;;:::o;37883:1529::-;37948:20;37971:13;;37948:36;;38013:1;37999:16;;:2;:16;;;37995:48;;;38024:19;;;;;;;;;;;;;;37995:48;38070:1;38058:8;:13;38054:44;;;38080:18;;;;;;;;;;;;;;38054:44;38111:61;38141:1;38145:2;38149:12;38163:8;38111:21;:61::i;:::-;38654:1;22030:2;38625:1;:25;;38624:31;38612:8;:44;38586:18;:22;38605:2;38586:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;38933:139;38970:2;39024:33;39047:1;39051:2;39055:1;39024:14;:33::i;:::-;38991:30;39012:8;38991:20;:30::i;:::-;:66;38933:18;:139::i;:::-;38899:17;:31;38917:12;38899:31;;;;;;;;;;;:173;;;;39089:15;39107:12;39089:30;;39134:11;39163:8;39148:12;:23;39134:37;;39186:101;39238:9;;;;;;39234:2;39213:35;;39230:1;39213:35;;;;;;;;;;;;39282:3;39272:7;:13;39186:101;;39319:3;39303:13;:19;;;;38360:974;;39344:60;39373:1;39377:2;39381:12;39395:8;39344:20;:60::i;:::-;37937:1475;37883:1529;;:::o;5110:510::-;5280:12;5338:5;5313:21;:30;;5305:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5405:18;5416:6;5405:10;:18::i;:::-;5397:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5471:12;5485:23;5512:6;:11;;5531:5;5538:4;5512:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5470:73;;;;5561:51;5578:7;5587:10;5599:12;5561:16;:51::i;:::-;5554:58;;;;5110:510;;;;;;:::o;33416:322::-;33486:14;33717:1;33707:8;33704:15;33679:23;33675:45;33665:55;;33416:322;;;:::o;1245:326::-;1305:4;1562:1;1540:7;:19;;;:23;1533:30;;1245:326;;;:::o;7796:712::-;7946:12;7975:7;7971:530;;;8006:10;7999:17;;;;7971:530;8140:1;8120:10;:17;:21;8116:374;;;8318:10;8312:17;8379:15;8366:10;8362:2;8358:19;8351:44;8116:374;8461:12;8454:20;;;;;;;;;;;:::i;:::-;;;;;;;;7796:712;;;;;;:::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::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:619::-;3461:6;3469;3477;3526:2;3514:9;3505:7;3501:23;3497:32;3494:119;;;3532:79;;:::i;:::-;3494:119;3652:1;3677:53;3722:7;3713:6;3702:9;3698:22;3677:53;:::i;:::-;3667:63;;3623:117;3779:2;3805:53;3850:7;3841:6;3830:9;3826:22;3805:53;:::i;:::-;3795:63;;3750:118;3907:2;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3878:118;3384:619;;;;;:::o;4009:943::-;4104:6;4112;4120;4128;4177:3;4165:9;4156:7;4152:23;4148:33;4145:120;;;4184:79;;:::i;:::-;4145:120;4304:1;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4275:117;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4559:2;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4530:118;4715:2;4704:9;4700:18;4687:32;4746:18;4738:6;4735:30;4732:117;;;4768:79;;:::i;:::-;4732:117;4873:62;4927:7;4918:6;4907:9;4903:22;4873:62;:::i;:::-;4863:72;;4658:287;4009:943;;;;;;;:::o;4958:468::-;5023:6;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:50;5401:7;5392:6;5381:9;5377:22;5359:50;:::i;:::-;5349:60;;5304:115;4958:468;;;;;:::o;5432:474::-;5500:6;5508;5557:2;5545:9;5536:7;5532:23;5528:32;5525:119;;;5563:79;;:::i;:::-;5525:119;5683:1;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5654:117;5810:2;5836:53;5881:7;5872:6;5861:9;5857:22;5836:53;:::i;:::-;5826:63;;5781:118;5432:474;;;;;:::o;5912:345::-;5979:6;6028:2;6016:9;6007:7;6003:23;5999:32;5996:119;;;6034:79;;:::i;:::-;5996:119;6154:1;6179:61;6232:7;6223:6;6212:9;6208:22;6179:61;:::i;:::-;6169:71;;6125:125;5912:345;;;;:::o;6263:327::-;6321:6;6370:2;6358:9;6349:7;6345:23;6341:32;6338:119;;;6376:79;;:::i;:::-;6338:119;6496:1;6521:52;6565:7;6556:6;6545:9;6541:22;6521:52;:::i;:::-;6511:62;;6467:116;6263:327;;;;:::o;6596:349::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:63;6920:7;6911:6;6900:9;6896:22;6865:63;:::i;:::-;6855:73;;6811:127;6596:349;;;;:::o;6951:509::-;7020:6;7069:2;7057:9;7048:7;7044:23;7040:32;7037:119;;;7075:79;;:::i;:::-;7037:119;7223:1;7212:9;7208:17;7195:31;7253:18;7245:6;7242:30;7239:117;;;7275:79;;:::i;:::-;7239:117;7380:63;7435:7;7426:6;7415:9;7411:22;7380:63;:::i;:::-;7370:73;;7166:287;6951:509;;;;:::o;7466:329::-;7525:6;7574:2;7562:9;7553:7;7549:23;7545:32;7542:119;;;7580:79;;:::i;:::-;7542:119;7700:1;7725:53;7770:7;7761:6;7750:9;7746:22;7725:53;:::i;:::-;7715:63;;7671:117;7466:329;;;;:::o;7801:351::-;7871:6;7920:2;7908:9;7899:7;7895:23;7891:32;7888:119;;;7926:79;;:::i;:::-;7888:119;8046:1;8071:64;8127:7;8118:6;8107:9;8103:22;8071:64;:::i;:::-;8061:74;;8017:128;7801:351;;;;:::o;8158:474::-;8226:6;8234;8283:2;8271:9;8262:7;8258:23;8254:32;8251:119;;;8289:79;;:::i;:::-;8251:119;8409:1;8434:53;8479:7;8470:6;8459:9;8455:22;8434:53;:::i;:::-;8424:63;;8380:117;8536:2;8562:53;8607:7;8598:6;8587:9;8583:22;8562:53;:::i;:::-;8552:63;;8507:118;8158:474;;;;;:::o;8638:118::-;8725:24;8743:5;8725:24;:::i;:::-;8720:3;8713:37;8638:118;;:::o;8762:109::-;8843:21;8858:5;8843:21;:::i;:::-;8838:3;8831:34;8762:109;;:::o;8877:360::-;8963:3;8991:38;9023:5;8991:38;:::i;:::-;9045:70;9108:6;9103:3;9045:70;:::i;:::-;9038:77;;9124:52;9169:6;9164:3;9157:4;9150:5;9146:16;9124:52;:::i;:::-;9201:29;9223:6;9201:29;:::i;:::-;9196:3;9192:39;9185:46;;8967:270;8877:360;;;;:::o;9243:373::-;9347:3;9375:38;9407:5;9375:38;:::i;:::-;9429:88;9510:6;9505:3;9429:88;:::i;:::-;9422:95;;9526:52;9571:6;9566:3;9559:4;9552:5;9548:16;9526:52;:::i;:::-;9603:6;9598:3;9594:16;9587:23;;9351:265;9243:373;;;;:::o;9622:159::-;9723:51;9768:5;9723:51;:::i;:::-;9718:3;9711:64;9622:159;;:::o;9787:364::-;9875:3;9903:39;9936:5;9903:39;:::i;:::-;9958:71;10022:6;10017:3;9958:71;:::i;:::-;9951:78;;10038:52;10083:6;10078:3;10071:4;10064:5;10060:16;10038:52;:::i;:::-;10115:29;10137:6;10115:29;:::i;:::-;10110:3;10106:39;10099:46;;9879:272;9787:364;;;;:::o;10157:377::-;10263:3;10291:39;10324:5;10291:39;:::i;:::-;10346:89;10428:6;10423:3;10346:89;:::i;:::-;10339:96;;10444:52;10489:6;10484:3;10477:4;10470:5;10466:16;10444:52;:::i;:::-;10521:6;10516:3;10512:16;10505:23;;10267:267;10157:377;;;;:::o;10540:366::-;10682:3;10703:67;10767:2;10762:3;10703:67;:::i;:::-;10696:74;;10779:93;10868:3;10779:93;:::i;:::-;10897:2;10892:3;10888:12;10881:19;;10540:366;;;:::o;10912:::-;11054:3;11075:67;11139:2;11134:3;11075:67;:::i;:::-;11068:74;;11151:93;11240:3;11151:93;:::i;:::-;11269:2;11264:3;11260:12;11253:19;;10912:366;;;:::o;11284:::-;11426:3;11447:67;11511:2;11506:3;11447:67;:::i;:::-;11440:74;;11523:93;11612:3;11523:93;:::i;:::-;11641:2;11636:3;11632:12;11625:19;;11284:366;;;:::o;11656:::-;11798:3;11819:67;11883:2;11878:3;11819:67;:::i;:::-;11812:74;;11895:93;11984:3;11895:93;:::i;:::-;12013:2;12008:3;12004:12;11997:19;;11656:366;;;:::o;12028:::-;12170:3;12191:67;12255:2;12250:3;12191:67;:::i;:::-;12184:74;;12267:93;12356:3;12267:93;:::i;:::-;12385:2;12380:3;12376:12;12369:19;;12028:366;;;:::o;12400:118::-;12487:24;12505:5;12487:24;:::i;:::-;12482:3;12475:37;12400:118;;:::o;12524:271::-;12654:3;12676:93;12765:3;12756:6;12676:93;:::i;:::-;12669:100;;12786:3;12779:10;;12524:271;;;;:::o;12801:435::-;12981:3;13003:95;13094:3;13085:6;13003:95;:::i;:::-;12996:102;;13115:95;13206:3;13197:6;13115:95;:::i;:::-;13108:102;;13227:3;13220:10;;12801:435;;;;;:::o;13242:222::-;13335:4;13373:2;13362:9;13358:18;13350:26;;13386:71;13454:1;13443:9;13439:17;13430:6;13386:71;:::i;:::-;13242:222;;;;:::o;13470:332::-;13591:4;13629:2;13618:9;13614:18;13606:26;;13642:71;13710:1;13699:9;13695:17;13686:6;13642:71;:::i;:::-;13723:72;13791:2;13780:9;13776:18;13767:6;13723:72;:::i;:::-;13470:332;;;;;:::o;13808:442::-;13957:4;13995:2;13984:9;13980:18;13972:26;;14008:71;14076:1;14065:9;14061:17;14052:6;14008:71;:::i;:::-;14089:72;14157:2;14146:9;14142:18;14133:6;14089:72;:::i;:::-;14171;14239:2;14228:9;14224:18;14215:6;14171:72;:::i;:::-;13808:442;;;;;;:::o;14256:640::-;14451:4;14489:3;14478:9;14474:19;14466:27;;14503:71;14571:1;14560:9;14556:17;14547:6;14503:71;:::i;:::-;14584:72;14652:2;14641:9;14637:18;14628:6;14584:72;:::i;:::-;14666;14734:2;14723:9;14719:18;14710:6;14666:72;:::i;:::-;14785:9;14779:4;14775:20;14770:2;14759:9;14755:18;14748:48;14813:76;14884:4;14875:6;14813:76;:::i;:::-;14805:84;;14256:640;;;;;;;:::o;14902:332::-;15023:4;15061:2;15050:9;15046:18;15038:26;;15074:71;15142:1;15131:9;15127:17;15118:6;15074:71;:::i;:::-;15155:72;15223:2;15212:9;15208:18;15199:6;15155:72;:::i;:::-;14902:332;;;;;:::o;15240:210::-;15327:4;15365:2;15354:9;15350:18;15342:26;;15378:65;15440:1;15429:9;15425:17;15416:6;15378:65;:::i;:::-;15240:210;;;;:::o;15456:250::-;15563:4;15601:2;15590:9;15586:18;15578:26;;15614:85;15696:1;15685:9;15681:17;15672:6;15614:85;:::i;:::-;15456:250;;;;:::o;15712:313::-;15825:4;15863:2;15852:9;15848:18;15840:26;;15912:9;15906:4;15902:20;15898:1;15887:9;15883:17;15876:47;15940:78;16013:4;16004:6;15940:78;:::i;:::-;15932:86;;15712:313;;;;:::o;16031:514::-;16192:4;16230:2;16219:9;16215:18;16207:26;;16279:9;16273:4;16269:20;16265:1;16254:9;16250:17;16243:47;16307:78;16380:4;16371:6;16307:78;:::i;:::-;16299:86;;16432:9;16426:4;16422:20;16417:2;16406:9;16402:18;16395:48;16460:78;16533:4;16524:6;16460:78;:::i;:::-;16452:86;;16031:514;;;;;:::o;16551:419::-;16717:4;16755:2;16744:9;16740:18;16732:26;;16804:9;16798:4;16794:20;16790:1;16779:9;16775:17;16768:47;16832:131;16958:4;16832:131;:::i;:::-;16824:139;;16551:419;;;:::o;16976:::-;17142:4;17180:2;17169:9;17165:18;17157:26;;17229:9;17223:4;17219:20;17215:1;17204:9;17200:17;17193:47;17257:131;17383:4;17257:131;:::i;:::-;17249:139;;16976:419;;;:::o;17401:::-;17567:4;17605:2;17594:9;17590:18;17582:26;;17654:9;17648:4;17644:20;17640:1;17629:9;17625:17;17618:47;17682:131;17808:4;17682:131;:::i;:::-;17674:139;;17401:419;;;:::o;17826:::-;17992:4;18030:2;18019:9;18015:18;18007:26;;18079:9;18073:4;18069:20;18065:1;18054:9;18050:17;18043:47;18107:131;18233:4;18107:131;:::i;:::-;18099:139;;17826:419;;;:::o;18251:::-;18417:4;18455:2;18444:9;18440:18;18432:26;;18504:9;18498:4;18494:20;18490:1;18479:9;18475:17;18468:47;18532:131;18658:4;18532:131;:::i;:::-;18524:139;;18251:419;;;:::o;18676:222::-;18769:4;18807:2;18796:9;18792:18;18784:26;;18820:71;18888:1;18877:9;18873:17;18864:6;18820:71;:::i;:::-;18676:222;;;;:::o;18904:332::-;19025:4;19063:2;19052:9;19048:18;19040:26;;19076:71;19144:1;19133:9;19129:17;19120:6;19076:71;:::i;:::-;19157:72;19225:2;19214:9;19210:18;19201:6;19157:72;:::i;:::-;18904:332;;;;;:::o;19242:129::-;19276:6;19303:20;;:::i;:::-;19293:30;;19332:33;19360:4;19352:6;19332:33;:::i;:::-;19242:129;;;:::o;19377:75::-;19410:6;19443:2;19437:9;19427:19;;19377:75;:::o;19458:307::-;19519:4;19609:18;19601:6;19598:30;19595:56;;;19631:18;;:::i;:::-;19595:56;19669:29;19691:6;19669:29;:::i;:::-;19661:37;;19753:4;19747;19743:15;19735:23;;19458:307;;;:::o;19771:308::-;19833:4;19923:18;19915:6;19912:30;19909:56;;;19945:18;;:::i;:::-;19909:56;19983:29;20005:6;19983:29;:::i;:::-;19975:37;;20067:4;20061;20057:15;20049:23;;19771:308;;;:::o;20085:98::-;20136:6;20170:5;20164:12;20154:22;;20085:98;;;:::o;20189:99::-;20241:6;20275:5;20269:12;20259:22;;20189:99;;;:::o;20294:168::-;20377:11;20411:6;20406:3;20399:19;20451:4;20446:3;20442:14;20427:29;;20294:168;;;;:::o;20468:147::-;20569:11;20606:3;20591:18;;20468:147;;;;:::o;20621:169::-;20705:11;20739:6;20734:3;20727:19;20779:4;20774:3;20770:14;20755:29;;20621:169;;;;:::o;20796:148::-;20898:11;20935:3;20920:18;;20796:148;;;;:::o;20950:305::-;20990:3;21009:20;21027:1;21009:20;:::i;:::-;21004:25;;21043:20;21061:1;21043:20;:::i;:::-;21038:25;;21197:1;21129:66;21125:74;21122:1;21119:81;21116:107;;;21203:18;;:::i;:::-;21116:107;21247:1;21244;21240:9;21233:16;;20950:305;;;;:::o;21261:185::-;21301:1;21318:20;21336:1;21318:20;:::i;:::-;21313:25;;21352:20;21370:1;21352:20;:::i;:::-;21347:25;;21391:1;21381:35;;21396:18;;:::i;:::-;21381:35;21438:1;21435;21431:9;21426:14;;21261:185;;;;:::o;21452:348::-;21492:7;21515:20;21533:1;21515:20;:::i;:::-;21510:25;;21549:20;21567:1;21549:20;:::i;:::-;21544:25;;21737:1;21669:66;21665:74;21662:1;21659:81;21654:1;21647:9;21640:17;21636:105;21633:131;;;21744:18;;:::i;:::-;21633:131;21792:1;21789;21785:9;21774:20;;21452:348;;;;:::o;21806:96::-;21843:7;21872:24;21890:5;21872:24;:::i;:::-;21861:35;;21806:96;;;:::o;21908:90::-;21942:7;21985:5;21978:13;21971:21;21960:32;;21908:90;;;:::o;22004:149::-;22040:7;22080:66;22073:5;22069:78;22058:89;;22004:149;;;:::o;22159:126::-;22196:7;22236:42;22229:5;22225:54;22214:65;;22159:126;;;:::o;22291:77::-;22328:7;22357:5;22346:16;;22291:77;;;:::o;22374:140::-;22438:9;22471:37;22502:5;22471:37;:::i;:::-;22458:50;;22374:140;;;:::o;22520:126::-;22570:9;22603:37;22634:5;22603:37;:::i;:::-;22590:50;;22520:126;;;:::o;22652:113::-;22702:9;22735:24;22753:5;22735:24;:::i;:::-;22722:37;;22652:113;;;:::o;22771:154::-;22855:6;22850:3;22845;22832:30;22917:1;22908:6;22903:3;22899:16;22892:27;22771:154;;;:::o;22931:307::-;22999:1;23009:113;23023:6;23020:1;23017:13;23009:113;;;23108:1;23103:3;23099:11;23093:18;23089:1;23084:3;23080:11;23073:39;23045:2;23042:1;23038:10;23033:15;;23009:113;;;23140:6;23137:1;23134:13;23131:101;;;23220:1;23211:6;23206:3;23202:16;23195:27;23131:101;22980:258;22931:307;;;:::o;23244:320::-;23288:6;23325:1;23319:4;23315:12;23305:22;;23372:1;23366:4;23362:12;23393:18;23383:81;;23449:4;23441:6;23437:17;23427:27;;23383:81;23511:2;23503:6;23500:14;23480:18;23477:38;23474:84;;;23530:18;;:::i;:::-;23474:84;23295:269;23244:320;;;:::o;23570:281::-;23653:27;23675:4;23653:27;:::i;:::-;23645:6;23641:40;23783:6;23771:10;23768:22;23747:18;23735:10;23732:34;23729:62;23726:88;;;23794:18;;:::i;:::-;23726:88;23834:10;23830:2;23823:22;23613:238;23570:281;;:::o;23857:180::-;23905:77;23902:1;23895:88;24002:4;23999:1;23992:15;24026:4;24023:1;24016:15;24043:180;24091:77;24088:1;24081:88;24188:4;24185:1;24178:15;24212:4;24209:1;24202:15;24229:180;24277:77;24274:1;24267:88;24374:4;24371:1;24364:15;24398:4;24395:1;24388:15;24415:180;24463:77;24460:1;24453:88;24560:4;24557:1;24550:15;24584:4;24581:1;24574:15;24601:117;24710:1;24707;24700:12;24724:117;24833:1;24830;24823:12;24847:117;24956:1;24953;24946:12;24970:117;25079:1;25076;25069:12;25093:102;25134:6;25185:2;25181:7;25176:2;25169:5;25165:14;25161:28;25151:38;;25093:102;;;:::o;25201:225::-;25341:34;25337:1;25329:6;25325:14;25318:58;25410:8;25405:2;25397:6;25393:15;25386:33;25201:225;:::o;25432:::-;25572:34;25568:1;25560:6;25556:14;25549:58;25641:8;25636:2;25628:6;25624:15;25617:33;25432:225;:::o;25663:182::-;25803:34;25799:1;25791:6;25787:14;25780:58;25663:182;:::o;25851:179::-;25991:31;25987:1;25979:6;25975:14;25968:55;25851:179;:::o;26036:229::-;26176:34;26172:1;26164:6;26160:14;26153:58;26245:12;26240:2;26232:6;26228:15;26221:37;26036:229;:::o;26271:122::-;26344:24;26362:5;26344:24;:::i;:::-;26337:5;26334:35;26324:63;;26383:1;26380;26373:12;26324:63;26271:122;:::o;26399:116::-;26469:21;26484:5;26469:21;:::i;:::-;26462:5;26459:32;26449:60;;26505:1;26502;26495:12;26449:60;26399:116;:::o;26521:120::-;26593:23;26610:5;26593:23;:::i;:::-;26586:5;26583:34;26573:62;;26631:1;26628;26621:12;26573:62;26521:120;:::o;26647:122::-;26720:24;26738:5;26720:24;:::i;:::-;26713:5;26710:35;26700:63;;26759:1;26756;26749:12;26700:63;26647:122;:::o

Swarm Source

ipfs://5902b3dd6f0d156d067a4838bfa89f6ddd8c7187061fdbf3b30c40b9dd4f0edb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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