ETH Price: $2,533.82 (-2.63%)

Token

SudoCash (CASH)
 

Overview

Max Total Supply

2,000 CASH

Holders

89

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
10 CASH
0x7445E7C1Bcb776C279d0f80FDc9953d1f7deDE5f
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:
SudoCash

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: contracts/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: contracts/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: contracts/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: contracts/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: contracts/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: contracts/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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);
}

// File: contracts/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: contracts/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: contracts/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/Address.sol


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

pragma solidity ^0.8.1;

/**
 * @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: contracts/ERC721.sol


// Modifed from: OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)
// Modified by: Rob Secord (https://twitter.com/robsecord)
// Co-founder @ Charged Particles - Visit: https://charged.fi
// Co-founder @ Taggr             - Visit: https://taggr.io

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 *
 * NOTE: Pre-Mint:
 *  The only changes made here are:
 *    - change scope of "_owners" from private to internal
 *    - change scope of "_balances" from private to internal
 *    - remove "ERC721" scope-resolution from "ownerOf" calls in order to override "ownerOf"
 *    - modify the _burn function to burn to an alternate Null Address (prevents reassignment back to Pre-Mint Receiver)
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _balances;

    // 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;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @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) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @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, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), 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-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        // Prevent re-assigning the token back to the Pre-Mint Receiver
        _owners[tokenId] = 0x000000000000000000000000000000000000dEaD;

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a 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 _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/ERC721iEnumerable.sol


// Modified from: OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
// Modified by: Rob Secord (https://twitter.com/robsecord)
// Co-founder @ Charged Particles - Visit: https://charged.fi
// Co-founder @ Taggr             - Visit: https://taggr.io

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 *
 * @dev This implementation also includes support for pre-minting a max-supply of tokens up-front.
 *
 * Note on pre-mint:
 *  Assumes a Max-Supply which is entirely pre-minted to initial address with sequential Token IDs.
 *  For this reason, the "allTokens" state vars are unneccesary and have been removed.
 *  Also defines 2 light-weight state vars: "_preMintReceiver" & "_maxSupply"
 *  Overrides "ownerOf" & "_exists"
 */
abstract contract ERC721iEnumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Tracking for the Pre-Mint Receiver
    address internal _preMintReceiver;

    // Max-Supply for Pre-Mint
    uint256 internal _maxSupply;

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Note on Pre-Mint: this implementation maintains the exact same interface for IERC721Enumerable
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        uint256 tokenId = _ownedTokens[owner][index];
        // All indices within the Pre-Mint range are base-1 sequential and owned by the Pre-Mint Receiver.
        if (tokenId == 0 && owner == _preMintReceiver) {
            tokenId = index + 1;
        }
        return tokenId;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // The Total Supply is simply the Max Supply
        return _maxSupply;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < _maxSupply,
            "ERC721Enumerable: global index out of bounds"
        );
        // Array index is 0-based, whereas Token ID is 1-based (sequential).
        return index + 1;
    }

    /**
     * @dev Override the ERC721 "ownerOf" function to account for the Pre-Mint Receiver.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override(IERC721, ERC721)
        returns (address)
    {
        // Anything beyond the Pre-Minted supply will use the standard "ownerOf"
        if (tokenId > _maxSupply) {
            return super.ownerOf(tokenId);
        }

        // Since we have Pre-Minted the Max-Supply to the "Pre-Mint Receiver" account, we know:
        //  - if the "_owners" mapping has not been assigned, then the owner is the Pre-Mint Receiver.
        //  - after the NFT is transferred, the "_owners" mapping will be updated with the new owner.
        address owner_ = _owners[tokenId];
        if (owner_ == address(0)) {
            owner_ = _preMintReceiver;
        }
        return owner_;
    }

    /**
     * @dev Override the ERC721 "_exists" function to account for the Pre-Minted Max-Supply.
     */
    function _exists(uint256 tokenId)
        internal
        view
        virtual
        override(ERC721)
        returns (bool)
    {
        // Anything beyond the Pre-Minted supply will use the standard "_exists"
        if (tokenId > _maxSupply) {
            return super._exists(tokenId);
        }

        // We know the Max-Supply has been Pre-Minted with Sequential Token IDs
        return (tokenId > 0 && tokenId <= _maxSupply);
    }

    /**
     * @dev See {IERC721Enumerable-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev See {IERC721Enumerable-_addTokenToOwnerEnumeration}.
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev See {IERC721Enumerable-_removeTokenFromOwnerEnumeration}.
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).
        // We do additional checks in the case "from" is the _preMintReceiver

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = (ownerOf(tokenId) == _preMintReceiver &&
            _owners[tokenId] == address(0))
            ? tokenId - 1
            : _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = (ownerOf(tokenId) == _preMintReceiver &&
                _ownedTokens[from][lastTokenIndex] == 0)
                ? ERC721.balanceOf(from)
                : _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }
}

// File: contracts/ERC721i.sol


// Written by: Rob Secord (https://twitter.com/robsecord)
// Co-founder @ Charged Particles - Visit: https://charged.fi
// Co-founder @ Taggr             - Visit: https://taggr.io

pragma solidity >=0.8.9 <0.9.0;



/**
 * @dev This implements a Pre-Mint version of {ERC721} that adds the ability to Pre-Mint
 * all the token ids in the contract as assign an initial owner for each token id.
 *
 * On-chain state for Pre-Mint does not need to be initially stored if Max-Supply is known.
 * Minting is a simple matter of assigning a balance to the pre-mint receiver,
 * and modifying the "read" methods to account for the pre-mint receiver as owner.
 * We use the Consecutive Transfer Method as defined in EIP-2309 to signal inital ownership.
 * Almost everything else remains standard.
 * We also default to the contract "owner" as the pre-mint receiver, but this can be changed.
 */
contract ERC721i is Ownable, ERC721iEnumerable {
    /// @dev EIP-2309: https://eips.ethereum.org/EIPS/eip-2309
    event ConsecutiveTransfer(
        uint256 indexed fromTokenId,
        uint256 toTokenId,
        address indexed fromAddress,
        address indexed toAddress
    );

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection,
     * as well as a `minter` and a `maxSupply` for pre-minting the collection.
     */
    constructor(
        string memory name,
        string memory symbol,
        address minter,
        uint256 maxSupply
    ) ERC721(name, symbol) {
        // Set vars defined in ERC721iEnumerable.sol
        _maxSupply = maxSupply;
        _preMintReceiver = minter;
    }

    /**
     * @dev Pre-mint the max-supply of token IDs to the minter account.
     * Token IDs are in base-1 sequential order.
     */
    function _preMint() internal {
        // Update balance for initial owner, defined in ERC721.sol
        _balances[_preMintReceiver] = _maxSupply;

        // Emit the Consecutive Transfer Event
        emit ConsecutiveTransfer(1, _maxSupply, address(0), _preMintReceiver);
    }
}

// File: contracts/SudoCash.sol


pragma solidity >=0.8.9 <0.9.0;





contract SudoCash is ERC721i, ReentrancyGuard {
    using Strings for uint256;
    using Address for address payable;
    using Counters for Counters.Counter;

    /// @dev Some sales-related events
    event Purchase(
        address indexed newOwner,
        uint256 amount,
        uint256 lastTokenId
    );
    event Withdraw(address indexed receiver, uint256 amount);
    event PriceUpdate(uint256 newPrice);

    /// @dev Track number of tokens sold
    Counters.Counter internal _lastPurchasedTokenId;

    /// @dev ERC721 Base Token URI
    string internal _baseTokenURI;

    // Individual NFT Sale Price in ETH
    uint256 public _pricePer;

    /// @dev The Deployer of this contract is also the Owner and the Pre-Mint Receiver.
    constructor(
        string memory name,
        string memory symbol,
        string memory baseUri,
        uint256 maxSupply
    ) ERC721i(name, symbol, _msgSender(), maxSupply) {
        _baseTokenURI = baseUri;

        // Since we pre-mint to "owner", allow this contract to transfer on behalf of "owner" for sales.
        _setApprovalForAll(_msgSender(), address(this), true);
    }

    /// @dev Let's Pre-Mint a Gazillion NFTs!!  (wait, 2^^256-1 equals what again?)
    function preMint() external onlyOwner {
        _preMint();
    }

    /**
     * @dev Purchases from the Pre-Mint Receiver are a simple matter of transferring the token.
     * For this reason, we can provide a very simple "batch" transfer mechanism in order to
     * save even more gas for our users.
     */
    function purchase(uint256 amount)
        external
        payable
        virtual
        nonReentrant
        returns (uint256 amountTransferred)
    {
        uint256 index = _lastPurchasedTokenId.current();
        if (index + amount > _maxSupply) {
            amount = _maxSupply - index;
        }

        uint256 cost;
        if (_pricePer > 0) {
            cost = _pricePer * amount;
            require(msg.value >= cost, "Insufficient payment");
        }

        uint256[] memory tokenIds = new uint256[](amount);
        for (uint256 i = 0; i < amount; i++) {
            _lastPurchasedTokenId.increment();
            tokenIds[i] = _lastPurchasedTokenId.current();
        }
        amountTransferred = _batchTransfer(owner(), _msgSender(), tokenIds);

        emit Purchase(_msgSender(), amount, _lastPurchasedTokenId.current());

        // Refund overspend
        if (msg.value > cost) {
            payable(_msgSender()).sendValue(msg.value - cost);
        }
    }

    /// @dev Set the price for sales to maintain a purchase price of $1 USD
    function setPrice(uint256 newPrice) external onlyOwner {
        _pricePer = newPrice;
        emit PriceUpdate(newPrice);
    }

    /// @dev Withdraw ETH from Sales
    function withdraw() external onlyOwner {
        uint256 amount = address(this).balance;
        address payable receiver = payable(owner());
        receiver.sendValue(amount);
        emit Withdraw(receiver, amount);
    }

    /// @dev Provide a Base URI for Token Metadata (override defined in ERC721.sol)
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

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

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

    //
    // Batch Transfers
    //

    function batchTransfer(address to, uint256[] memory tokenIds)
        external
        virtual
        returns (uint256 amountTransferred)
    {
        amountTransferred = _batchTransfer(_msgSender(), to, tokenIds);
    }

    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory tokenIds
    ) external virtual returns (uint256 amountTransferred) {
        amountTransferred = _batchTransfer(from, to, tokenIds);
    }

    function _batchTransfer(
        address from,
        address to,
        uint256[] memory tokenIds
    ) internal virtual returns (uint256 amountTransferred) {
        uint256 count = tokenIds.length;

        for (uint256 i = 0; i < count; i++) {
            uint256 tokenId = tokenIds[i];

            // Skip invalid tokens; no need to cancel the whole tx for 1 failure
            // These are the exact same "require" checks performed in ERC721.sol for standard transfers.
            if (
                (ownerOf(tokenId) != from) ||
                (!_isApprovedOrOwner(from, tokenId)) ||
                (to == address(0))
            ) {
                continue;
            }

            _beforeTokenTransfer(from, to, tokenId);

            // Clear approvals from the previous owner
            _approve(address(0), tokenId);

            amountTransferred += 1;
            _owners[tokenId] = to;

            emit Transfer(from, to, tokenId);

            _afterTokenTransfer(from, to, tokenId);
        }

        // We can save a bit of gas here by updating these state-vars atthe end
        _balances[from] -= amountTransferred;
        _balances[to] += amountTransferred;
    }

    //
    // Pre Mint
    //

    /**
     * @dev Change preMintReceiver.
     */
    function setPreMintReceiver(address newPreMintReceiver) public onlyOwner {
        require(
            newPreMintReceiver != address(0),
            "ERC721i: new preMintReceiver cannot be the null address"
        );
        _preMintReceiver = newPreMintReceiver;
    }

    /**
     * @dev Getter function for preMintReceiver.
     */
    function getPreMintReceiver() public view returns (address) {
        return _preMintReceiver;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":true,"internalType":"address","name":"toAddress","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PriceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastTokenId","type":"uint256"}],"name":"Purchase","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":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"_pricePer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"uint256","name":"amountTransferred","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"uint256","name":"amountTransferred","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreMintReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"amountTransferred","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPreMintReceiver","type":"address"}],"name":"setPreMintReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620049c9380380620049c9833981810160405281019062000037919062000600565b8383620000496200013a60201b60201c565b8383836200006c620000606200013a60201b60201c565b6200014260201b60201c565b81600190805190602001906200008492919062000378565b5080600290805190602001906200009d92919062000378565b50505080600a8190555081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506001600b8190555081600d90805190602001906200010c92919062000378565b5062000130620001216200013a60201b60201c565b3060016200020660201b60201c565b50505050620007f1565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000278576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026f9062000730565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516200036b91906200076f565b60405180910390a3505050565b8280546200038690620007bb565b90600052602060002090601f016020900481019282620003aa5760008555620003f6565b82601f10620003c557805160ff1916838001178555620003f6565b82800160010185558215620003f6579182015b82811115620003f5578251825591602001919060010190620003d8565b5b50905062000405919062000409565b5090565b5b80821115620004245760008160009055506001016200040a565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004918262000446565b810181811067ffffffffffffffff82111715620004b357620004b262000457565b5b80604052505050565b6000620004c862000428565b9050620004d6828262000486565b919050565b600067ffffffffffffffff821115620004f957620004f862000457565b5b620005048262000446565b9050602081019050919050565b60005b838110156200053157808201518184015260208101905062000514565b8381111562000541576000848401525b50505050565b60006200055e6200055884620004db565b620004bc565b9050828152602081018484840111156200057d576200057c62000441565b5b6200058a84828562000511565b509392505050565b600082601f830112620005aa57620005a96200043c565b5b8151620005bc84826020860162000547565b91505092915050565b6000819050919050565b620005da81620005c5565b8114620005e657600080fd5b50565b600081519050620005fa81620005cf565b92915050565b600080600080608085870312156200061d576200061c62000432565b5b600085015167ffffffffffffffff8111156200063e576200063d62000437565b5b6200064c8782880162000592565b945050602085015167ffffffffffffffff81111562000670576200066f62000437565b5b6200067e8782880162000592565b935050604085015167ffffffffffffffff811115620006a257620006a162000437565b5b620006b08782880162000592565b9250506060620006c387828801620005e9565b91505092959194509250565b600082825260208201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600062000718601983620006cf565b91506200072582620006e0565b602082019050919050565b600060208201905081810360008301526200074b8162000709565b9050919050565b60008115159050919050565b620007698162000752565b82525050565b60006020820190506200078660008301846200075e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007d457607f821691505b60208210811415620007eb57620007ea6200078c565b5b50919050565b6141c880620008016000396000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063b88d4fde1161008a578063efef39a111610064578063efef39a11461061e578063f2fde38b1461064e578063f3993d1114610677578063feff6549146106b4576101b7565b8063b88d4fde1461057b578063c87b56dd146105a4578063e985e9c5146105e1576101b7565b806391b7f5ed116100c657806391b7f5ed146104c157806395d89b41146104ea578063a22cb46514610515578063ac3c99521461053e576101b7565b806370a0823114610442578063715018a61461047f5780638da5cb5b14610496576101b7565b806335ebb7f71161015957806342842e0e1161013357806342842e0e146103745780634f6ccce71461039d57806353093df0146103da5780636352211e14610405576101b7565b806335ebb7f71461031b5780633ccfd60b146103465780633cd29ac81461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612c87565b6106dd565b6040516101f09190612ccf565b60405180910390f35b34801561020557600080fd5b5061020e610757565b60405161021b9190612d83565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612ddb565b6107e9565b6040516102589190612e49565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e90565b61082f565b005b34801561029657600080fd5b5061029f610947565b6040516102ac9190612edf565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612efa565b610951565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612e90565b6109b1565b6040516103129190612edf565b60405180910390f35b34801561032757600080fd5b50610330610ace565b60405161033d9190612e49565b60405180910390f35b34801561035257600080fd5b5061035b610af8565b005b34801561036957600080fd5b50610372610c00565b005b34801561038057600080fd5b5061039b60048036038101906103969190612efa565b610c86565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612ddb565b610ca6565b6040516103d19190612edf565b60405180910390f35b3480156103e657600080fd5b506103ef610d00565b6040516103fc9190612edf565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612ddb565b610d06565b6040516104399190612e49565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612f4d565b610dbf565b6040516104769190612edf565b60405180910390f35b34801561048b57600080fd5b50610494610e77565b005b3480156104a257600080fd5b506104ab610eff565b6040516104b89190612e49565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612ddb565b610f28565b005b3480156104f657600080fd5b506104ff610fe5565b60405161050c9190612d83565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612fa6565b611077565b005b34801561054a57600080fd5b506105656004803603810190610560919061312e565b61108d565b6040516105729190612edf565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d919061323f565b6110a9565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612ddb565b61110b565b6040516105d89190612d83565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906132c2565b6111b2565b6040516106159190612ccf565b60405180910390f35b61063860048036038101906106339190612ddb565b611246565b6040516106459190612edf565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190612f4d565b611498565b005b34801561068357600080fd5b5061069e60048036038101906106999190613302565b611590565b6040516106ab9190612edf565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612f4d565b6115a6565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610750575061074f826116d6565b5b9050919050565b606060018054610766906133a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906133a0565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f4826117b8565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083a82610d06565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290613444565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ca611803565b73ffffffffffffffffffffffffffffffffffffffff1614806108f957506108f8816108f3611803565b6111b2565b5b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906134d6565b60405180910390fd5b610942838361180b565b505050565b6000600a54905090565b61096261095c611803565b826118c4565b6109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099890613568565b60405180910390fd5b6109ac838383611959565b505050565b60006109bc83610dbf565b82106109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f4906135fa565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600081148015610aaf5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15610ac457600183610ac19190613649565b90505b8091505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b00611803565b73ffffffffffffffffffffffffffffffffffffffff16610b1e610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b906136eb565b60405180910390fd5b60004790506000610b83610eff565b9050610bae828273ffffffffffffffffffffffffffffffffffffffff16611bc090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610bf49190612edf565b60405180910390a25050565b610c08611803565b73ffffffffffffffffffffffffffffffffffffffff16610c26610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c73906136eb565b60405180910390fd5b610c84611cb4565b565b610ca1838383604051806020016040528060008152506110a9565b505050565b6000600a548210610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce39061377d565b60405180910390fd5b600182610cf99190613649565b9050919050565b600e5481565b6000600a54821115610d2257610d1b82611daa565b9050610dba565b60006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db557600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b809150505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e279061380f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7f611803565b73ffffffffffffffffffffffffffffffffffffffff16610e9d610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906136eb565b60405180910390fd5b610efd6000611e5c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f30611803565b73ffffffffffffffffffffffffffffffffffffffff16610f4e610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b906136eb565b60405180910390fd5b80600e819055507fae46785019700e30375a5d7b4f91e32f8060ef085111f896ebf889450aa2ab5a81604051610fda9190612edf565b60405180910390a150565b606060028054610ff4906133a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611020906133a0565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b5050505050905090565b611089611082611803565b8383611f20565b5050565b60006110a161109a611803565b848461208d565b905092915050565b6110ba6110b4611803565b836118c4565b6110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613568565b60405180910390fd5b611105848484846122f1565b50505050565b60606111168261234d565b611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c906138a1565b60405180910390fd5b600061115f612383565b9050600081511161117f57604051806020016040528060008152506111aa565b8061118984612415565b60405160200161119a9291906138fd565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006002600b54141561128e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112859061396d565b60405180910390fd5b6002600b8190555060006112a2600c612576565b9050600a5483826112b39190613649565b11156112ca5780600a546112c7919061398d565b92505b600080600e54111561132a5783600e546112e491906139c1565b905080341015611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090613a67565b60405180910390fd5b5b60008467ffffffffffffffff81111561134657611345612feb565b5b6040519080825280602002602001820160405280156113745781602001602082028036833780820191505090505b50905060005b858110156113c85761138c600c612584565b611396600c612576565b8282815181106113a9576113a8613a87565b5b60200260200101818152505080806113c090613ab6565b91505061137a565b506113e26113d4610eff565b6113dc611803565b8361208d565b93506113ec611803565b73ffffffffffffffffffffffffffffffffffffffff167f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c8661142e600c612576565b60405161143c929190613aff565b60405180910390a28134111561148857611487823461145b919061398d565b611463611803565b73ffffffffffffffffffffffffffffffffffffffff16611bc090919063ffffffff16565b5b5050506001600b81905550919050565b6114a0611803565b73ffffffffffffffffffffffffffffffffffffffff166114be610eff565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906136eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90613b9a565b60405180910390fd5b61158d81611e5c565b50565b600061159d84848461208d565b90509392505050565b6115ae611803565b73ffffffffffffffffffffffffffffffffffffffff166115cc610eff565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611619906136eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613c2c565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117a157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117b157506117b08261259a565b5b9050919050565b6117c18161234d565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613c98565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661187e83610d06565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d083610d06565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611912575061191181856111b2565b5b8061195057508373ffffffffffffffffffffffffffffffffffffffff16611938846107e9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197982610d06565b73ffffffffffffffffffffffffffffffffffffffff16146119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613d2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690613dbc565b60405180910390fd5b611a4a838383612604565b611a5560008261180b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa5919061398d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611afc9190613649565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bbb83838361265c565b505050565b80471015611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613e28565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c2990613e79565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b5050905080611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613f00565b60405180910390fd5b505050565b600a5460046000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1660017fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d600a54604051611da09190612edf565b60405180910390a4565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613c98565b60405180910390fd5b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690613f6c565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120809190612ccf565b60405180910390a3505050565b6000808251905060005b8181101561223c5760008482815181106120b4576120b3613a87565b5b602002602001015190508673ffffffffffffffffffffffffffffffffffffffff166120de82610d06565b73ffffffffffffffffffffffffffffffffffffffff16141580612108575061210687826118c4565b155b8061213f5750600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561214a5750612229565b612155878783612604565b61216060008261180b565b60018461216d9190613649565b9350856003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461222787878361265c565b505b808061223490613ab6565b915050612097565b5081600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228c919061398d565b9250508190555081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e29190613649565b92505081905550509392505050565b6122fc848484611959565b61230884848484612661565b612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90613ffe565b60405180910390fd5b50505050565b6000600a5482111561236957612362826127f8565b905061237e565b60008211801561237b5750600a548211155b90505b919050565b6060600d8054612392906133a0565b80601f01602080910402602001604051908101604052809291908181526020018280546123be906133a0565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b5050505050905090565b6060600082141561245d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612571565b600082905060005b6000821461248f57808061247890613ab6565b915050600a82612488919061404d565b9150612465565b60008167ffffffffffffffff8111156124ab576124aa612feb565b5b6040519080825280601f01601f1916602001820160405280156124dd5781602001600182028036833780820191505090505b5090505b6000851461256a576001826124f6919061398d565b9150600a85612505919061407e565b60306125119190613649565b60f81b81838151811061252757612526613a87565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612563919061404d565b94506124e1565b8093505050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61260f838383612864565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126575761264c8382612869565b6126568282612b79565b5b505050565b505050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612bf8565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611803565b8786866040518563ffffffff1660e01b81526004016126cd9493929190614104565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190614165565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613ffe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b6000600161287684610dbf565b612880919061398d565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128c684610d06565b73ffffffffffffffffffffffffffffffffffffffff161480156129485750600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612965576008600084815260200190815260200160002054612973565b600183612972919061398d565b5b9050818114612b08576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129c085610d06565b73ffffffffffffffffffffffffffffffffffffffff16148015612a3357506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054145b612a8d57600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054612a97565b612a9685610dbf565b5b905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000612b8483610dbf565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c6481612c2f565b8114612c6f57600080fd5b50565b600081359050612c8181612c5b565b92915050565b600060208284031215612c9d57612c9c612c25565b5b6000612cab84828501612c72565b91505092915050565b60008115159050919050565b612cc981612cb4565b82525050565b6000602082019050612ce46000830184612cc0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d24578082015181840152602081019050612d09565b83811115612d33576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5582612cea565b612d5f8185612cf5565b9350612d6f818560208601612d06565b612d7881612d39565b840191505092915050565b60006020820190508181036000830152612d9d8184612d4a565b905092915050565b6000819050919050565b612db881612da5565b8114612dc357600080fd5b50565b600081359050612dd581612daf565b92915050565b600060208284031215612df157612df0612c25565b5b6000612dff84828501612dc6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3382612e08565b9050919050565b612e4381612e28565b82525050565b6000602082019050612e5e6000830184612e3a565b92915050565b612e6d81612e28565b8114612e7857600080fd5b50565b600081359050612e8a81612e64565b92915050565b60008060408385031215612ea757612ea6612c25565b5b6000612eb585828601612e7b565b9250506020612ec685828601612dc6565b9150509250929050565b612ed981612da5565b82525050565b6000602082019050612ef46000830184612ed0565b92915050565b600080600060608486031215612f1357612f12612c25565b5b6000612f2186828701612e7b565b9350506020612f3286828701612e7b565b9250506040612f4386828701612dc6565b9150509250925092565b600060208284031215612f6357612f62612c25565b5b6000612f7184828501612e7b565b91505092915050565b612f8381612cb4565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc612c25565b5b6000612fcb85828601612e7b565b9250506020612fdc85828601612f91565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61302382612d39565b810181811067ffffffffffffffff8211171561304257613041612feb565b5b80604052505050565b6000613055612c1b565b9050613061828261301a565b919050565b600067ffffffffffffffff82111561308157613080612feb565b5b602082029050602081019050919050565b600080fd5b60006130aa6130a584613066565b61304b565b905080838252602082019050602084028301858111156130cd576130cc613092565b5b835b818110156130f657806130e28882612dc6565b8452602084019350506020810190506130cf565b5050509392505050565b600082601f83011261311557613114612fe6565b5b8135613125848260208601613097565b91505092915050565b6000806040838503121561314557613144612c25565b5b600061315385828601612e7b565b925050602083013567ffffffffffffffff81111561317457613173612c2a565b5b61318085828601613100565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156131aa576131a9612feb565b5b6131b382612d39565b9050602081019050919050565b82818337600083830152505050565b60006131e26131dd8461318f565b61304b565b9050828152602081018484840111156131fe576131fd61318a565b5b6132098482856131c0565b509392505050565b600082601f83011261322657613225612fe6565b5b81356132368482602086016131cf565b91505092915050565b6000806000806080858703121561325957613258612c25565b5b600061326787828801612e7b565b945050602061327887828801612e7b565b935050604061328987828801612dc6565b925050606085013567ffffffffffffffff8111156132aa576132a9612c2a565b5b6132b687828801613211565b91505092959194509250565b600080604083850312156132d9576132d8612c25565b5b60006132e785828601612e7b565b92505060206132f885828601612e7b565b9150509250929050565b60008060006060848603121561331b5761331a612c25565b5b600061332986828701612e7b565b935050602061333a86828701612e7b565b925050604084013567ffffffffffffffff81111561335b5761335a612c2a565b5b61336786828701613100565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b857607f821691505b602082108114156133cc576133cb613371565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061342e602183612cf5565b9150613439826133d2565b604082019050919050565b6000602082019050818103600083015261345d81613421565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006134c0603e83612cf5565b91506134cb82613464565b604082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613552602e83612cf5565b915061355d826134f6565b604082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135e4602b83612cf5565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365482612da5565b915061365f83612da5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136945761369361361a565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136d5602083612cf5565b91506136e08261369f565b602082019050919050565b60006020820190508181036000830152613704816136c8565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613767602c83612cf5565b91506137728261370b565b604082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006137f9602983612cf5565b91506138048261379d565b604082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061388b602f83612cf5565b91506138968261382f565b604082019050919050565b600060208201905081810360008301526138ba8161387e565b9050919050565b600081905092915050565b60006138d782612cea565b6138e181856138c1565b93506138f1818560208601612d06565b80840191505092915050565b600061390982856138cc565b915061391582846138cc565b91508190509392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613957601f83612cf5565b915061396282613921565b602082019050919050565b600060208201905081810360008301526139868161394a565b9050919050565b600061399882612da5565b91506139a383612da5565b9250828210156139b6576139b561361a565b5b828203905092915050565b60006139cc82612da5565b91506139d783612da5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1057613a0f61361a565b5b828202905092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000613a51601483612cf5565b9150613a5c82613a1b565b602082019050919050565b60006020820190508181036000830152613a8081613a44565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613ac182612da5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613af457613af361361a565b5b600182019050919050565b6000604082019050613b146000830185612ed0565b613b216020830184612ed0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b84602683612cf5565b9150613b8f82613b28565b604082019050919050565b60006020820190508181036000830152613bb381613b77565b9050919050565b7f455243373231693a206e6577207072654d696e7452656365697665722063616e60008201527f6e6f7420626520746865206e756c6c2061646472657373000000000000000000602082015250565b6000613c16603783612cf5565b9150613c2182613bba565b604082019050919050565b60006020820190508181036000830152613c4581613c09565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c82601883612cf5565b9150613c8d82613c4c565b602082019050919050565b60006020820190508181036000830152613cb181613c75565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613d14602583612cf5565b9150613d1f82613cb8565b604082019050919050565b60006020820190508181036000830152613d4381613d07565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613da6602483612cf5565b9150613db182613d4a565b604082019050919050565b60006020820190508181036000830152613dd581613d99565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613e12601d83612cf5565b9150613e1d82613ddc565b602082019050919050565b60006020820190508181036000830152613e4181613e05565b9050919050565b600081905092915050565b50565b6000613e63600083613e48565b9150613e6e82613e53565b600082019050919050565b6000613e8482613e56565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613eea603a83612cf5565b9150613ef582613e8e565b604082019050919050565b60006020820190508181036000830152613f1981613edd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f56601983612cf5565b9150613f6182613f20565b602082019050919050565b60006020820190508181036000830152613f8581613f49565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613fe8603283612cf5565b9150613ff382613f8c565b604082019050919050565b6000602082019050818103600083015261401781613fdb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061405882612da5565b915061406383612da5565b9250826140735761407261401e565b5b828204905092915050565b600061408982612da5565b915061409483612da5565b9250826140a4576140a361401e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140d6826140af565b6140e081856140ba565b93506140f0818560208601612d06565b6140f981612d39565b840191505092915050565b60006080820190506141196000830187612e3a565b6141266020830186612e3a565b6141336040830185612ed0565b818103606083015261414581846140cb565b905095945050505050565b60008151905061415f81612c5b565b92915050565b60006020828403121561417b5761417a612c25565b5b600061418984828501614150565b9150509291505056fea264697066735822122099199d9ab261f5245f2662824fe4f79ffc2c898be2f431b487130f1d19c01b7664736f6c63430008090033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000085375646f43617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443415348000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696832376763617362646976647770646936646f3561756a6f78716c32633537733461323765736f6c36747a6a763369746d7a32652f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c806370a08231116100ec578063b88d4fde1161008a578063efef39a111610064578063efef39a11461061e578063f2fde38b1461064e578063f3993d1114610677578063feff6549146106b4576101b7565b8063b88d4fde1461057b578063c87b56dd146105a4578063e985e9c5146105e1576101b7565b806391b7f5ed116100c657806391b7f5ed146104c157806395d89b41146104ea578063a22cb46514610515578063ac3c99521461053e576101b7565b806370a0823114610442578063715018a61461047f5780638da5cb5b14610496576101b7565b806335ebb7f71161015957806342842e0e1161013357806342842e0e146103745780634f6ccce71461039d57806353093df0146103da5780636352211e14610405576101b7565b806335ebb7f71461031b5780633ccfd60b146103465780633cd29ac81461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612c87565b6106dd565b6040516101f09190612ccf565b60405180910390f35b34801561020557600080fd5b5061020e610757565b60405161021b9190612d83565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612ddb565b6107e9565b6040516102589190612e49565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e90565b61082f565b005b34801561029657600080fd5b5061029f610947565b6040516102ac9190612edf565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612efa565b610951565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612e90565b6109b1565b6040516103129190612edf565b60405180910390f35b34801561032757600080fd5b50610330610ace565b60405161033d9190612e49565b60405180910390f35b34801561035257600080fd5b5061035b610af8565b005b34801561036957600080fd5b50610372610c00565b005b34801561038057600080fd5b5061039b60048036038101906103969190612efa565b610c86565b005b3480156103a957600080fd5b506103c460048036038101906103bf9190612ddb565b610ca6565b6040516103d19190612edf565b60405180910390f35b3480156103e657600080fd5b506103ef610d00565b6040516103fc9190612edf565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612ddb565b610d06565b6040516104399190612e49565b60405180910390f35b34801561044e57600080fd5b5061046960048036038101906104649190612f4d565b610dbf565b6040516104769190612edf565b60405180910390f35b34801561048b57600080fd5b50610494610e77565b005b3480156104a257600080fd5b506104ab610eff565b6040516104b89190612e49565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e39190612ddb565b610f28565b005b3480156104f657600080fd5b506104ff610fe5565b60405161050c9190612d83565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190612fa6565b611077565b005b34801561054a57600080fd5b506105656004803603810190610560919061312e565b61108d565b6040516105729190612edf565b60405180910390f35b34801561058757600080fd5b506105a2600480360381019061059d919061323f565b6110a9565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190612ddb565b61110b565b6040516105d89190612d83565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906132c2565b6111b2565b6040516106159190612ccf565b60405180910390f35b61063860048036038101906106339190612ddb565b611246565b6040516106459190612edf565b60405180910390f35b34801561065a57600080fd5b5061067560048036038101906106709190612f4d565b611498565b005b34801561068357600080fd5b5061069e60048036038101906106999190613302565b611590565b6040516106ab9190612edf565b60405180910390f35b3480156106c057600080fd5b506106db60048036038101906106d69190612f4d565b6115a6565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610750575061074f826116d6565b5b9050919050565b606060018054610766906133a0565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906133a0565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f4826117b8565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061083a82610d06565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a290613444565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108ca611803565b73ffffffffffffffffffffffffffffffffffffffff1614806108f957506108f8816108f3611803565b6111b2565b5b610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906134d6565b60405180910390fd5b610942838361180b565b505050565b6000600a54905090565b61096261095c611803565b826118c4565b6109a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099890613568565b60405180910390fd5b6109ac838383611959565b505050565b60006109bc83610dbf565b82106109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f4906135fa565b60405180910390fd5b6000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600081148015610aaf5750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15610ac457600183610ac19190613649565b90505b8091505092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610b00611803565b73ffffffffffffffffffffffffffffffffffffffff16610b1e610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b906136eb565b60405180910390fd5b60004790506000610b83610eff565b9050610bae828273ffffffffffffffffffffffffffffffffffffffff16611bc090919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610bf49190612edf565b60405180910390a25050565b610c08611803565b73ffffffffffffffffffffffffffffffffffffffff16610c26610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c73906136eb565b60405180910390fd5b610c84611cb4565b565b610ca1838383604051806020016040528060008152506110a9565b505050565b6000600a548210610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce39061377d565b60405180910390fd5b600182610cf99190613649565b9050919050565b600e5481565b6000600a54821115610d2257610d1b82611daa565b9050610dba565b60006003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610db557600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b809150505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e279061380f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e7f611803565b73ffffffffffffffffffffffffffffffffffffffff16610e9d610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea906136eb565b60405180910390fd5b610efd6000611e5c565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f30611803565b73ffffffffffffffffffffffffffffffffffffffff16610f4e610eff565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b906136eb565b60405180910390fd5b80600e819055507fae46785019700e30375a5d7b4f91e32f8060ef085111f896ebf889450aa2ab5a81604051610fda9190612edf565b60405180910390a150565b606060028054610ff4906133a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611020906133a0565b801561106d5780601f106110425761010080835404028352916020019161106d565b820191906000526020600020905b81548152906001019060200180831161105057829003601f168201915b5050505050905090565b611089611082611803565b8383611f20565b5050565b60006110a161109a611803565b848461208d565b905092915050565b6110ba6110b4611803565b836118c4565b6110f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f090613568565b60405180910390fd5b611105848484846122f1565b50505050565b60606111168261234d565b611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c906138a1565b60405180910390fd5b600061115f612383565b9050600081511161117f57604051806020016040528060008152506111aa565b8061118984612415565b60405160200161119a9291906138fd565b6040516020818303038152906040525b915050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006002600b54141561128e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112859061396d565b60405180910390fd5b6002600b8190555060006112a2600c612576565b9050600a5483826112b39190613649565b11156112ca5780600a546112c7919061398d565b92505b600080600e54111561132a5783600e546112e491906139c1565b905080341015611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090613a67565b60405180910390fd5b5b60008467ffffffffffffffff81111561134657611345612feb565b5b6040519080825280602002602001820160405280156113745781602001602082028036833780820191505090505b50905060005b858110156113c85761138c600c612584565b611396600c612576565b8282815181106113a9576113a8613a87565b5b60200260200101818152505080806113c090613ab6565b91505061137a565b506113e26113d4610eff565b6113dc611803565b8361208d565b93506113ec611803565b73ffffffffffffffffffffffffffffffffffffffff167f12cb4648cf3058b17ceeb33e579f8b0bc269fe0843f3900b8e24b6c54871703c8661142e600c612576565b60405161143c929190613aff565b60405180910390a28134111561148857611487823461145b919061398d565b611463611803565b73ffffffffffffffffffffffffffffffffffffffff16611bc090919063ffffffff16565b5b5050506001600b81905550919050565b6114a0611803565b73ffffffffffffffffffffffffffffffffffffffff166114be610eff565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906136eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90613b9a565b60405180910390fd5b61158d81611e5c565b50565b600061159d84848461208d565b90509392505050565b6115ae611803565b73ffffffffffffffffffffffffffffffffffffffff166115cc610eff565b73ffffffffffffffffffffffffffffffffffffffff1614611622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611619906136eb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168990613c2c565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117a157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806117b157506117b08261259a565b5b9050919050565b6117c18161234d565b611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613c98565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661187e83610d06565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806118d083610d06565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611912575061191181856111b2565b5b8061195057508373ffffffffffffffffffffffffffffffffffffffff16611938846107e9565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661197982610d06565b73ffffffffffffffffffffffffffffffffffffffff16146119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690613d2a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690613dbc565b60405180910390fd5b611a4a838383612604565b611a5560008261180b565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aa5919061398d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611afc9190613649565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611bbb83838361265c565b505050565b80471015611c03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfa90613e28565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611c2990613e79565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b5050905080611caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca690613f00565b60405180910390fd5b505050565b600a5460046000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1660017fdeaa91b6123d068f5821d0fb0678463d1a8a6079fe8af5de3ce5e896dcf9133d600a54604051611da09190612edf565b60405180910390a4565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90613c98565b60405180910390fd5b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690613f6c565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120809190612ccf565b60405180910390a3505050565b6000808251905060005b8181101561223c5760008482815181106120b4576120b3613a87565b5b602002602001015190508673ffffffffffffffffffffffffffffffffffffffff166120de82610d06565b73ffffffffffffffffffffffffffffffffffffffff16141580612108575061210687826118c4565b155b8061213f5750600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561214a5750612229565b612155878783612604565b61216060008261180b565b60018461216d9190613649565b9350856003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461222787878361265c565b505b808061223490613ab6565b915050612097565b5081600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461228c919061398d565b9250508190555081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e29190613649565b92505081905550509392505050565b6122fc848484611959565b61230884848484612661565b612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90613ffe565b60405180910390fd5b50505050565b6000600a5482111561236957612362826127f8565b905061237e565b60008211801561237b5750600a548211155b90505b919050565b6060600d8054612392906133a0565b80601f01602080910402602001604051908101604052809291908181526020018280546123be906133a0565b801561240b5780601f106123e05761010080835404028352916020019161240b565b820191906000526020600020905b8154815290600101906020018083116123ee57829003601f168201915b5050505050905090565b6060600082141561245d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612571565b600082905060005b6000821461248f57808061247890613ab6565b915050600a82612488919061404d565b9150612465565b60008167ffffffffffffffff8111156124ab576124aa612feb565b5b6040519080825280601f01601f1916602001820160405280156124dd5781602001600182028036833780820191505090505b5090505b6000851461256a576001826124f6919061398d565b9150600a85612505919061407e565b60306125119190613649565b60f81b81838151811061252757612526613a87565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612563919061404d565b94506124e1565b8093505050505b919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61260f838383612864565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126575761264c8382612869565b6126568282612b79565b5b505050565b505050565b60006126828473ffffffffffffffffffffffffffffffffffffffff16612bf8565b156127eb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ab611803565b8786866040518563ffffffff1660e01b81526004016126cd9493929190614104565b602060405180830381600087803b1580156126e757600080fd5b505af192505050801561271857506040513d601f19601f820116820180604052508101906127159190614165565b60015b61279b573d8060008114612748576040519150601f19603f3d011682016040523d82523d6000602084013e61274d565b606091505b50600081511415612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90613ffe565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127f0565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b6000600161287684610dbf565b612880919061398d565b90506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128c684610d06565b73ffffffffffffffffffffffffffffffffffffffff161480156129485750600073ffffffffffffffffffffffffffffffffffffffff166003600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b612965576008600084815260200190815260200160002054612973565b600183612972919061398d565b5b9050818114612b08576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166129c085610d06565b73ffffffffffffffffffffffffffffffffffffffff16148015612a3357506000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002054145b612a8d57600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054612a97565b612a9685610dbf565b5b905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000612b8483610dbf565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c6481612c2f565b8114612c6f57600080fd5b50565b600081359050612c8181612c5b565b92915050565b600060208284031215612c9d57612c9c612c25565b5b6000612cab84828501612c72565b91505092915050565b60008115159050919050565b612cc981612cb4565b82525050565b6000602082019050612ce46000830184612cc0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d24578082015181840152602081019050612d09565b83811115612d33576000848401525b50505050565b6000601f19601f8301169050919050565b6000612d5582612cea565b612d5f8185612cf5565b9350612d6f818560208601612d06565b612d7881612d39565b840191505092915050565b60006020820190508181036000830152612d9d8184612d4a565b905092915050565b6000819050919050565b612db881612da5565b8114612dc357600080fd5b50565b600081359050612dd581612daf565b92915050565b600060208284031215612df157612df0612c25565b5b6000612dff84828501612dc6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3382612e08565b9050919050565b612e4381612e28565b82525050565b6000602082019050612e5e6000830184612e3a565b92915050565b612e6d81612e28565b8114612e7857600080fd5b50565b600081359050612e8a81612e64565b92915050565b60008060408385031215612ea757612ea6612c25565b5b6000612eb585828601612e7b565b9250506020612ec685828601612dc6565b9150509250929050565b612ed981612da5565b82525050565b6000602082019050612ef46000830184612ed0565b92915050565b600080600060608486031215612f1357612f12612c25565b5b6000612f2186828701612e7b565b9350506020612f3286828701612e7b565b9250506040612f4386828701612dc6565b9150509250925092565b600060208284031215612f6357612f62612c25565b5b6000612f7184828501612e7b565b91505092915050565b612f8381612cb4565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc612c25565b5b6000612fcb85828601612e7b565b9250506020612fdc85828601612f91565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61302382612d39565b810181811067ffffffffffffffff8211171561304257613041612feb565b5b80604052505050565b6000613055612c1b565b9050613061828261301a565b919050565b600067ffffffffffffffff82111561308157613080612feb565b5b602082029050602081019050919050565b600080fd5b60006130aa6130a584613066565b61304b565b905080838252602082019050602084028301858111156130cd576130cc613092565b5b835b818110156130f657806130e28882612dc6565b8452602084019350506020810190506130cf565b5050509392505050565b600082601f83011261311557613114612fe6565b5b8135613125848260208601613097565b91505092915050565b6000806040838503121561314557613144612c25565b5b600061315385828601612e7b565b925050602083013567ffffffffffffffff81111561317457613173612c2a565b5b61318085828601613100565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156131aa576131a9612feb565b5b6131b382612d39565b9050602081019050919050565b82818337600083830152505050565b60006131e26131dd8461318f565b61304b565b9050828152602081018484840111156131fe576131fd61318a565b5b6132098482856131c0565b509392505050565b600082601f83011261322657613225612fe6565b5b81356132368482602086016131cf565b91505092915050565b6000806000806080858703121561325957613258612c25565b5b600061326787828801612e7b565b945050602061327887828801612e7b565b935050604061328987828801612dc6565b925050606085013567ffffffffffffffff8111156132aa576132a9612c2a565b5b6132b687828801613211565b91505092959194509250565b600080604083850312156132d9576132d8612c25565b5b60006132e785828601612e7b565b92505060206132f885828601612e7b565b9150509250929050565b60008060006060848603121561331b5761331a612c25565b5b600061332986828701612e7b565b935050602061333a86828701612e7b565b925050604084013567ffffffffffffffff81111561335b5761335a612c2a565b5b61336786828701613100565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133b857607f821691505b602082108114156133cc576133cb613371565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061342e602183612cf5565b9150613439826133d2565b604082019050919050565b6000602082019050818103600083015261345d81613421565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006134c0603e83612cf5565b91506134cb82613464565b604082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613552602e83612cf5565b915061355d826134f6565b604082019050919050565b6000602082019050818103600083015261358181613545565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006135e4602b83612cf5565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061365482612da5565b915061365f83612da5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156136945761369361361a565b5b828201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136d5602083612cf5565b91506136e08261369f565b602082019050919050565b60006020820190508181036000830152613704816136c8565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613767602c83612cf5565b91506137728261370b565b604082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006137f9602983612cf5565b91506138048261379d565b604082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061388b602f83612cf5565b91506138968261382f565b604082019050919050565b600060208201905081810360008301526138ba8161387e565b9050919050565b600081905092915050565b60006138d782612cea565b6138e181856138c1565b93506138f1818560208601612d06565b80840191505092915050565b600061390982856138cc565b915061391582846138cc565b91508190509392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613957601f83612cf5565b915061396282613921565b602082019050919050565b600060208201905081810360008301526139868161394a565b9050919050565b600061399882612da5565b91506139a383612da5565b9250828210156139b6576139b561361a565b5b828203905092915050565b60006139cc82612da5565b91506139d783612da5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1057613a0f61361a565b5b828202905092915050565b7f496e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000613a51601483612cf5565b9150613a5c82613a1b565b602082019050919050565b60006020820190508181036000830152613a8081613a44565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613ac182612da5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613af457613af361361a565b5b600182019050919050565b6000604082019050613b146000830185612ed0565b613b216020830184612ed0565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b84602683612cf5565b9150613b8f82613b28565b604082019050919050565b60006020820190508181036000830152613bb381613b77565b9050919050565b7f455243373231693a206e6577207072654d696e7452656365697665722063616e60008201527f6e6f7420626520746865206e756c6c2061646472657373000000000000000000602082015250565b6000613c16603783612cf5565b9150613c2182613bba565b604082019050919050565b60006020820190508181036000830152613c4581613c09565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613c82601883612cf5565b9150613c8d82613c4c565b602082019050919050565b60006020820190508181036000830152613cb181613c75565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613d14602583612cf5565b9150613d1f82613cb8565b604082019050919050565b60006020820190508181036000830152613d4381613d07565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613da6602483612cf5565b9150613db182613d4a565b604082019050919050565b60006020820190508181036000830152613dd581613d99565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613e12601d83612cf5565b9150613e1d82613ddc565b602082019050919050565b60006020820190508181036000830152613e4181613e05565b9050919050565b600081905092915050565b50565b6000613e63600083613e48565b9150613e6e82613e53565b600082019050919050565b6000613e8482613e56565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613eea603a83612cf5565b9150613ef582613e8e565b604082019050919050565b60006020820190508181036000830152613f1981613edd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613f56601983612cf5565b9150613f6182613f20565b602082019050919050565b60006020820190508181036000830152613f8581613f49565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613fe8603283612cf5565b9150613ff382613f8c565b604082019050919050565b6000602082019050818103600083015261401781613fdb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061405882612da5565b915061406383612da5565b9250826140735761407261401e565b5b828204905092915050565b600061408982612da5565b915061409483612da5565b9250826140a4576140a361401e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140d6826140af565b6140e081856140ba565b93506140f0818560208601612d06565b6140f981612d39565b840191505092915050565b60006080820190506141196000830187612e3a565b6141266020830186612e3a565b6141336040830185612ed0565b818103606083015261414581846140cb565b905095945050505050565b60008151905061415f81612c5b565b92915050565b60006020828403121561417b5761417a612c25565b5b600061418984828501614150565b9150509291505056fea264697066735822122099199d9ab261f5245f2662824fe4f79ffc2c898be2f431b487130f1d19c01b7664736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000000085375646f43617368000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000443415348000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696832376763617362646976647770646936646f3561756a6f78716c32633537733461323765736f6c36747a6a763369746d7a32652f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): SudoCash
Arg [1] : symbol (string): CASH
Arg [2] : baseUri (string): ipfs://bafybeih27gcasbdivdwpdi6do5aujoxql2c57s4a27esol6tzjv3itmz2e/
Arg [3] : maxSupply (uint256): 2000

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 5375646f43617368000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4341534800000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [9] : 697066733a2f2f62616679626569683237676361736264697664777064693664
Arg [10] : 6f3561756a6f78716c32633537733461323765736f6c36747a6a763369746d7a
Arg [11] : 32652f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52221:6244:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44612:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30625:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32131:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31655:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45662:160;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32831:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44996:590;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58360:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55089:229;;;;;;;;;;;;;:::i;:::-;;53483:67;;;;;;;;;;;;;:::i;:::-;;33238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45899:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52868:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46385:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30067:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14238:103;;;;;;;;;;;;;:::i;:::-;;13587:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54912:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30794:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32374:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56188:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33494:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55533:605;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32600:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53808:1019;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14496:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56424:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58007:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44612:300;44759:4;44816:35;44801:50;;;:11;:50;;;;:103;;;;44868:36;44892:11;44868:23;:36::i;:::-;44801:103;44781:123;;44612:300;;;:::o;30625:100::-;30679:13;30712:5;30705:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30625:100;:::o;32131:171::-;32207:7;32227:23;32242:7;32227:14;:23::i;:::-;32270:15;:24;32286:7;32270:24;;;;;;;;;;;;;;;;;;;;;32263:31;;32131:171;;;:::o;31655:410::-;31736:13;31752:16;31760:7;31752;:16::i;:::-;31736:32;;31793:5;31787:11;;:2;:11;;;;31779:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31887:5;31871:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31896:37;31913:5;31920:12;:10;:12::i;:::-;31896:16;:37::i;:::-;31871:62;31849:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;32036:21;32045:2;32049:7;32036:8;:21::i;:::-;31725:340;31655:410;;:::o;45662:160::-;45723:7;45804:10;;45797:17;;45662:160;:::o;32831:336::-;33026:41;33045:12;:10;:12::i;:::-;33059:7;33026:18;:41::i;:::-;33018:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33131:28;33141:4;33147:2;33151:7;33131:9;:28::i;:::-;32831:336;;;:::o;44996:590::-;45138:7;45193:23;45210:5;45193:16;:23::i;:::-;45185:5;:31;45163:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;45298:15;45316:12;:19;45329:5;45316:19;;;;;;;;;;;;;;;:26;45336:5;45316:26;;;;;;;;;;;;45298:44;;45476:1;45465:7;:12;:41;;;;;45490:16;;;;;;;;;;;45481:25;;:5;:25;;;45465:41;45461:93;;;45541:1;45533:5;:9;;;;:::i;:::-;45523:19;;45461:93;45571:7;45564:14;;;44996:590;;;;:::o;58360:102::-;58411:7;58438:16;;;;;;;;;;;58431:23;;58360:102;:::o;55089:229::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55139:14:::1;55156:21;55139:38;;55188:24;55223:7;:5;:7::i;:::-;55188:43;;55242:26;55261:6;55242:8;:18;;;;:26;;;;:::i;:::-;55293:8;55284:26;;;55303:6;55284:26;;;;;;:::i;:::-;;;;;;;;55128:190;;55089:229::o:0;53483:67::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53532:10:::1;:8;:10::i;:::-;53483:67::o:0;33238:185::-;33376:39;33393:4;33399:2;33403:7;33376:39;;;;;;;;;;;;:16;:39::i;:::-;33238:185;;;:::o;45899:370::-;46019:7;46074:10;;46066:5;:18;46044:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;46260:1;46252:5;:9;;;;:::i;:::-;46245:16;;45899:370;;;:::o;52868:24::-;;;;:::o;46385:792::-;46519:7;46640:10;;46630:7;:20;46626:82;;;46674:22;46688:7;46674:13;:22::i;:::-;46667:29;;;;46626:82;47024:14;47041:7;:16;47049:7;47041:16;;;;;;;;;;;;;;;;;;;;;47024:33;;47090:1;47072:20;;:6;:20;;;47068:78;;;47118:16;;;;;;;;;;;47109:25;;47068:78;47163:6;47156:13;;;46385:792;;;;:::o;30067:207::-;30139:7;30184:1;30167:19;;:5;:19;;;;30159:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30250:9;:16;30260:5;30250:16;;;;;;;;;;;;;;;;30243:23;;30067:207;;;:::o;14238:103::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14303:30:::1;14330:1;14303:18;:30::i;:::-;14238:103::o:0;13587:87::-;13633:7;13660:6;;;;;;;;;;;13653:13;;13587:87;:::o;54912:131::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54990:8:::1;54978:9;:20;;;;55014:21;55026:8;55014:21;;;;;;:::i;:::-;;;;;;;;54912:131:::0;:::o;30794:104::-;30850:13;30883:7;30876:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30794:104;:::o;32374:155::-;32469:52;32488:12;:10;:12::i;:::-;32502:8;32512;32469:18;:52::i;:::-;32374:155;;:::o;56188:228::-;56303:25;56366:42;56381:12;:10;:12::i;:::-;56395:2;56399:8;56366:14;:42::i;:::-;56346:62;;56188:228;;;;:::o;33494:323::-;33668:41;33687:12;:10;:12::i;:::-;33701:7;33668:18;:41::i;:::-;33660:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;33771:38;33785:4;33791:2;33795:7;33804:4;33771:13;:38::i;:::-;33494:323;;;;:::o;55533:605::-;55652:13;55705:17;55713:8;55705:7;:17::i;:::-;55683:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;55810:28;55841:10;:8;:10::i;:::-;55810:41;;55913:1;55888:14;55882:28;:32;:248;;;;;;;;;;;;;;;;;56006:14;56047:19;:8;:17;:19::i;:::-;55963:126;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55882:248;55862:268;;;55533:605;;;:::o;32600:164::-;32697:4;32721:18;:25;32740:5;32721:25;;;;;;;;;;;;;;;:35;32747:8;32721:35;;;;;;;;;;;;;;;;;;;;;;;;;32714:42;;32600:164;;;;:::o;53808:1019::-;53934:25;16844:1;17442:7;;:19;;17434:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;16844:1;17575:7;:18;;;;53977:13:::1;53993:31;:21;:29;:31::i;:::-;53977:47;;54056:10;;54047:6;54039:5;:14;;;;:::i;:::-;:27;54035:87;;;54105:5;54092:10;;:18;;;;:::i;:::-;54083:27;;54035:87;54134:12;54173:1:::0;54161:9:::1;;:13;54157:136;;;54210:6;54198:9;;:18;;;;:::i;:::-;54191:25;;54252:4;54239:9;:17;;54231:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54157:136;54305:25;54347:6;54333:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54305:49;;54370:9;54365:157;54389:6;54385:1;:10;54365:157;;;54417:33;:21;:31;:33::i;:::-;54479:31;:21;:29;:31::i;:::-;54465:8;54474:1;54465:11;;;;;;;;:::i;:::-;;;;;;;:45;;;::::0;::::1;54397:3;;;;;:::i;:::-;;;;54365:157;;;;54552:47;54567:7;:5;:7::i;:::-;54576:12;:10;:12::i;:::-;54590:8;54552:14;:47::i;:::-;54532:67;;54626:12;:10;:12::i;:::-;54617:63;;;54640:6;54648:31;:21;:29;:31::i;:::-;54617:63;;;;;;;:::i;:::-;;;;;;;;54738:4;54726:9;:16;54722:98;;;54759:49;54803:4;54791:9;:16;;;;:::i;:::-;54767:12;:10;:12::i;:::-;54759:31;;;;:49;;;;:::i;:::-;54722:98;53966:861;;;16800:1:::0;17754:7;:22;;;;53808:1019;;;:::o;14496:201::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14605:1:::1;14585:22;;:8;:22;;;;14577:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14661:28;14680:8;14661:18;:28::i;:::-;14496:201:::0;:::o;56424:240::-;56564:25;56622:34;56637:4;56643:2;56647:8;56622:14;:34::i;:::-;56602:54;;56424:240;;;;;:::o;58007:277::-;13818:12;:10;:12::i;:::-;13807:23;;:7;:5;:7::i;:::-;:23;;;13799:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58143:1:::1;58113:32;;:18;:32;;;;58091:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;58258:18;58239:16;;:37;;;;;;;;;;;;;;;;;;58007:277:::0;:::o;29698:305::-;29800:4;29852:25;29837:40;;;:11;:40;;;;:105;;;;29909:33;29894:48;;;:11;:48;;;;29837:105;:158;;;;29959:36;29983:11;29959:23;:36::i;:::-;29837:158;29817:178;;29698:305;;;:::o;40189:135::-;40271:16;40279:7;40271;:16::i;:::-;40263:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;40189:135;:::o;12332:98::-;12385:7;12412:10;12405:17;;12332:98;:::o;39475:167::-;39577:2;39550:15;:24;39566:7;39550:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39626:7;39622:2;39595:39;;39604:16;39612:7;39604;:16::i;:::-;39595:39;;;;;;;;;;;;39475:167;;:::o;35618:257::-;35711:4;35728:13;35744:16;35752:7;35744;:16::i;:::-;35728:32;;35790:5;35779:16;;:7;:16;;;:52;;;;35799:32;35816:5;35823:7;35799:16;:32::i;:::-;35779:52;:87;;;;35859:7;35835:31;;:20;35847:7;35835:11;:20::i;:::-;:31;;;35779:87;35771:96;;;35618:257;;;;:::o;38738:618::-;38890:4;38870:24;;:16;38878:7;38870;:16::i;:::-;:24;;;38862:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38969:1;38955:16;;:2;:16;;;;38947:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39025:39;39046:4;39052:2;39056:7;39025:20;:39::i;:::-;39129:29;39146:1;39150:7;39129:8;:29::i;:::-;39190:1;39171:9;:15;39181:4;39171:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39219:1;39202:9;:13;39212:2;39202:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39250:2;39231:7;:16;39239:7;39231:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39289:7;39285:2;39270:27;;39279:4;39270:27;;;;;;;;;;;;39310:38;39330:4;39336:2;39340:7;39310:19;:38::i;:::-;38738:618;;;:::o;21710:317::-;21825:6;21800:21;:31;;21792:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21879:12;21897:9;:14;;21919:6;21897:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21878:52;;;21949:7;21941:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;21781:246;21710:317;;:::o;51848:286::-;51986:10;;51956:9;:27;51966:16;;;;;;;;;;;51956:27;;;;;;;;;;;;;;;:40;;;;52109:16;;;;;;;;;;;52062:64;;52105:1;52062:64;;52082:1;52062:64;52085:10;;52062:64;;;;;;:::i;:::-;;;;;;;;51848:286::o;30336:222::-;30408:7;30428:13;30444:7;:16;30452:7;30444:16;;;;;;;;;;;;;;;;;;;;;30428:32;;30496:1;30479:19;;:5;:19;;;;30471:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;30545:5;30538:12;;;30336:222;;;:::o;14857:191::-;14931:16;14950:6;;;;;;;;;;;14931:25;;14976:8;14967:6;;:17;;;;;;;;;;;;;;;;;;15031:8;15000:40;;15021:8;15000:40;;;;;;;;;;;;14920:128;14857:191;:::o;39785:315::-;39940:8;39931:17;;:5;:17;;;;39923:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;40027:8;39989:18;:25;40008:5;39989:25;;;;;;;;;;;;;;;:35;40015:8;39989:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40073:8;40051:41;;40066:5;40051:41;;;40083:8;40051:41;;;;;;:::i;:::-;;;;;;;;39785:315;;;:::o;56672:1237::-;56809:25;56847:13;56863:8;:15;56847:31;;56896:9;56891:836;56915:5;56911:1;:9;56891:836;;;56942:15;56960:8;56969:1;56960:11;;;;;;;;:::i;:::-;;;;;;;;56942:29;;57219:4;57199:24;;:16;57207:7;57199;:16::i;:::-;:24;;;;57198:83;;;;57247:33;57266:4;57272:7;57247:18;:33::i;:::-;57246:34;57198:83;:122;;;;57317:1;57303:16;;:2;:16;;;57198:122;57176:203;;;57355:8;;;57176:203;57395:39;57416:4;57422:2;57426:7;57395:20;:39::i;:::-;57507:29;57524:1;57528:7;57507:8;:29::i;:::-;57574:1;57553:22;;;;;:::i;:::-;;;57609:2;57590:7;:16;57598:7;57590:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;57652:7;57648:2;57633:27;;57642:4;57633:27;;;;;;;;;;;;57677:38;57697:4;57703:2;57707:7;57677:19;:38::i;:::-;56927:800;56891:836;56922:3;;;;;:::i;:::-;;;;56891:836;;;;57839:17;57820:9;:15;57830:4;57820:15;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;57884:17;57867:9;:13;57877:2;57867:13;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;56836:1073;56672:1237;;;;;:::o;34698:313::-;34854:28;34864:4;34870:2;34874:7;34854:9;:28::i;:::-;34901:47;34924:4;34930:2;34934:7;34943:4;34901:22;:47::i;:::-;34893:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34698:313;;;;:::o;47297:459::-;47424:4;47542:10;;47532:7;:20;47528:82;;;47576:22;47590:7;47576:13;:22::i;:::-;47569:29;;;;47528:82;47721:1;47711:7;:11;:36;;;;;47737:10;;47726:7;:21;;47711:36;47703:45;;47297:459;;;;:::o;55411:114::-;55471:13;55504;55497:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55411:114;:::o;380:723::-;436:13;666:1;657:5;:10;653:53;;;684:10;;;;;;;;;;;;;;;;;;;;;653:53;716:12;731:5;716:20;;747:14;772:78;787:1;779:4;:9;772:78;;805:8;;;;;:::i;:::-;;;;836:2;828:10;;;;;:::i;:::-;;;772:78;;;860:19;892:6;882:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:39;;910:154;926:1;917:5;:10;910:154;;954:1;944:11;;;;;:::i;:::-;;;1021:2;1013:5;:10;;;;:::i;:::-;1000:2;:24;;;;:::i;:::-;987:39;;970:6;977;970:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1050:2;1041:11;;;;;:::i;:::-;;;910:154;;;1088:6;1074:21;;;;;380:723;;;;:::o;18643:114::-;18708:7;18735;:14;;;18728:21;;18643:114;;;:::o;18765:127::-;18872:1;18854:7;:14;;;:19;;;;;;;;;;;18765:127;:::o;4857:157::-;4942:4;4981:25;4966:40;;;:11;:40;;;;4959:47;;4857:157;;;:::o;47841:354::-;47985:45;48012:4;48018:2;48022:7;47985:26;:45::i;:::-;48055:2;48047:10;;:4;:10;;;48043:145;;48074:47;48107:4;48113:7;48074:32;:47::i;:::-;48136:40;48164:2;48168:7;48136:27;:40::i;:::-;48043:145;47841:354;;;:::o;42824:125::-;;;;:::o;40888:853::-;41042:4;41063:15;:2;:13;;;:15::i;:::-;41059:675;;;41115:2;41099:36;;;41136:12;:10;:12::i;:::-;41150:4;41156:7;41165:4;41099:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41095:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41357:1;41340:6;:13;:18;41336:328;;;41383:60;;;;;;;;;;:::i;:::-;;;;;;;;41336:328;41614:6;41608:13;41599:6;41595:2;41591:15;41584:38;41095:584;41231:41;;;41221:51;;;:6;:51;;;;41214:58;;;;;41059:675;41718:4;41711:11;;40888:853;;;;;;;:::o;35324:127::-;35389:4;35441:1;35413:30;;:7;:16;35421:7;35413:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35406:37;;35324:127;;;:::o;42313:126::-;;;;:::o;48605:1369::-;48964:22;49014:1;48989:22;49006:4;48989:16;:22::i;:::-;:26;;;;:::i;:::-;48964:51;;49026:18;49068:16;;;;;;;;;;;49048:36;;:16;49056:7;49048;:16::i;:::-;:36;;;:83;;;;;49129:1;49101:30;;:7;:16;49109:7;49101:16;;;;;;;;;;;;;;;;;;;;;:30;;;49048:83;49047:154;;49175:17;:26;49193:7;49175:26;;;;;;;;;;;;49047:154;;;49158:1;49148:7;:11;;;;:::i;:::-;49047:154;49026:175;;49322:14;49308:10;:28;49304:488;;49353:19;49396:16;;;;;;;;;;;49376:36;;:16;49384:7;49376;:16::i;:::-;:36;;;:96;;;;;49471:1;49433:12;:18;49446:4;49433:18;;;;;;;;;;;;;;;:34;49452:14;49433:34;;;;;;;;;;;;:39;49376:96;49375:194;;49535:12;:18;49548:4;49535:18;;;;;;;;;;;;;;;:34;49554:14;49535:34;;;;;;;;;;;;49375:194;;;49493:22;49510:4;49493:16;:22::i;:::-;49375:194;49353:216;;49619:11;49586:12;:18;49599:4;49586:18;;;;;;;;;;;;;;;:30;49605:10;49586:30;;;;;;;;;;;:44;;;;49736:10;49703:17;:30;49721:11;49703:30;;;;;;;;;;;:43;;;;49338:454;49304:488;49888:17;:26;49906:7;49888:26;;;;;;;;;;;49881:33;;;49932:12;:18;49945:4;49932:18;;;;;;;;;;;;;;;:34;49951:14;49932:34;;;;;;;;;;;49925:41;;;48700:1274;;48605:1369;;:::o;48287:221::-;48372:14;48389:20;48406:2;48389:16;:20::i;:::-;48372:37;;48447:7;48420:12;:16;48433:2;48420:16;;;;;;;;;;;;;;;:24;48437:6;48420:24;;;;;;;;;;;:34;;;;48494:6;48465:17;:26;48483:7;48465:26;;;;;;;;;;;:35;;;;48361:147;48287:221;;:::o;20449:326::-;20509:4;20766:1;20744:7;:19;;;:23;20737:30;;20449:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:468::-;6576:6;6584;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:53;6829:7;6820:6;6809:9;6805:22;6784:53;:::i;:::-;6774:63;;6730:117;6886:2;6912:50;6954:7;6945:6;6934:9;6930:22;6912:50;:::i;:::-;6902:60;;6857:115;6511:468;;;;;:::o;6985:117::-;7094:1;7091;7084:12;7108:180;7156:77;7153:1;7146:88;7253:4;7250:1;7243:15;7277:4;7274:1;7267:15;7294:281;7377:27;7399:4;7377:27;:::i;:::-;7369:6;7365:40;7507:6;7495:10;7492:22;7471:18;7459:10;7456:34;7453:62;7450:88;;;7518:18;;:::i;:::-;7450:88;7558:10;7554:2;7547:22;7337:238;7294:281;;:::o;7581:129::-;7615:6;7642:20;;:::i;:::-;7632:30;;7671:33;7699:4;7691:6;7671:33;:::i;:::-;7581:129;;;:::o;7716:311::-;7793:4;7883:18;7875:6;7872:30;7869:56;;;7905:18;;:::i;:::-;7869:56;7955:4;7947:6;7943:17;7935:25;;8015:4;8009;8005:15;7997:23;;7716:311;;;:::o;8033:117::-;8142:1;8139;8132:12;8173:710;8269:5;8294:81;8310:64;8367:6;8310:64;:::i;:::-;8294:81;:::i;:::-;8285:90;;8395:5;8424:6;8417:5;8410:21;8458:4;8451:5;8447:16;8440:23;;8511:4;8503:6;8499:17;8491:6;8487:30;8540:3;8532:6;8529:15;8526:122;;;8559:79;;:::i;:::-;8526:122;8674:6;8657:220;8691:6;8686:3;8683:15;8657:220;;;8766:3;8795:37;8828:3;8816:10;8795:37;:::i;:::-;8790:3;8783:50;8862:4;8857:3;8853:14;8846:21;;8733:144;8717:4;8712:3;8708:14;8701:21;;8657:220;;;8661:21;8275:608;;8173:710;;;;;:::o;8906:370::-;8977:5;9026:3;9019:4;9011:6;9007:17;9003:27;8993:122;;9034:79;;:::i;:::-;8993:122;9151:6;9138:20;9176:94;9266:3;9258:6;9251:4;9243:6;9239:17;9176:94;:::i;:::-;9167:103;;8983:293;8906:370;;;;:::o;9282:684::-;9375:6;9383;9432:2;9420:9;9411:7;9407:23;9403:32;9400:119;;;9438:79;;:::i;:::-;9400:119;9558:1;9583:53;9628:7;9619:6;9608:9;9604:22;9583:53;:::i;:::-;9573:63;;9529:117;9713:2;9702:9;9698:18;9685:32;9744:18;9736:6;9733:30;9730:117;;;9766:79;;:::i;:::-;9730:117;9871:78;9941:7;9932:6;9921:9;9917:22;9871:78;:::i;:::-;9861:88;;9656:303;9282:684;;;;;:::o;9972:117::-;10081:1;10078;10071:12;10095:307;10156:4;10246:18;10238:6;10235:30;10232:56;;;10268:18;;:::i;:::-;10232:56;10306:29;10328:6;10306:29;:::i;:::-;10298:37;;10390:4;10384;10380:15;10372:23;;10095:307;;;:::o;10408:154::-;10492:6;10487:3;10482;10469:30;10554:1;10545:6;10540:3;10536:16;10529:27;10408:154;;;:::o;10568:410::-;10645:5;10670:65;10686:48;10727:6;10686:48;:::i;:::-;10670:65;:::i;:::-;10661:74;;10758:6;10751:5;10744:21;10796:4;10789:5;10785:16;10834:3;10825:6;10820:3;10816:16;10813:25;10810:112;;;10841:79;;:::i;:::-;10810:112;10931:41;10965:6;10960:3;10955;10931:41;:::i;:::-;10651:327;10568:410;;;;;:::o;10997:338::-;11052:5;11101:3;11094:4;11086:6;11082:17;11078:27;11068:122;;11109:79;;:::i;:::-;11068:122;11226:6;11213:20;11251:78;11325:3;11317:6;11310:4;11302:6;11298:17;11251:78;:::i;:::-;11242:87;;11058:277;10997:338;;;;:::o;11341:943::-;11436:6;11444;11452;11460;11509:3;11497:9;11488:7;11484:23;11480:33;11477:120;;;11516:79;;:::i;:::-;11477:120;11636:1;11661:53;11706:7;11697:6;11686:9;11682:22;11661:53;:::i;:::-;11651:63;;11607:117;11763:2;11789:53;11834:7;11825:6;11814:9;11810:22;11789:53;:::i;:::-;11779:63;;11734:118;11891:2;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11862:118;12047:2;12036:9;12032:18;12019:32;12078:18;12070:6;12067:30;12064:117;;;12100:79;;:::i;:::-;12064:117;12205:62;12259:7;12250:6;12239:9;12235:22;12205:62;:::i;:::-;12195:72;;11990:287;11341:943;;;;;;;:::o;12290:474::-;12358:6;12366;12415:2;12403:9;12394:7;12390:23;12386:32;12383:119;;;12421:79;;:::i;:::-;12383:119;12541:1;12566:53;12611:7;12602:6;12591:9;12587:22;12566:53;:::i;:::-;12556:63;;12512:117;12668:2;12694:53;12739:7;12730:6;12719:9;12715:22;12694:53;:::i;:::-;12684:63;;12639:118;12290:474;;;;;:::o;12770:829::-;12872:6;12880;12888;12937:2;12925:9;12916:7;12912:23;12908:32;12905:119;;;12943:79;;:::i;:::-;12905:119;13063:1;13088:53;13133:7;13124:6;13113:9;13109:22;13088:53;:::i;:::-;13078:63;;13034:117;13190:2;13216:53;13261:7;13252:6;13241:9;13237:22;13216:53;:::i;:::-;13206:63;;13161:118;13346:2;13335:9;13331:18;13318:32;13377:18;13369:6;13366:30;13363:117;;;13399:79;;:::i;:::-;13363:117;13504:78;13574:7;13565:6;13554:9;13550:22;13504:78;:::i;:::-;13494:88;;13289:303;12770:829;;;;;:::o;13605:180::-;13653:77;13650:1;13643:88;13750:4;13747:1;13740:15;13774:4;13771:1;13764:15;13791:320;13835:6;13872:1;13866:4;13862:12;13852:22;;13919:1;13913:4;13909:12;13940:18;13930:81;;13996:4;13988:6;13984:17;13974:27;;13930:81;14058:2;14050:6;14047:14;14027:18;14024:38;14021:84;;;14077:18;;:::i;:::-;14021:84;13842:269;13791:320;;;:::o;14117:220::-;14257:34;14253:1;14245:6;14241:14;14234:58;14326:3;14321:2;14313:6;14309:15;14302:28;14117:220;:::o;14343:366::-;14485:3;14506:67;14570:2;14565:3;14506:67;:::i;:::-;14499:74;;14582:93;14671:3;14582:93;:::i;:::-;14700:2;14695:3;14691:12;14684:19;;14343:366;;;:::o;14715:419::-;14881:4;14919:2;14908:9;14904:18;14896:26;;14968:9;14962:4;14958:20;14954:1;14943:9;14939:17;14932:47;14996:131;15122:4;14996:131;:::i;:::-;14988:139;;14715:419;;;:::o;15140:249::-;15280:34;15276:1;15268:6;15264:14;15257:58;15349:32;15344:2;15336:6;15332:15;15325:57;15140:249;:::o;15395:366::-;15537:3;15558:67;15622:2;15617:3;15558:67;:::i;:::-;15551:74;;15634:93;15723:3;15634:93;:::i;:::-;15752:2;15747:3;15743:12;15736:19;;15395:366;;;:::o;15767:419::-;15933:4;15971:2;15960:9;15956:18;15948:26;;16020:9;16014:4;16010:20;16006:1;15995:9;15991:17;15984:47;16048:131;16174:4;16048:131;:::i;:::-;16040:139;;15767:419;;;:::o;16192:233::-;16332:34;16328:1;16320:6;16316:14;16309:58;16401:16;16396:2;16388:6;16384:15;16377:41;16192:233;:::o;16431:366::-;16573:3;16594:67;16658:2;16653:3;16594:67;:::i;:::-;16587:74;;16670:93;16759:3;16670:93;:::i;:::-;16788:2;16783:3;16779:12;16772:19;;16431:366;;;:::o;16803:419::-;16969:4;17007:2;16996:9;16992:18;16984:26;;17056:9;17050:4;17046:20;17042:1;17031:9;17027:17;17020:47;17084:131;17210:4;17084:131;:::i;:::-;17076:139;;16803:419;;;:::o;17228:230::-;17368:34;17364:1;17356:6;17352:14;17345:58;17437:13;17432:2;17424:6;17420:15;17413:38;17228:230;:::o;17464:366::-;17606:3;17627:67;17691:2;17686:3;17627:67;:::i;:::-;17620:74;;17703:93;17792:3;17703:93;:::i;:::-;17821:2;17816:3;17812:12;17805:19;;17464:366;;;:::o;17836:419::-;18002:4;18040:2;18029:9;18025:18;18017:26;;18089:9;18083:4;18079:20;18075:1;18064:9;18060:17;18053:47;18117:131;18243:4;18117:131;:::i;:::-;18109:139;;17836:419;;;:::o;18261:180::-;18309:77;18306:1;18299:88;18406:4;18403:1;18396:15;18430:4;18427:1;18420:15;18447:305;18487:3;18506:20;18524:1;18506:20;:::i;:::-;18501:25;;18540:20;18558:1;18540:20;:::i;:::-;18535:25;;18694:1;18626:66;18622:74;18619:1;18616:81;18613:107;;;18700:18;;:::i;:::-;18613:107;18744:1;18741;18737:9;18730:16;;18447:305;;;;:::o;18758:182::-;18898:34;18894:1;18886:6;18882:14;18875:58;18758:182;:::o;18946:366::-;19088:3;19109:67;19173:2;19168:3;19109:67;:::i;:::-;19102:74;;19185:93;19274:3;19185:93;:::i;:::-;19303:2;19298:3;19294:12;19287:19;;18946:366;;;:::o;19318:419::-;19484:4;19522:2;19511:9;19507:18;19499:26;;19571:9;19565:4;19561:20;19557:1;19546:9;19542:17;19535:47;19599:131;19725:4;19599:131;:::i;:::-;19591:139;;19318:419;;;:::o;19743:231::-;19883:34;19879:1;19871:6;19867:14;19860:58;19952:14;19947:2;19939:6;19935:15;19928:39;19743:231;:::o;19980:366::-;20122:3;20143:67;20207:2;20202:3;20143:67;:::i;:::-;20136:74;;20219:93;20308:3;20219:93;:::i;:::-;20337:2;20332:3;20328:12;20321:19;;19980:366;;;:::o;20352:419::-;20518:4;20556:2;20545:9;20541:18;20533:26;;20605:9;20599:4;20595:20;20591:1;20580:9;20576:17;20569:47;20633:131;20759:4;20633:131;:::i;:::-;20625:139;;20352:419;;;:::o;20777:228::-;20917:34;20913:1;20905:6;20901:14;20894:58;20986:11;20981:2;20973:6;20969:15;20962:36;20777:228;:::o;21011:366::-;21153:3;21174:67;21238:2;21233:3;21174:67;:::i;:::-;21167:74;;21250:93;21339:3;21250:93;:::i;:::-;21368:2;21363:3;21359:12;21352:19;;21011:366;;;:::o;21383:419::-;21549:4;21587:2;21576:9;21572:18;21564:26;;21636:9;21630:4;21626:20;21622:1;21611:9;21607:17;21600:47;21664:131;21790:4;21664:131;:::i;:::-;21656:139;;21383:419;;;:::o;21808:234::-;21948:34;21944:1;21936:6;21932:14;21925:58;22017:17;22012:2;22004:6;22000:15;21993:42;21808:234;:::o;22048:366::-;22190:3;22211:67;22275:2;22270:3;22211:67;:::i;:::-;22204:74;;22287:93;22376:3;22287:93;:::i;:::-;22405:2;22400:3;22396:12;22389:19;;22048:366;;;:::o;22420:419::-;22586:4;22624:2;22613:9;22609:18;22601:26;;22673:9;22667:4;22663:20;22659:1;22648:9;22644:17;22637:47;22701:131;22827:4;22701:131;:::i;:::-;22693:139;;22420:419;;;:::o;22845:148::-;22947:11;22984:3;22969:18;;22845:148;;;;:::o;22999:377::-;23105:3;23133:39;23166:5;23133:39;:::i;:::-;23188:89;23270:6;23265:3;23188:89;:::i;:::-;23181:96;;23286:52;23331:6;23326:3;23319:4;23312:5;23308:16;23286:52;:::i;:::-;23363:6;23358:3;23354:16;23347:23;;23109:267;22999:377;;;;:::o;23382:435::-;23562:3;23584:95;23675:3;23666:6;23584:95;:::i;:::-;23577:102;;23696:95;23787:3;23778:6;23696:95;:::i;:::-;23689:102;;23808:3;23801:10;;23382:435;;;;;:::o;23823:181::-;23963:33;23959:1;23951:6;23947:14;23940:57;23823:181;:::o;24010:366::-;24152:3;24173:67;24237:2;24232:3;24173:67;:::i;:::-;24166:74;;24249:93;24338:3;24249:93;:::i;:::-;24367:2;24362:3;24358:12;24351:19;;24010:366;;;:::o;24382:419::-;24548:4;24586:2;24575:9;24571:18;24563:26;;24635:9;24629:4;24625:20;24621:1;24610:9;24606:17;24599:47;24663:131;24789:4;24663:131;:::i;:::-;24655:139;;24382:419;;;:::o;24807:191::-;24847:4;24867:20;24885:1;24867:20;:::i;:::-;24862:25;;24901:20;24919:1;24901:20;:::i;:::-;24896:25;;24940:1;24937;24934:8;24931:34;;;24945:18;;:::i;:::-;24931:34;24990:1;24987;24983:9;24975:17;;24807:191;;;;:::o;25004:348::-;25044:7;25067:20;25085:1;25067:20;:::i;:::-;25062:25;;25101:20;25119:1;25101:20;:::i;:::-;25096:25;;25289:1;25221:66;25217:74;25214:1;25211:81;25206:1;25199:9;25192:17;25188:105;25185:131;;;25296:18;;:::i;:::-;25185:131;25344:1;25341;25337:9;25326:20;;25004:348;;;;:::o;25358:170::-;25498:22;25494:1;25486:6;25482:14;25475:46;25358:170;:::o;25534:366::-;25676:3;25697:67;25761:2;25756:3;25697:67;:::i;:::-;25690:74;;25773:93;25862:3;25773:93;:::i;:::-;25891:2;25886:3;25882:12;25875:19;;25534:366;;;:::o;25906:419::-;26072:4;26110:2;26099:9;26095:18;26087:26;;26159:9;26153:4;26149:20;26145:1;26134:9;26130:17;26123:47;26187:131;26313:4;26187:131;:::i;:::-;26179:139;;25906:419;;;:::o;26331:180::-;26379:77;26376:1;26369:88;26476:4;26473:1;26466:15;26500:4;26497:1;26490:15;26517:233;26556:3;26579:24;26597:5;26579:24;:::i;:::-;26570:33;;26625:66;26618:5;26615:77;26612:103;;;26695:18;;:::i;:::-;26612:103;26742:1;26735:5;26731:13;26724:20;;26517:233;;;:::o;26756:332::-;26877:4;26915:2;26904:9;26900:18;26892:26;;26928:71;26996:1;26985:9;26981:17;26972:6;26928:71;:::i;:::-;27009:72;27077:2;27066:9;27062:18;27053:6;27009:72;:::i;:::-;26756:332;;;;;:::o;27094:225::-;27234:34;27230:1;27222:6;27218:14;27211:58;27303:8;27298:2;27290:6;27286:15;27279:33;27094:225;:::o;27325:366::-;27467:3;27488:67;27552:2;27547:3;27488:67;:::i;:::-;27481:74;;27564:93;27653:3;27564:93;:::i;:::-;27682:2;27677:3;27673:12;27666:19;;27325:366;;;:::o;27697:419::-;27863:4;27901:2;27890:9;27886:18;27878:26;;27950:9;27944:4;27940:20;27936:1;27925:9;27921:17;27914:47;27978:131;28104:4;27978:131;:::i;:::-;27970:139;;27697:419;;;:::o;28122:242::-;28262:34;28258:1;28250:6;28246:14;28239:58;28331:25;28326:2;28318:6;28314:15;28307:50;28122:242;:::o;28370:366::-;28512:3;28533:67;28597:2;28592:3;28533:67;:::i;:::-;28526:74;;28609:93;28698:3;28609:93;:::i;:::-;28727:2;28722:3;28718:12;28711:19;;28370:366;;;:::o;28742:419::-;28908:4;28946:2;28935:9;28931:18;28923:26;;28995:9;28989:4;28985:20;28981:1;28970:9;28966:17;28959:47;29023:131;29149:4;29023:131;:::i;:::-;29015:139;;28742:419;;;:::o;29167:174::-;29307:26;29303:1;29295:6;29291:14;29284:50;29167:174;:::o;29347:366::-;29489:3;29510:67;29574:2;29569:3;29510:67;:::i;:::-;29503:74;;29586:93;29675:3;29586:93;:::i;:::-;29704:2;29699:3;29695:12;29688:19;;29347:366;;;:::o;29719:419::-;29885:4;29923:2;29912:9;29908:18;29900:26;;29972:9;29966:4;29962:20;29958:1;29947:9;29943:17;29936:47;30000:131;30126:4;30000:131;:::i;:::-;29992:139;;29719:419;;;:::o;30144:224::-;30284:34;30280:1;30272:6;30268:14;30261:58;30353:7;30348:2;30340:6;30336:15;30329:32;30144:224;:::o;30374:366::-;30516:3;30537:67;30601:2;30596:3;30537:67;:::i;:::-;30530:74;;30613:93;30702:3;30613:93;:::i;:::-;30731:2;30726:3;30722:12;30715:19;;30374:366;;;:::o;30746:419::-;30912:4;30950:2;30939:9;30935:18;30927:26;;30999:9;30993:4;30989:20;30985:1;30974:9;30970:17;30963:47;31027:131;31153:4;31027:131;:::i;:::-;31019:139;;30746:419;;;:::o;31171:223::-;31311:34;31307:1;31299:6;31295:14;31288:58;31380:6;31375:2;31367:6;31363:15;31356:31;31171:223;:::o;31400:366::-;31542:3;31563:67;31627:2;31622:3;31563:67;:::i;:::-;31556:74;;31639:93;31728:3;31639:93;:::i;:::-;31757:2;31752:3;31748:12;31741:19;;31400:366;;;:::o;31772:419::-;31938:4;31976:2;31965:9;31961:18;31953:26;;32025:9;32019:4;32015:20;32011:1;32000:9;31996:17;31989:47;32053:131;32179:4;32053:131;:::i;:::-;32045:139;;31772:419;;;:::o;32197:179::-;32337:31;32333:1;32325:6;32321:14;32314:55;32197:179;:::o;32382:366::-;32524:3;32545:67;32609:2;32604:3;32545:67;:::i;:::-;32538:74;;32621:93;32710:3;32621:93;:::i;:::-;32739:2;32734:3;32730:12;32723:19;;32382:366;;;:::o;32754:419::-;32920:4;32958:2;32947:9;32943:18;32935:26;;33007:9;33001:4;32997:20;32993:1;32982:9;32978:17;32971:47;33035:131;33161:4;33035:131;:::i;:::-;33027:139;;32754:419;;;:::o;33179:147::-;33280:11;33317:3;33302:18;;33179:147;;;;:::o;33332:114::-;;:::o;33452:398::-;33611:3;33632:83;33713:1;33708:3;33632:83;:::i;:::-;33625:90;;33724:93;33813:3;33724:93;:::i;:::-;33842:1;33837:3;33833:11;33826:18;;33452:398;;;:::o;33856:379::-;34040:3;34062:147;34205:3;34062:147;:::i;:::-;34055:154;;34226:3;34219:10;;33856:379;;;:::o;34241:245::-;34381:34;34377:1;34369:6;34365:14;34358:58;34450:28;34445:2;34437:6;34433:15;34426:53;34241:245;:::o;34492:366::-;34634:3;34655:67;34719:2;34714:3;34655:67;:::i;:::-;34648:74;;34731:93;34820:3;34731:93;:::i;:::-;34849:2;34844:3;34840:12;34833:19;;34492:366;;;:::o;34864:419::-;35030:4;35068:2;35057:9;35053:18;35045:26;;35117:9;35111:4;35107:20;35103:1;35092:9;35088:17;35081:47;35145:131;35271:4;35145:131;:::i;:::-;35137:139;;34864:419;;;:::o;35289:175::-;35429:27;35425:1;35417:6;35413:14;35406:51;35289:175;:::o;35470:366::-;35612:3;35633:67;35697:2;35692:3;35633:67;:::i;:::-;35626:74;;35709:93;35798:3;35709:93;:::i;:::-;35827:2;35822:3;35818:12;35811:19;;35470:366;;;:::o;35842:419::-;36008:4;36046:2;36035:9;36031:18;36023:26;;36095:9;36089:4;36085:20;36081:1;36070:9;36066:17;36059:47;36123:131;36249:4;36123:131;:::i;:::-;36115:139;;35842:419;;;:::o;36267:237::-;36407:34;36403:1;36395:6;36391:14;36384:58;36476:20;36471:2;36463:6;36459:15;36452:45;36267:237;:::o;36510:366::-;36652:3;36673:67;36737:2;36732:3;36673:67;:::i;:::-;36666:74;;36749:93;36838:3;36749:93;:::i;:::-;36867:2;36862:3;36858:12;36851:19;;36510:366;;;:::o;36882:419::-;37048:4;37086:2;37075:9;37071:18;37063:26;;37135:9;37129:4;37125:20;37121:1;37110:9;37106:17;37099:47;37163:131;37289:4;37163:131;:::i;:::-;37155:139;;36882:419;;;:::o;37307:180::-;37355:77;37352:1;37345:88;37452:4;37449:1;37442:15;37476:4;37473:1;37466:15;37493:185;37533:1;37550:20;37568:1;37550:20;:::i;:::-;37545:25;;37584:20;37602:1;37584:20;:::i;:::-;37579:25;;37623:1;37613:35;;37628:18;;:::i;:::-;37613:35;37670:1;37667;37663:9;37658:14;;37493:185;;;;:::o;37684:176::-;37716:1;37733:20;37751:1;37733:20;:::i;:::-;37728:25;;37767:20;37785:1;37767:20;:::i;:::-;37762:25;;37806:1;37796:35;;37811:18;;:::i;:::-;37796:35;37852:1;37849;37845:9;37840:14;;37684:176;;;;:::o;37866:98::-;37917:6;37951:5;37945:12;37935:22;;37866:98;;;:::o;37970:168::-;38053:11;38087:6;38082:3;38075:19;38127:4;38122:3;38118:14;38103:29;;37970:168;;;;:::o;38144:360::-;38230:3;38258:38;38290:5;38258:38;:::i;:::-;38312:70;38375:6;38370:3;38312:70;:::i;:::-;38305:77;;38391:52;38436:6;38431:3;38424:4;38417:5;38413:16;38391:52;:::i;:::-;38468:29;38490:6;38468:29;:::i;:::-;38463:3;38459:39;38452:46;;38234:270;38144:360;;;;:::o;38510:640::-;38705:4;38743:3;38732:9;38728:19;38720:27;;38757:71;38825:1;38814:9;38810:17;38801:6;38757:71;:::i;:::-;38838:72;38906:2;38895:9;38891:18;38882:6;38838:72;:::i;:::-;38920;38988:2;38977:9;38973:18;38964:6;38920:72;:::i;:::-;39039:9;39033:4;39029:20;39024:2;39013:9;39009:18;39002:48;39067:76;39138:4;39129:6;39067:76;:::i;:::-;39059:84;;38510:640;;;;;;;:::o;39156:141::-;39212:5;39243:6;39237:13;39228:22;;39259:32;39285:5;39259:32;:::i;:::-;39156:141;;;;:::o;39303:349::-;39372:6;39421:2;39409:9;39400:7;39396:23;39392:32;39389:119;;;39427:79;;:::i;:::-;39389:119;39547:1;39572:63;39627:7;39618:6;39607:9;39603:22;39572:63;:::i;:::-;39562:73;;39518:127;39303:349;;;;:::o

Swarm Source

ipfs://99199d9ab261f5245f2662824fe4f79ffc2c898be2f431b487130f1d19c01b76
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.