ETH Price: $3,313.89 (-3.50%)
Gas: 19 Gwei

Token

Royal Flush Ape Club (RFAC)
 

Overview

Max Total Supply

8,888 RFAC

Holders

884

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
4 RFAC
0x191db47a3ae4164cb2dd602d6a3adc0bbb01cd20
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:
RFAC

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts 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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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: @openzeppelin/contracts/token/ERC721/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: @openzeppelin/contracts/utils/introspection/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: @openzeppelin/contracts/utils/introspection/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: @openzeppelin/contracts/token/ERC721/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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (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 tokenId);

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


// Creators: locationtba.eth, 2pmflow.eth

pragma solidity ^0.8.10;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0; //save 15000gas starting at 1

  uint256 public immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // 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
   * `maxBatchSize` refers to how much a minter can mint at a time.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_
  ) {
    require(maxBatchSize_ > 0, "ERC721A: size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: query for 0 addy");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number mints for 0 addy"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to find owner");
  }

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

  /**
   * @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)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

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

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

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved nonexistent");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_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 override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the 0 addy");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to 0 addy");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > currentIndex - 1) {
      endIndex = currentIndex - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @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(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

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

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// File: contracts/RFAC.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;






contract RFAC is ERC721A{
  using SafeMath for uint256;
  using Strings for uint256;

  IERC20 public rfacToken;
  uint256 public priceInTokens;

  uint256 public maxSupply;
  uint256 public maxMint;
  uint256 public redrawSupply;
  uint256 public nFreeMints;
  uint256 public price;

  address payable public owner;

  string baseURI;
  uint256 public mintState;

  mapping(address => uint256) private vipList;

  mapping(uint256 => uint256) private redrawnToken;
  uint256 public nRedrawn;

  constructor() ERC721A("Royal Flush Ape Club","RFAC", 200){
      maxSupply = 8888;
      maxMint = 5;
      redrawSupply = 2222;
      nFreeMints = 1111;
      nRedrawn = 0;
      price = 0.05 ether;
      mintState = 2; //1 - paused for all, 2 - vip, 3 - public, 4 - redrawWithToken enabled , 5 - redrawWithEth enabled
      owner = payable(msg.sender);
  }

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

  function mintPublic(uint256 amt) external payable{
    require(mintState > 2, "Public sale not open.");
    if(totalSupply() > nFreeMints){
      require(msg.value == price*amt, "Incorrect Amount of Eth sent."); 
    }     
    require(totalSupply() + amt <= maxSupply, "Sorry, Sold Out");
    require(amt <= maxMint,"Too many mints per transaction");

    _safeMint(_msgSender(),amt);
  }

  function mintVIP(uint256 amt) external payable {
    require(mintState > 1, "VIP list is not active");
    require(amt <= vipList[msg.sender], "Exceeded max available to purchase");
    require(totalSupply() + amt <= maxSupply, "Purchase would exceed max tokens");
    if(totalSupply() > nFreeMints){
      require(msg.value == price*amt, "Incorrect Amount of Eth sent."); 
    }

    vipList[msg.sender] -= amt;
    _safeMint(_msgSender(),amt);
  }

  function tokenURI(uint256 tokenId)
  public
  view
  virtual
  override
  returns (string memory){
    require(_exists(tokenId),"ERC721: nonexistent token");
    

    string memory currentBaseURI = _baseURI();
                
      if(redrawnToken[tokenId]>0){
        return bytes(currentBaseURI).length > 0
          ? string(abi.encodePacked(currentBaseURI, uintToString(redrawnToken[tokenId])))
          : "";
      }else{
        return bytes(currentBaseURI).length > 0
                ? string(abi.encodePacked(currentBaseURI, uintToString(tokenId)))
                : "";
      }
  }

  function redrawWithToken(uint256 _tokenId) external payable{
    require(mintState > 3, "No redraws yet");
    require(msg.sender == ownerOf(_tokenId),"You don't own this Token");
    require(rfacToken.transferFrom(msg.sender, address(this), priceInTokens), "Error with token transfer");
    require(nRedrawn < redrawSupply,"No more cards in Deck");

    redrawnToken[_tokenId] = maxSupply + nRedrawn;
    nRedrawn++;
  }

  function uintToString(uint _i) internal pure returns (string memory _uintAsString) {
      if (_i == 0) {
          return "0";
      }
      uint j = _i;
      uint len;
      while (j != 0) {
          len++;
          j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len;
      while (_i != 0) {
          k = k-1;
          uint8 temp = (48 + uint8(_i - _i / 10 * 10));
          bytes1 b1 = bytes1(temp);
          bstr[k] = b1;
          _i /= 10;
      }
      return string(bstr);
  }

  //only owner
  modifier onlyOwner(){
      require(msg.sender == owner,"not owner");
      _;
  }

  function withdraw() external payable onlyOwner{
    uint amount = address(this).balance;

    (bool success, ) = owner.call{value: amount}("");
    require(success, "Failed to send Ether");
  }
         
  function setPrice(uint32 _newPrice) external onlyOwner {
    price = _newPrice;
  }

  function setMaxSupply(uint32 _newMax) external onlyOwner {
    maxSupply = _newMax;
  }

  function setRedrawSupply(uint32 _newSupply) external onlyOwner {
    redrawSupply = _newSupply;
  }

  function setPriceInTokens(uint32 _newPrice) external onlyOwner {
    priceInTokens = _newPrice;
  }

  function setVipList(address[] calldata _addresses, uint8 _numAllowedToMint) external onlyOwner {
    for (uint256 i = 0; i < _addresses.length; i++) {
        vipList[_addresses[i]] = _numAllowedToMint;
    }
  }

  function setBaseURI(string memory _newBaseURI) external onlyOwner {
    baseURI = _newBaseURI;
  }

  function setMintState(uint256 _state) external onlyOwner {
    mintState = _state;
  }

  function setTokenAddress(address _tokenAddress) external onlyOwner {
    rfacToken = IERC20(_tokenAddress);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"mintVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"nFreeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nRedrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceInTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redrawSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"redrawWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rfacToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newMax","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"setMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newPrice","type":"uint32"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newPrice","type":"uint32"}],"name":"setPriceInTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newSupply","type":"uint32"}],"name":"setRedrawSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8","name":"_numAllowedToMint","type":"uint8"}],"name":"setVipList","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":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60a06040526000805560006007553480156200001a57600080fd5b506040518060400160405280601481526020017f526f79616c20466c7573682041706520436c7562000000000000000000000000815250604051806040016040528060048152602001635246414360e01b81525060c860008111620000c55760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a2073697a65206d757374206265206e6f6e7a65726f000000604482015260640160405180910390fd5b8251620000da9060019060208601906200013a565b508151620000f09060029060208501906200013a565b5060805250506122b8600a556005600b556108ae600c55610457600d55600060145566b1a2bc2ec50000600e556002601155600f80546001600160a01b031916331790556200021d565b8280546200014890620001e0565b90600052602060002090601f0160209004810192826200016c5760008555620001b7565b82601f106200018757805160ff1916838001178555620001b7565b82800160010185558215620001b7579182015b82811115620001b75782518255916020019190600101906200019a565b50620001c5929150620001c9565b5090565b5b80821115620001c55760008155600101620001ca565b600181811c90821680620001f557607f821691505b602082108114156200021757634e487b7160e01b600052602260045260246000fd5b50919050565b6080516127896200024e600039600081816103ab01528181611a5901528181611a830152611e5301526127896000f3fe60806040526004361061023b5760003560e01c80636c9b98dd1161012e578063bad444da116100ab578063daafe0a51161006f578063daafe0a514610657578063dd080d7f14610677578063e985e9c51461068d578063efd0cbf9146106d6578063f9da3224146106e957600080fd5b8063bad444da146105df578063c051e38a146105f5578063c87b56dd1461060b578063d5abeb011461062b578063d7224ba01461064157600080fd5b806395d89b41116100f257806395d89b4114610554578063a035b1fe14610569578063a22cb4651461057f578063b2cbbee31461059f578063b88d4fde146105bf57600080fd5b80636c9b98dd146104c857806370a08231146104e85780637501f741146105085780638750c2d71461051e5780638da5cb5b1461053457600080fd5b80632913daa0116101bc57806342842e0e1161018057806342842e0e146104285780634f6ccce71461044857806355cd0c8e1461046857806355f804b3146104885780636352211e146104a857600080fd5b80632913daa0146103995780632f745c59146103cd578063327b0055146103ed57806338a86378146104005780633ccfd60b1461042057600080fd5b806318160ddd1161020357806318160ddd14610311578063231931bd1461033057806323b872dd1461034357806326a4e8d2146103635780632844274b1461038357600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630bb862d1146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b36600461210c565b610709565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610776565b60405161026c9190612181565b3480156102a357600080fd5b506102b76102b2366004612194565b610808565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046121c9565b610882565b005b3480156102fd57600080fd5b506102ef61030c366004612194565b61098f565b34801561031d57600080fd5b506000545b60405190815260200161026c565b6102ef61033e366004612194565b6109be565b34801561034f57600080fd5b506102ef61035e3660046121f3565b610b73565b34801561036f57600080fd5b506102ef61037e36600461222f565b610b7e565b34801561038f57600080fd5b50610322600d5481565b3480156103a557600080fd5b506103227f000000000000000000000000000000000000000000000000000000000000000081565b3480156103d957600080fd5b506103226103e83660046121c9565b610bca565b6102ef6103fb366004612194565b610d1a565b34801561040c57600080fd5b506102ef61041b36600461224a565b610f14565b6102ef610f49565b34801561043457600080fd5b506102ef6104433660046121f3565b611015565b34801561045457600080fd5b50610322610463366004612194565b611030565b34801561047457600080fd5b506008546102b7906001600160a01b031681565b34801561049457600080fd5b506102ef6104a33660046122fc565b611086565b3480156104b457600080fd5b506102b76104c3366004612194565b6110c3565b3480156104d457600080fd5b506102ef6104e3366004612345565b6110d5565b3480156104f457600080fd5b5061032261050336600461222f565b61116b565b34801561051457600080fd5b50610322600b5481565b34801561052a57600080fd5b5061032260095481565b34801561054057600080fd5b50600f546102b7906001600160a01b031681565b34801561056057600080fd5b5061028a6111e8565b34801561057557600080fd5b50610322600e5481565b34801561058b57600080fd5b506102ef61059a3660046123df565b6111f7565b3480156105ab57600080fd5b506102ef6105ba36600461224a565b6112bc565b3480156105cb57600080fd5b506102ef6105da366004612416565b6112f1565b3480156105eb57600080fd5b50610322600c5481565b34801561060157600080fd5b5061032260115481565b34801561061757600080fd5b5061028a610626366004612194565b611324565b34801561063757600080fd5b50610322600a5481565b34801561064d57600080fd5b5061032260075481565b34801561066357600080fd5b506102ef61067236600461224a565b61142c565b34801561068357600080fd5b5061032260145481565b34801561069957600080fd5b506102606106a8366004612492565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102ef6106e4366004612194565b611461565b3480156106f557600080fd5b506102ef61070436600461224a565b6115c5565b60006001600160e01b031982166380ac58cd60e01b148061073a57506001600160e01b03198216635b5e139f60e01b145b8061075557506001600160e01b0319821663780e9d6360e01b145b8061077057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610785906124c5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b1906124c5565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b5050505050905090565b6000610815826000541190565b6108665760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20617070726f766564206e6f6e6578697374656e7400000060448201526064015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061088d826110c3565b9050806001600160a01b0316836001600160a01b031614156108f15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a20617070726f76616c2063757272656e74206f776e657200604482015260640161085d565b336001600160a01b038216148061090d575061090d81336106a8565b61097f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161085d565b61098a8383836115fa565b505050565b600f546001600160a01b031633146109b95760405162461bcd60e51b815260040161085d906124fa565b601155565b600160115411610a095760405162461bcd60e51b8152602060048201526016602482015275564950206c697374206973206e6f742061637469766560501b604482015260640161085d565b33600090815260126020526040902054811115610a735760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b606482015260840161085d565b600a5481610a8060005490565b610a8a9190612533565b1115610ad85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161085d565b600d546000541115610b405780600e54610af2919061254b565b3414610b405760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b3360009081526012602052604081208054839290610b5f90849061256a565b90915550610b709050335b82611656565b50565b61098a838383611670565b600f546001600160a01b03163314610ba85760405162461bcd60e51b815260040161085d906124fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bd58361116b565b8210610c2e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161085d565b600080549080805b83811015610cd8576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c8957805192505b876001600160a01b0316836001600160a01b03161415610cc55786841415610cb75750935061077092505050565b83610cc181612581565b9450505b5080610cd081612581565b915050610c36565b5060405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c504e881d5b98589b19481d1bc819d95d60521b604482015260640161085d565b600360115411610d5d5760405162461bcd60e51b815260206004820152600e60248201526d139bc81c99591c985ddcc81e595d60921b604482015260640161085d565b610d66816110c3565b6001600160a01b0316336001600160a01b031614610dc65760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320546f6b656e0000000000000000604482015260640161085d565b6008546009546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e45919061259c565b610e915760405162461bcd60e51b815260206004820152601960248201527f4572726f72207769746820746f6b656e207472616e7366657200000000000000604482015260640161085d565b600c5460145410610edc5760405162461bcd60e51b81526020600482015260156024820152744e6f206d6f726520636172647320696e204465636b60581b604482015260640161085d565b601454600a54610eec9190612533565b6000828152601360205260408120919091556014805491610f0c83612581565b919050555050565b600f546001600160a01b03163314610f3e5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600955565b600f546001600160a01b03163314610f735760405162461bcd60e51b815260040161085d906124fa565b600f5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610fc4576040519150601f19603f3d011682016040523d82523d6000602084013e610fc9565b606091505b50509050806110115760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161085d565b5050565b61098a838383604051806020016040528060008152506112f1565b6000805482106110825760405162461bcd60e51b815260206004820152601c60248201527f455243373231413a20696e646578206f7574206f6620626f756e647300000000604482015260640161085d565b5090565b600f546001600160a01b031633146110b05760405162461bcd60e51b815260040161085d906124fa565b8051611011906010906020840190612066565b60006110ce826119ea565b5192915050565b600f546001600160a01b031633146110ff5760405162461bcd60e51b815260040161085d906124fa565b60005b82811015611165578160ff1660126000868685818110611124576111246125b9565b9050602002016020810190611139919061222f565b6001600160a01b031681526020810191909152604001600020558061115d81612581565b915050611102565b50505050565b60006001600160a01b0382166111c35760405162461bcd60e51b815260206004820152601960248201527f455243373231413a20717565727920666f722030206164647900000000000000604482015260640161085d565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b606060028054610785906124c5565b6001600160a01b0382163314156112505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161085d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f546001600160a01b031633146112e65760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600c55565b6112fc848484611670565b61130884848484611b69565b6111655760405162461bcd60e51b815260040161085d906125cf565b6060611331826000541190565b61137d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161085d565b6000611387611c68565b600084815260136020526040902054909150156113fe5760008151116113bc57604051806020016040528060008152506113f7565b60008381526013602052604090205481906113d690611c77565b6040516020016113e7929190612622565b6040516020818303038152906040525b9392505050565b600081511161141c57604051806020016040528060008152506113f7565b806113d684611c77565b50919050565b600f546001600160a01b031633146114565760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600e55565b6002601154116114ab5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19039b0b632903737ba1037b832b71760591b604482015260640161085d565b600d5460005411156115135780600e546114c5919061254b565b34146115135760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b600a548161152060005490565b61152a9190612533565b111561156a5760405162461bcd60e51b815260206004820152600f60248201526e14dbdc9c9e4b0814dbdb190813dd5d608a1b604482015260640161085d565b600b548111156115bc5760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d616e79206d696e747320706572207472616e73616374696f6e0000604482015260640161085d565b610b7033610b6a565b600f546001600160a01b031633146115ef5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600a55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611011828260405180602001604052806000815250611da0565b600061167b826119ea565b80519091506000906001600160a01b0316336001600160a01b031614806116b25750336116a784610808565b6001600160a01b0316145b806116c4575081516116c490336106a8565b90508061172e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161085d565b846001600160a01b031682600001516001600160a01b0316146117a25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161085d565b6001600160a01b0384166117f85760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a207472616e7366657220746f203020616464790000000000604482015260640161085d565b61180860008484600001516115fa565b6001600160a01b038516600090815260046020526040812080546001929061183a9084906001600160801b0316612651565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261188691859116612679565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561190e846001612533565b6000818152600360205260409020549091506001600160a01b03166119a057611938816000541190565b156119a05760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611a09826000541190565b611a555760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a206e6f6e6578697374656e7420746f6b656e000000000000604482015260640161085d565b60007f00000000000000000000000000000000000000000000000000000000000000008310611ab657611aa87f00000000000000000000000000000000000000000000000000000000000000008461256a565b611ab3906001612533565b90505b825b818110611b20576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b0d57949350505050565b5080611b188161269b565b915050611ab8565b5060405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20756e61626c6520746f2066696e64206f776e6572000000604482015260640161085d565b60006001600160a01b0384163b15611c5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bad9033908990889088906004016126b2565b6020604051808303816000875af1925050508015611be8575060408051601f3d908101601f19168201909252611be5918101906126ef565b60015b611c42573d808015611c16576040519150601f19603f3d011682016040523d82523d6000602084013e611c1b565b606091505b508051611c3a5760405162461bcd60e51b815260040161085d906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c60565b5060015b949350505050565b606060108054610785906124c5565b606081611c9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc55780611caf81612581565b9150611cbe9050600a8361270c565b9150611c9f565b60008167ffffffffffffffff811115611ce057611ce0612270565b6040519080825280601f01601f191660200182016040528015611d0a576020820181803683370190505b509050815b8515611d9757611d2060018261256a565b90506000611d2f600a8861270c565b611d3a90600a61254b565b611d44908861256a565b611d4f90603061272e565b905060008160f81b905080848481518110611d6c57611d6c6125b9565b60200101906001600160f81b031916908160001a905350611d8e600a8961270c565b97505050611d0f565b50949350505050565b6000546001600160a01b038416611df95760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a206d696e7420746f20746865203020616464790000000000604482015260640161085d565b611e04816000541190565b15611e515760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161085d565b7f0000000000000000000000000000000000000000000000000000000000000000831115611ec15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a207175616e74697479206d696e7420746f6f206869676800604482015260640161085d565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611f1d908790612679565b6001600160801b03168152602001858360200151611f3b9190612679565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561205b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461201f6000888488611b69565b61203b5760405162461bcd60e51b815260040161085d906125cf565b8161204581612581565b925050808061205390612581565b915050611fd2565b5060008190556119e2565b828054612072906124c5565b90600052602060002090601f01602090048101928261209457600085556120da565b82601f106120ad57805160ff19168380011785556120da565b828001600101855582156120da579182015b828111156120da5782518255916020019190600101906120bf565b506110829291505b8082111561108257600081556001016120e2565b6001600160e01b031981168114610b7057600080fd5b60006020828403121561211e57600080fd5b81356113f7816120f6565b60005b8381101561214457818101518382015260200161212c565b838111156111655750506000910152565b6000815180845261216d816020860160208601612129565b601f01601f19169290920160200192915050565b6020815260006113f76020830184612155565b6000602082840312156121a657600080fd5b5035919050565b80356001600160a01b03811681146121c457600080fd5b919050565b600080604083850312156121dc57600080fd5b6121e5836121ad565b946020939093013593505050565b60008060006060848603121561220857600080fd5b612211846121ad565b925061221f602085016121ad565b9150604084013590509250925092565b60006020828403121561224157600080fd5b6113f7826121ad565b60006020828403121561225c57600080fd5b813563ffffffff811681146113f757600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122a1576122a1612270565b604051601f8501601f19908116603f011681019082821181831017156122c9576122c9612270565b816040528093508581528686860111156122e257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561230e57600080fd5b813567ffffffffffffffff81111561232557600080fd5b8201601f8101841361233657600080fd5b611c6084823560208401612286565b60008060006040848603121561235a57600080fd5b833567ffffffffffffffff8082111561237257600080fd5b818601915086601f83011261238657600080fd5b81358181111561239557600080fd5b8760208260051b85010111156123aa57600080fd5b6020928301955093505084013560ff811681146123c657600080fd5b809150509250925092565b8015158114610b7057600080fd5b600080604083850312156123f257600080fd5b6123fb836121ad565b9150602083013561240b816123d1565b809150509250929050565b6000806000806080858703121561242c57600080fd5b612435856121ad565b9350612443602086016121ad565b925060408501359150606085013567ffffffffffffffff81111561246657600080fd5b8501601f8101871361247757600080fd5b61248687823560208401612286565b91505092959194509250565b600080604083850312156124a557600080fd5b6124ae836121ad565b91506124bc602084016121ad565b90509250929050565b600181811c908216806124d957607f821691505b6020821081141561142657634e487b7160e01b600052602260045260246000fd5b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125465761254661251d565b500190565b60008160001904831182151516156125655761256561251d565b500290565b60008282101561257c5761257c61251d565b500390565b60006000198214156125955761259561251d565b5060010190565b6000602082840312156125ae57600080fd5b81516113f7816123d1565b634e487b7160e01b600052603260045260246000fd5b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351612634818460208801612129565b835190830190612648818360208801612129565b01949350505050565b60006001600160801b03838116908316818110156126715761267161251d565b039392505050565b60006001600160801b038083168185168083038211156126485761264861251d565b6000816126aa576126aa61251d565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e590830184612155565b9695505050505050565b60006020828403121561270157600080fd5b81516113f7816120f6565b60008261272957634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561274b5761274b61251d565b01939250505056fea264697066735822122086f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad91464736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636c9b98dd1161012e578063bad444da116100ab578063daafe0a51161006f578063daafe0a514610657578063dd080d7f14610677578063e985e9c51461068d578063efd0cbf9146106d6578063f9da3224146106e957600080fd5b8063bad444da146105df578063c051e38a146105f5578063c87b56dd1461060b578063d5abeb011461062b578063d7224ba01461064157600080fd5b806395d89b41116100f257806395d89b4114610554578063a035b1fe14610569578063a22cb4651461057f578063b2cbbee31461059f578063b88d4fde146105bf57600080fd5b80636c9b98dd146104c857806370a08231146104e85780637501f741146105085780638750c2d71461051e5780638da5cb5b1461053457600080fd5b80632913daa0116101bc57806342842e0e1161018057806342842e0e146104285780634f6ccce71461044857806355cd0c8e1461046857806355f804b3146104885780636352211e146104a857600080fd5b80632913daa0146103995780632f745c59146103cd578063327b0055146103ed57806338a86378146104005780633ccfd60b1461042057600080fd5b806318160ddd1161020357806318160ddd14610311578063231931bd1461033057806323b872dd1461034357806326a4e8d2146103635780632844274b1461038357600080fd5b806301ffc9a71461024057806306fdde0314610275578063081812fc14610297578063095ea7b3146102cf5780630bb862d1146102f1575b600080fd5b34801561024c57600080fd5b5061026061025b36600461210c565b610709565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a610776565b60405161026c9190612181565b3480156102a357600080fd5b506102b76102b2366004612194565b610808565b6040516001600160a01b03909116815260200161026c565b3480156102db57600080fd5b506102ef6102ea3660046121c9565b610882565b005b3480156102fd57600080fd5b506102ef61030c366004612194565b61098f565b34801561031d57600080fd5b506000545b60405190815260200161026c565b6102ef61033e366004612194565b6109be565b34801561034f57600080fd5b506102ef61035e3660046121f3565b610b73565b34801561036f57600080fd5b506102ef61037e36600461222f565b610b7e565b34801561038f57600080fd5b50610322600d5481565b3480156103a557600080fd5b506103227f00000000000000000000000000000000000000000000000000000000000000c881565b3480156103d957600080fd5b506103226103e83660046121c9565b610bca565b6102ef6103fb366004612194565b610d1a565b34801561040c57600080fd5b506102ef61041b36600461224a565b610f14565b6102ef610f49565b34801561043457600080fd5b506102ef6104433660046121f3565b611015565b34801561045457600080fd5b50610322610463366004612194565b611030565b34801561047457600080fd5b506008546102b7906001600160a01b031681565b34801561049457600080fd5b506102ef6104a33660046122fc565b611086565b3480156104b457600080fd5b506102b76104c3366004612194565b6110c3565b3480156104d457600080fd5b506102ef6104e3366004612345565b6110d5565b3480156104f457600080fd5b5061032261050336600461222f565b61116b565b34801561051457600080fd5b50610322600b5481565b34801561052a57600080fd5b5061032260095481565b34801561054057600080fd5b50600f546102b7906001600160a01b031681565b34801561056057600080fd5b5061028a6111e8565b34801561057557600080fd5b50610322600e5481565b34801561058b57600080fd5b506102ef61059a3660046123df565b6111f7565b3480156105ab57600080fd5b506102ef6105ba36600461224a565b6112bc565b3480156105cb57600080fd5b506102ef6105da366004612416565b6112f1565b3480156105eb57600080fd5b50610322600c5481565b34801561060157600080fd5b5061032260115481565b34801561061757600080fd5b5061028a610626366004612194565b611324565b34801561063757600080fd5b50610322600a5481565b34801561064d57600080fd5b5061032260075481565b34801561066357600080fd5b506102ef61067236600461224a565b61142c565b34801561068357600080fd5b5061032260145481565b34801561069957600080fd5b506102606106a8366004612492565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6102ef6106e4366004612194565b611461565b3480156106f557600080fd5b506102ef61070436600461224a565b6115c5565b60006001600160e01b031982166380ac58cd60e01b148061073a57506001600160e01b03198216635b5e139f60e01b145b8061075557506001600160e01b0319821663780e9d6360e01b145b8061077057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610785906124c5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b1906124c5565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b5050505050905090565b6000610815826000541190565b6108665760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20617070726f766564206e6f6e6578697374656e7400000060448201526064015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b600061088d826110c3565b9050806001600160a01b0316836001600160a01b031614156108f15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a20617070726f76616c2063757272656e74206f776e657200604482015260640161085d565b336001600160a01b038216148061090d575061090d81336106a8565b61097f5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161085d565b61098a8383836115fa565b505050565b600f546001600160a01b031633146109b95760405162461bcd60e51b815260040161085d906124fa565b601155565b600160115411610a095760405162461bcd60e51b8152602060048201526016602482015275564950206c697374206973206e6f742061637469766560501b604482015260640161085d565b33600090815260126020526040902054811115610a735760405162461bcd60e51b815260206004820152602260248201527f4578636565646564206d617820617661696c61626c6520746f20707572636861604482015261736560f01b606482015260840161085d565b600a5481610a8060005490565b610a8a9190612533565b1115610ad85760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820746f6b656e73604482015260640161085d565b600d546000541115610b405780600e54610af2919061254b565b3414610b405760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b3360009081526012602052604081208054839290610b5f90849061256a565b90915550610b709050335b82611656565b50565b61098a838383611670565b600f546001600160a01b03163314610ba85760405162461bcd60e51b815260040161085d906124fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000610bd58361116b565b8210610c2e5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b606482015260840161085d565b600080549080805b83811015610cd8576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610c8957805192505b876001600160a01b0316836001600160a01b03161415610cc55786841415610cb75750935061077092505050565b83610cc181612581565b9450505b5080610cd081612581565b915050610c36565b5060405162461bcd60e51b8152602060048201526016602482015275115490cdcc8c504e881d5b98589b19481d1bc819d95d60521b604482015260640161085d565b600360115411610d5d5760405162461bcd60e51b815260206004820152600e60248201526d139bc81c99591c985ddcc81e595d60921b604482015260640161085d565b610d66816110c3565b6001600160a01b0316336001600160a01b031614610dc65760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e2774206f776e207468697320546f6b656e0000000000000000604482015260640161085d565b6008546009546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610e21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e45919061259c565b610e915760405162461bcd60e51b815260206004820152601960248201527f4572726f72207769746820746f6b656e207472616e7366657200000000000000604482015260640161085d565b600c5460145410610edc5760405162461bcd60e51b81526020600482015260156024820152744e6f206d6f726520636172647320696e204465636b60581b604482015260640161085d565b601454600a54610eec9190612533565b6000828152601360205260408120919091556014805491610f0c83612581565b919050555050565b600f546001600160a01b03163314610f3e5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600955565b600f546001600160a01b03163314610f735760405162461bcd60e51b815260040161085d906124fa565b600f5460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610fc4576040519150601f19603f3d011682016040523d82523d6000602084013e610fc9565b606091505b50509050806110115760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b604482015260640161085d565b5050565b61098a838383604051806020016040528060008152506112f1565b6000805482106110825760405162461bcd60e51b815260206004820152601c60248201527f455243373231413a20696e646578206f7574206f6620626f756e647300000000604482015260640161085d565b5090565b600f546001600160a01b031633146110b05760405162461bcd60e51b815260040161085d906124fa565b8051611011906010906020840190612066565b60006110ce826119ea565b5192915050565b600f546001600160a01b031633146110ff5760405162461bcd60e51b815260040161085d906124fa565b60005b82811015611165578160ff1660126000868685818110611124576111246125b9565b9050602002016020810190611139919061222f565b6001600160a01b031681526020810191909152604001600020558061115d81612581565b915050611102565b50505050565b60006001600160a01b0382166111c35760405162461bcd60e51b815260206004820152601960248201527f455243373231413a20717565727920666f722030206164647900000000000000604482015260640161085d565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b606060028054610785906124c5565b6001600160a01b0382163314156112505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161085d565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600f546001600160a01b031633146112e65760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600c55565b6112fc848484611670565b61130884848484611b69565b6111655760405162461bcd60e51b815260040161085d906125cf565b6060611331826000541190565b61137d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161085d565b6000611387611c68565b600084815260136020526040902054909150156113fe5760008151116113bc57604051806020016040528060008152506113f7565b60008381526013602052604090205481906113d690611c77565b6040516020016113e7929190612622565b6040516020818303038152906040525b9392505050565b600081511161141c57604051806020016040528060008152506113f7565b806113d684611c77565b50919050565b600f546001600160a01b031633146114565760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600e55565b6002601154116114ab5760405162461bcd60e51b8152602060048201526015602482015274283ab13634b19039b0b632903737ba1037b832b71760591b604482015260640161085d565b600d5460005411156115135780600e546114c5919061254b565b34146115135760405162461bcd60e51b815260206004820152601d60248201527f496e636f727265637420416d6f756e74206f66204574682073656e742e000000604482015260640161085d565b600a548161152060005490565b61152a9190612533565b111561156a5760405162461bcd60e51b815260206004820152600f60248201526e14dbdc9c9e4b0814dbdb190813dd5d608a1b604482015260640161085d565b600b548111156115bc5760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d616e79206d696e747320706572207472616e73616374696f6e0000604482015260640161085d565b610b7033610b6a565b600f546001600160a01b031633146115ef5760405162461bcd60e51b815260040161085d906124fa565b63ffffffff16600a55565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611011828260405180602001604052806000815250611da0565b600061167b826119ea565b80519091506000906001600160a01b0316336001600160a01b031614806116b25750336116a784610808565b6001600160a01b0316145b806116c4575081516116c490336106a8565b90508061172e5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161085d565b846001600160a01b031682600001516001600160a01b0316146117a25760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b606482015260840161085d565b6001600160a01b0384166117f85760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a207472616e7366657220746f203020616464790000000000604482015260640161085d565b61180860008484600001516115fa565b6001600160a01b038516600090815260046020526040812080546001929061183a9084906001600160801b0316612651565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600460205260408120805460019450909261188691859116612679565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b0319909116919092161717905561190e846001612533565b6000818152600360205260409020549091506001600160a01b03166119a057611938816000541190565b156119a05760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611a09826000541190565b611a555760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a206e6f6e6578697374656e7420746f6b656e000000000000604482015260640161085d565b60007f00000000000000000000000000000000000000000000000000000000000000c88310611ab657611aa87f00000000000000000000000000000000000000000000000000000000000000c88461256a565b611ab3906001612533565b90505b825b818110611b20576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215611b0d57949350505050565b5080611b188161269b565b915050611ab8565b5060405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20756e61626c6520746f2066696e64206f776e6572000000604482015260640161085d565b60006001600160a01b0384163b15611c5c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611bad9033908990889088906004016126b2565b6020604051808303816000875af1925050508015611be8575060408051601f3d908101601f19168201909252611be5918101906126ef565b60015b611c42573d808015611c16576040519150601f19603f3d011682016040523d82523d6000602084013e611c1b565b606091505b508051611c3a5760405162461bcd60e51b815260040161085d906125cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c60565b5060015b949350505050565b606060108054610785906124c5565b606081611c9b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611cc55780611caf81612581565b9150611cbe9050600a8361270c565b9150611c9f565b60008167ffffffffffffffff811115611ce057611ce0612270565b6040519080825280601f01601f191660200182016040528015611d0a576020820181803683370190505b509050815b8515611d9757611d2060018261256a565b90506000611d2f600a8861270c565b611d3a90600a61254b565b611d44908861256a565b611d4f90603061272e565b905060008160f81b905080848481518110611d6c57611d6c6125b9565b60200101906001600160f81b031916908160001a905350611d8e600a8961270c565b97505050611d0f565b50949350505050565b6000546001600160a01b038416611df95760405162461bcd60e51b815260206004820152601b60248201527f455243373231413a206d696e7420746f20746865203020616464790000000000604482015260640161085d565b611e04816000541190565b15611e515760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161085d565b7f00000000000000000000000000000000000000000000000000000000000000c8831115611ec15760405162461bcd60e51b815260206004820152601f60248201527f455243373231413a207175616e74697479206d696e7420746f6f206869676800604482015260640161085d565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611f1d908790612679565b6001600160801b03168152602001858360200151611f3b9190612679565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b8581101561205b5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461201f6000888488611b69565b61203b5760405162461bcd60e51b815260040161085d906125cf565b8161204581612581565b925050808061205390612581565b915050611fd2565b5060008190556119e2565b828054612072906124c5565b90600052602060002090601f01602090048101928261209457600085556120da565b82601f106120ad57805160ff19168380011785556120da565b828001600101855582156120da579182015b828111156120da5782518255916020019190600101906120bf565b506110829291505b8082111561108257600081556001016120e2565b6001600160e01b031981168114610b7057600080fd5b60006020828403121561211e57600080fd5b81356113f7816120f6565b60005b8381101561214457818101518382015260200161212c565b838111156111655750506000910152565b6000815180845261216d816020860160208601612129565b601f01601f19169290920160200192915050565b6020815260006113f76020830184612155565b6000602082840312156121a657600080fd5b5035919050565b80356001600160a01b03811681146121c457600080fd5b919050565b600080604083850312156121dc57600080fd5b6121e5836121ad565b946020939093013593505050565b60008060006060848603121561220857600080fd5b612211846121ad565b925061221f602085016121ad565b9150604084013590509250925092565b60006020828403121561224157600080fd5b6113f7826121ad565b60006020828403121561225c57600080fd5b813563ffffffff811681146113f757600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156122a1576122a1612270565b604051601f8501601f19908116603f011681019082821181831017156122c9576122c9612270565b816040528093508581528686860111156122e257600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561230e57600080fd5b813567ffffffffffffffff81111561232557600080fd5b8201601f8101841361233657600080fd5b611c6084823560208401612286565b60008060006040848603121561235a57600080fd5b833567ffffffffffffffff8082111561237257600080fd5b818601915086601f83011261238657600080fd5b81358181111561239557600080fd5b8760208260051b85010111156123aa57600080fd5b6020928301955093505084013560ff811681146123c657600080fd5b809150509250925092565b8015158114610b7057600080fd5b600080604083850312156123f257600080fd5b6123fb836121ad565b9150602083013561240b816123d1565b809150509250929050565b6000806000806080858703121561242c57600080fd5b612435856121ad565b9350612443602086016121ad565b925060408501359150606085013567ffffffffffffffff81111561246657600080fd5b8501601f8101871361247757600080fd5b61248687823560208401612286565b91505092959194509250565b600080604083850312156124a557600080fd5b6124ae836121ad565b91506124bc602084016121ad565b90509250929050565b600181811c908216806124d957607f821691505b6020821081141561142657634e487b7160e01b600052602260045260246000fd5b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125465761254661251d565b500190565b60008160001904831182151516156125655761256561251d565b500290565b60008282101561257c5761257c61251d565b500390565b60006000198214156125955761259561251d565b5060010190565b6000602082840312156125ae57600080fd5b81516113f7816123d1565b634e487b7160e01b600052603260045260246000fd5b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351612634818460208801612129565b835190830190612648818360208801612129565b01949350505050565b60006001600160801b03838116908316818110156126715761267161251d565b039392505050565b60006001600160801b038083168185168083038211156126485761264861251d565b6000816126aa576126aa61251d565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126e590830184612155565b9695505050505050565b60006020828403121561270157600080fd5b81516113f7816120f6565b60008261272957634e487b7160e01b600052601260045260246000fd5b500490565b600060ff821660ff84168060ff0382111561274b5761274b61251d565b01939250505056fea264697066735822122086f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad91464736f6c634300080a0033

Deployed Bytecode Sourcemap

48946:4723:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36738:370;;;;;;;;;;-1:-1:-1;36738:370:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;36738:370:0;;;;;;;;38395:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39917:188::-;;;;;;;;;;-1:-1:-1;39917:188:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;39917:188:0;1528:203:1;39483:376:0;;;;;;;;;;-1:-1:-1;39483:376:0;;;;;:::i;:::-;;:::i;:::-;;53459:88;;;;;;;;;;-1:-1:-1;53459:88:0;;;;;:::i;:::-;;:::i;35333:94::-;;;;;;;;;;-1:-1:-1;35386:7:0;35409:12;35333:94;;;2319:25:1;;;2307:2;2292:18;35333:94:0;2173:177:1;50349:459:0;;;;;;:::i;:::-;;:::i;40751:142::-;;;;;;;;;;-1:-1:-1;40751:142:0;;;;;:::i;:::-;;:::i;53553:113::-;;;;;;;;;;-1:-1:-1;53553:113:0;;;;;:::i;:::-;;:::i;49189:25::-;;;;;;;;;;;;;;;;34221:37;;;;;;;;;;;;;;;35954:720;;;;;;;;;;-1:-1:-1;35954:720:0;;;;;:::i;:::-;;:::i;51433:429::-;;;;;;:::i;:::-;;:::i;53024:101::-;;;;;;;;;;-1:-1:-1;53024:101:0;;;;;:::i;:::-;;:::i;52518:198::-;;;:::i;40956:157::-;;;;;;;;;;-1:-1:-1;40956:157:0;;;;;:::i;:::-;;:::i;35496:170::-;;;;;;;;;;-1:-1:-1;35496:170:0;;;;;:::i;:::-;;:::i;49038:23::-;;;;;;;;;;-1:-1:-1;49038:23:0;;;;-1:-1:-1;;;;;49038:23:0;;;53353:100;;;;;;;;;;-1:-1:-1;53353:100:0;;;;;:::i;:::-;;:::i;38218:118::-;;;;;;;;;;-1:-1:-1;38218:118:0;;;;;:::i;:::-;;:::i;53131:216::-;;;;;;;;;;-1:-1:-1;53131:216:0;;;;;:::i;:::-;;:::i;37164:193::-;;;;;;;;;;-1:-1:-1;37164:193:0;;;;;:::i;:::-;;:::i;49130:22::-;;;;;;;;;;;;;;;;49066:28;;;;;;;;;;;;;;;;49246;;;;;;;;;;-1:-1:-1;49246:28:0;;;;-1:-1:-1;;;;;49246:28:0;;;38550:98;;;;;;;;;;;;;:::i;49219:20::-;;;;;;;;;;;;;;;;40169:274;;;;;;;;;;-1:-1:-1;40169:274:0;;;;;:::i;:::-;;:::i;52917:101::-;;;;;;;;;;-1:-1:-1;52917:101:0;;;;;:::i;:::-;;:::i;41176:311::-;;;;;;;;;;-1:-1:-1;41176:311:0;;;;;:::i;:::-;;:::i;49157:27::-;;;;;;;;;;;;;;;;49300:24;;;;;;;;;;;;;;;;50814:613;;;;;;;;;;-1:-1:-1;50814:613:0;;;;;:::i;:::-;;:::i;49101:24::-;;;;;;;;;;;;;;;;45488:43;;;;;;;;;;;;;;;;52731:85;;;;;;;;;;-1:-1:-1;52731:85:0;;;;;:::i;:::-;;:::i;49434:23::-;;;;;;;;;;;;;;;;40506:186;;;;;;;;;;-1:-1:-1;40506:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;40651:25:0;;;40628:4;40651:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40506:186;49945:398;;;;;;:::i;:::-;;:::i;52822:89::-;;;;;;;;;;-1:-1:-1;52822:89:0;;;;;:::i;:::-;;:::i;36738:370::-;36865:4;-1:-1:-1;;;;;;36895:40:0;;-1:-1:-1;;;36895:40:0;;:99;;-1:-1:-1;;;;;;;36946:48:0;;-1:-1:-1;;;36946:48:0;36895:99;:160;;;-1:-1:-1;;;;;;;37005:50:0;;-1:-1:-1;;;37005:50:0;36895:160;:207;;;-1:-1:-1;;;;;;;;;;26543:40:0;;;37066:36;36881:221;36738:370;-1:-1:-1;;36738:370:0:o;38395:94::-;38449:13;38478:5;38471:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38395:94;:::o;39917:188::-;39985:7;40009:16;40017:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;40009:16;40001:58;;;;-1:-1:-1;;;40001:58:0;;7580:2:1;40001:58:0;;;7562:21:1;7619:2;7599:18;;;7592:30;7658:31;7638:18;;;7631:59;7707:18;;40001:58:0;;;;;;;;;-1:-1:-1;40075:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40075:24:0;;39917:188::o;39483:376::-;39552:13;39568:24;39584:7;39568:15;:24::i;:::-;39552:40;;39613:5;-1:-1:-1;;;;;39607:11:0;:2;-1:-1:-1;;;;;39607:11:0;;;39599:55;;;;-1:-1:-1;;;39599:55:0;;7938:2:1;39599:55:0;;;7920:21:1;7977:2;7957:18;;;7950:30;8016:33;7996:18;;;7989:61;8067:18;;39599:55:0;7736:355:1;39599:55:0;12806:10;-1:-1:-1;;;;;39679:21:0;;;;:62;;-1:-1:-1;39704:37:0;39721:5;12806:10;40506:186;:::i;39704:37::-;39663:153;;;;-1:-1:-1;;;39663:153:0;;8298:2:1;39663:153:0;;;8280:21:1;8337:2;8317:18;;;8310:30;8376:34;8356:18;;;8349:62;8447:27;8427:18;;;8420:55;8492:19;;39663:153:0;8096:421:1;39663:153:0;39825:28;39834:2;39838:7;39847:5;39825:8;:28::i;:::-;39545:314;39483:376;;:::o;53459:88::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53523:9:::1;:18:::0;53459:88::o;50349:459::-;50423:1;50411:9;;:13;50403:48;;;;-1:-1:-1;;;50403:48:0;;9061:2:1;50403:48:0;;;9043:21:1;9100:2;9080:18;;;9073:30;-1:-1:-1;;;9119:18:1;;;9112:52;9181:18;;50403:48:0;8859:346:1;50403:48:0;50481:10;50473:19;;;;:7;:19;;;;;;50466:26;;;50458:73;;;;-1:-1:-1;;;50458:73:0;;9412:2:1;50458:73:0;;;9394:21:1;9451:2;9431:18;;;9424:30;9490:34;9470:18;;;9463:62;-1:-1:-1;;;9541:18:1;;;9534:32;9583:19;;50458:73:0;9210:398:1;50458:73:0;50569:9;;50562:3;50546:13;35386:7;35409:12;;35333:94;50546:13;:19;;;;:::i;:::-;:32;;50538:77;;;;-1:-1:-1;;;50538:77:0;;10080:2:1;50538:77:0;;;10062:21:1;;;10099:18;;;10092:30;10158:34;10138:18;;;10131:62;10210:18;;50538:77:0;9878:356:1;50538:77:0;50641:10;;35386:7;35409:12;50625:26;50622:112;;;50688:3;50682:5;;:9;;;;:::i;:::-;50669;:22;50661:64;;;;-1:-1:-1;;;50661:64:0;;10614:2:1;50661:64:0;;;10596:21:1;10653:2;10633:18;;;10626:30;10692:31;10672:18;;;10665:59;10741:18;;50661:64:0;10412:353:1;50661:64:0;50750:10;50742:19;;;;:7;:19;;;;;:26;;50765:3;;50742:19;:26;;50765:3;;50742:26;:::i;:::-;;;;-1:-1:-1;50775:27:0;;-1:-1:-1;12806:10:0;50785:12;50798:3;50775:9;:27::i;:::-;50349:459;:::o;40751:142::-;40859:28;40869:4;40875:2;40879:7;40859:9;:28::i;53553:113::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53627:9:::1;:33:::0;;-1:-1:-1;;;;;;53627:33:0::1;-1:-1:-1::0;;;;;53627:33:0;;;::::1;::::0;;;::::1;::::0;;53553:113::o;35954:720::-;36063:7;36098:16;36108:5;36098:9;:16::i;:::-;36090:5;:24;36082:71;;;;-1:-1:-1;;;36082:71:0;;11102:2:1;36082:71:0;;;11084:21:1;11141:2;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;-1:-1:-1;;;11231:18:1;;;11224:32;11273:19;;36082:71:0;10900:398:1;36082:71:0;36160:22;35409:12;;;36160:22;;36280:350;36304:14;36300:1;:18;36280:350;;;36334:31;36368:14;;;:11;:14;;;;;;;;;36334:48;;;;;;;;;-1:-1:-1;;;;;36334:48:0;;;;;-1:-1:-1;;;36334:48:0;;;;;;;;;;;;36395:28;36391:89;;36456:14;;;-1:-1:-1;36391:89:0;36513:5;-1:-1:-1;;;;;36492:26:0;:17;-1:-1:-1;;;;;36492:26:0;;36488:135;;;36550:5;36535:11;:20;36531:59;;;-1:-1:-1;36577:1:0;-1:-1:-1;36570:8:0;;-1:-1:-1;;;36570:8:0;36531:59;36600:13;;;;:::i;:::-;;;;36488:135;-1:-1:-1;36320:3:0;;;;:::i;:::-;;;;36280:350;;;-1:-1:-1;36636:32:0;;-1:-1:-1;;;36636:32:0;;11645:2:1;36636:32:0;;;11627:21:1;11684:2;11664:18;;;11657:30;-1:-1:-1;;;11703:18:1;;;11696:52;11765:18;;36636:32:0;11443:346:1;51433:429:0;51519:1;51507:9;;:13;51499:40;;;;-1:-1:-1;;;51499:40:0;;11996:2:1;51499:40:0;;;11978:21:1;12035:2;12015:18;;;12008:30;-1:-1:-1;;;12054:18:1;;;12047:44;12108:18;;51499:40:0;11794:338:1;51499:40:0;51568:17;51576:8;51568:7;:17::i;:::-;-1:-1:-1;;;;;51554:31:0;:10;-1:-1:-1;;;;;51554:31:0;;51546:67;;;;-1:-1:-1;;;51546:67:0;;12339:2:1;51546:67:0;;;12321:21:1;12378:2;12358:18;;;12351:30;12417:26;12397:18;;;12390:54;12461:18;;51546:67:0;12137:348:1;51546:67:0;51628:9;;51678:13;;51628:64;;-1:-1:-1;;;51628:64:0;;51651:10;51628:64;;;12730:34:1;51671:4:0;12780:18:1;;;12773:43;12832:18;;;12825:34;;;;-1:-1:-1;;;;;51628:9:0;;;;:22;;12665:18:1;;51628:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51620:102;;;;-1:-1:-1;;;51620:102:0;;13322:2:1;51620:102:0;;;13304:21:1;13361:2;13341:18;;;13334:30;13400:27;13380:18;;;13373:55;13445:18;;51620:102:0;13120:349:1;51620:102:0;51748:12;;51737:8;;:23;51729:56;;;;-1:-1:-1;;;51729:56:0;;13676:2:1;51729:56:0;;;13658:21:1;13715:2;13695:18;;;13688:30;-1:-1:-1;;;13734:18:1;;;13727:51;13795:18;;51729:56:0;13474:345:1;51729:56:0;51831:8;;51819:9;;:20;;;;:::i;:::-;51794:22;;;;:12;:22;;;;;:45;;;;51846:8;:10;;;;;;:::i;:::-;;;;;;51433:429;:::o;53024:101::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53094:25:::1;;:13;:25:::0;53024:101::o;52518:198::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52634:5:::1;::::0;:29:::1;::::0;52585:21:::1;::::0;52571:11:::1;::::0;-1:-1:-1;;;;;52634:5:0;;::::1;::::0;52585:21;;52571:11;52634:29;52571:11;52634:29;52585:21;52634:5;:29:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52615:48;;;52678:7;52670:40;;;::::0;-1:-1:-1;;;52670:40:0;;14236:2:1;52670:40:0::1;::::0;::::1;14218:21:1::0;14275:2;14255:18;;;14248:30;-1:-1:-1;;;14294:18:1;;;14287:50;14354:18;;52670:40:0::1;14034:344:1::0;52670:40:0::1;52564:152;;52518:198::o:0;40956:157::-;41068:39;41085:4;41091:2;41095:7;41068:39;;;;;;;;;;;;:16;:39::i;35496:170::-;35563:7;35409:12;;35587:5;:21;35579:62;;;;-1:-1:-1;;;35579:62:0;;14585:2:1;35579:62:0;;;14567:21:1;14624:2;14604:18;;;14597:30;14663;14643:18;;;14636:58;14711:18;;35579:62:0;14383:352:1;35579:62:0;-1:-1:-1;35655:5:0;35496:170::o;53353:100::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53426:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;38218:118::-:0;38282:7;38305:20;38317:7;38305:11;:20::i;:::-;:25;;38218:118;-1:-1:-1;;38218:118:0:o;53131:216::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;53238:9:::1;53233:109;53253:21:::0;;::::1;53233:109;;;53317:17;53292:42;;:7;:22;53300:10;;53311:1;53300:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53292:22:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;53292:22:0;:42;53276:3;::::1;::::0;::::1;:::i;:::-;;;;53233:109;;;;53131:216:::0;;;:::o;37164:193::-;37228:7;-1:-1:-1;;;;;37252:19:0;;37244:57;;;;-1:-1:-1;;;37244:57:0;;15074:2:1;37244:57:0;;;15056:21:1;15113:2;15093:18;;;15086:30;15152:27;15132:18;;;15125:55;15197:18;;37244:57:0;14872:349:1;37244:57:0;-1:-1:-1;;;;;;37323:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;37323:27:0;;37164:193::o;38550:98::-;38606:13;38635:7;38628:14;;;;;:::i;40169:274::-;-1:-1:-1;;;;;40260:24:0;;12806:10;40260:24;;40252:63;;;;-1:-1:-1;;;40252:63:0;;15428:2:1;40252:63:0;;;15410:21:1;15467:2;15447:18;;;15440:30;15506:28;15486:18;;;15479:56;15552:18;;40252:63:0;15226:350:1;40252:63:0;12806:10;40324:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40324:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40324:53:0;;;;;;;;;;40389:48;;540:41:1;;;40324:42:0;;12806:10;40389:48;;513:18:1;40389:48:0;;;;;;;40169:274;;:::o;52917:101::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52987:25:::1;;:12;:25:::0;52917:101::o;41176:311::-;41313:28;41323:4;41329:2;41333:7;41313:9;:28::i;:::-;41364:48;41387:4;41393:2;41397:7;41406:5;41364:22;:48::i;:::-;41348:133;;;;-1:-1:-1;;;41348:133:0;;;;;;;:::i;50814:613::-;50902:13;50931:16;50939:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;50931:16;50923:53;;;;-1:-1:-1;;;50923:53:0;;16203:2:1;50923:53:0;;;16185:21:1;16242:2;16222:18;;;16215:30;16281:27;16261:18;;;16254:55;16326:18;;50923:53:0;16001:349:1;50923:53:0;50991:28;51022:10;:8;:10::i;:::-;51084:1;51062:21;;;:12;:21;;;;;;50991:41;;-1:-1:-1;51062:23:0;51059:363;;51135:1;51110:14;51104:28;:32;:139;;;;;;;;;;;;;;;;;51203:21;;;;:12;:21;;;;;;51174:14;;51190:35;;:12;:35::i;:::-;51157:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51104:139;51097:146;50814:613;-1:-1:-1;;;50814:613:0:o;51059:363::-;51306:1;51281:14;51275:28;:32;:137;;;;;;;;;;;;;;;;;51351:14;51367:21;51380:7;51367:12;:21::i;51059:363::-;50916:511;50814:613;;;:::o;52731:85::-;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52793:17:::1;;:5;:17:::0;52731:85::o;49945:398::-;50021:1;50009:9;;:13;50001:47;;;;-1:-1:-1;;;50001:47:0;;17032:2:1;50001:47:0;;;17014:21:1;17071:2;17051:18;;;17044:30;-1:-1:-1;;;17090:18:1;;;17083:51;17151:18;;50001:47:0;16830:345:1;50001:47:0;50074:10;;35386:7;35409:12;50058:26;50055:112;;;50121:3;50115:5;;:9;;;;:::i;:::-;50102;:22;50094:64;;;;-1:-1:-1;;;50094:64:0;;10614:2:1;50094:64:0;;;10596:21:1;10653:2;10633:18;;;10626:30;10692:31;10672:18;;;10665:59;10741:18;;50094:64:0;10412:353:1;50094:64:0;50209:9;;50202:3;50186:13;35386:7;35409:12;;35333:94;50186:13;:19;;;;:::i;:::-;:32;;50178:60;;;;-1:-1:-1;;;50178:60:0;;17382:2:1;50178:60:0;;;17364:21:1;17421:2;17401:18;;;17394:30;-1:-1:-1;;;17440:18:1;;;17433:45;17495:18;;50178:60:0;17180:339:1;50178:60:0;50260:7;;50253:3;:14;;50245:56;;;;-1:-1:-1;;;50245:56:0;;17726:2:1;50245:56:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:32;17784:18;;;17777:60;17854:18;;50245:56:0;17524:354:1;50245:56:0;50310:27;12806:10;50320:12;12726:98;52822:89;52478:5;;-1:-1:-1;;;;;52478:5:0;52464:10;:19;52456:40;;;;-1:-1:-1;;;52456:40:0;;;;;;;:::i;:::-;52886:19:::1;;:9;:19:::0;52822:89::o;45310:172::-;45407:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;45407:29:0;-1:-1:-1;;;;;45407:29:0;;;;;;;;;45448:28;;45407:24;;45448:28;;;;;;;45310:172;;;:::o;41837:98::-;41902:27;41912:2;41916:8;41902:27;;;;;;;;;;;;:9;:27::i;43685:1519::-;43782:35;43820:20;43832:7;43820:11;:20::i;:::-;43891:18;;43782:58;;-1:-1:-1;43849:22:0;;-1:-1:-1;;;;;43875:34:0;12806:10;-1:-1:-1;;;;;43875:34:0;;:81;;;-1:-1:-1;12806:10:0;43920:20;43932:7;43920:11;:20::i;:::-;-1:-1:-1;;;;;43920:36:0;;43875:81;:142;;;-1:-1:-1;43984:18:0;;43967:50;;12806:10;40506:186;:::i;43967:50::-;43849:169;;44043:17;44027:101;;;;-1:-1:-1;;;44027:101:0;;18085:2:1;44027:101:0;;;18067:21:1;18124:2;18104:18;;;18097:30;18163:34;18143:18;;;18136:62;-1:-1:-1;;;18214:18:1;;;18207:48;18272:19;;44027:101:0;17883:414:1;44027:101:0;44175:4;-1:-1:-1;;;;;44153:26:0;:13;:18;;;-1:-1:-1;;;;;44153:26:0;;44137:98;;;;-1:-1:-1;;;44137:98:0;;18504:2:1;44137:98:0;;;18486:21:1;18543:2;18523:18;;;18516:30;18582:34;18562:18;;;18555:62;-1:-1:-1;;;18633:18:1;;;18626:36;18679:19;;44137:98:0;18302:402:1;44137:98:0;-1:-1:-1;;;;;44250:16:0;;44242:56;;;;-1:-1:-1;;;44242:56:0;;18911:2:1;44242:56:0;;;18893:21:1;18950:2;18930:18;;;18923:30;18989:29;18969:18;;;18962:57;19036:18;;44242:56:0;18709:351:1;44242:56:0;44407:49;44424:1;44428:7;44437:13;:18;;;44407:8;:49::i;:::-;-1:-1:-1;;;;;44465:18:0;;;;;;:12;:18;;;;;:31;;44495:1;;44465:18;:31;;44495:1;;-1:-1:-1;;;;;44465:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;44465:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;44503:16:0;;-1:-1:-1;44503:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;44503:16:0;;:29;;-1:-1:-1;;44503:29:0;;:::i;:::-;;;-1:-1:-1;;;;;44503:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44562:43:0;;;;;;;;-1:-1:-1;;;;;44562:43:0;;;;;;44588:15;44562:43;;;;;;;;;-1:-1:-1;44539:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;44539:66:0;-1:-1:-1;;;;;;44539:66:0;;;;;;;;;;;44855:11;44551:7;-1:-1:-1;44855:11:0;:::i;:::-;44918:1;44877:24;;;:11;:24;;;;;:29;44833:33;;-1:-1:-1;;;;;;44877:29:0;44873:236;;44935:20;44943:11;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;44935:20;44931:171;;;44995:97;;;;;;;;45022:18;;-1:-1:-1;;;;;44995:97:0;;;;;;45053:28;;;;44995:97;;;;;;;;;;-1:-1:-1;44968:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;44968:124:0;-1:-1:-1;;;;;;44968:124:0;;;;;;;;;;;;44931:171;45141:7;45137:2;-1:-1:-1;;;;;45122:27:0;45131:4;-1:-1:-1;;;;;45122:27:0;;;;;;;;;;;45156:42;43775:1429;;;43685:1519;;;:::o;37592:572::-;-1:-1:-1;;;;;;;;;;;;;;;;;37709:16:0;37717:7;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;37709:16;37701:55;;;;-1:-1:-1;;;37701:55:0;;19776:2:1;37701:55:0;;;19758:21:1;19815:2;19795:18;;;19788:30;19854:28;19834:18;;;19827:56;19900:18;;37701:55:0;19574:350:1;37701:55:0;37765:26;37813:12;37802:7;:23;37798:93;;37857:22;37867:12;37857:7;:22;:::i;:::-;:26;;37882:1;37857:26;:::i;:::-;37836:47;;37798:93;37919:7;37899:212;37936:18;37928:4;:26;37899:212;;37973:31;38007:17;;;:11;:17;;;;;;;;;37973:51;;;;;;;;;-1:-1:-1;;;;;37973:51:0;;;;;-1:-1:-1;;;37973:51:0;;;;;;;;;;;;38037:28;38033:71;;38085:9;37592:572;-1:-1:-1;;;;37592:572:0:o;38033:71::-;-1:-1:-1;37956:6:0;;;;:::i;:::-;;;;37899:212;;;-1:-1:-1;38119:39:0;;-1:-1:-1;;;38119:39:0;;20272:2:1;38119:39:0;;;20254:21:1;20311:2;20291:18;;;20284:30;20350:31;20330:18;;;20323:59;20399:18;;38119:39:0;20070:353:1;47021:690:0;47158:4;-1:-1:-1;;;;;47175:13:0;;16613:20;16661:8;47171:535;;47214:72;;-1:-1:-1;;;47214:72:0;;-1:-1:-1;;;;;47214:36:0;;;;;:72;;12806:10;;47265:4;;47271:7;;47280:5;;47214:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47214:72:0;;;;;;;;-1:-1:-1;;47214:72:0;;;;;;;;;;;;:::i;:::-;;;47201:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47445:13:0;;47441:215;;47478:61;;-1:-1:-1;;;47478:61:0;;;;;;;:::i;47441:215::-;47624:6;47618:13;47609:6;47605:2;47601:15;47594:38;47201:464;-1:-1:-1;;;;;;47336:55:0;-1:-1:-1;;;47336:55:0;;-1:-1:-1;47329:62:0;;47171:535;-1:-1:-1;47694:4:0;47171:535;47021:690;;;;;;:::o;49837:102::-;49897:13;49926:7;49919:14;;;;;:::i;51868:537::-;51922:27;51964:7;51960:46;;-1:-1:-1;;51986:10:0;;;;;;;;;;;;-1:-1:-1;;;51986:10:0;;;;;51868:537::o;51960:46::-;52023:2;52014:6;52051:63;52058:6;;52051:63;;52079:5;;;;:::i;:::-;;-1:-1:-1;52097:7:0;;-1:-1:-1;52102:2:0;52097:7;;:::i;:::-;;;52051:63;;;52122:17;52152:3;52142:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52142:14:0;-1:-1:-1;52122:34:0;-1:-1:-1;52174:3:0;52186:186;52193:7;;52186:186;;52219:3;52221:1;52219;:3;:::i;:::-;52215:7;-1:-1:-1;52235:10:0;52265:7;52270:2;52265;:7;:::i;:::-;:12;;52275:2;52265:12;:::i;:::-;52260:17;;:2;:17;:::i;:::-;52249:29;;:2;:29;:::i;:::-;52235:44;;52292:9;52311:4;52304:12;;52292:24;;52339:2;52329:4;52334:1;52329:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;52329:12:0;;;;;;;;-1:-1:-1;52354:8:0;52360:2;52354:8;;:::i;:::-;;;52202:170;;52186:186;;;-1:-1:-1;52394:4:0;51868:537;-1:-1:-1;;;;51868:537:0:o;42190:1263::-;42295:20;42318:12;-1:-1:-1;;;;;42345:16:0;;42337:56;;;;-1:-1:-1;;;42337:56:0;;21809:2:1;42337:56:0;;;21791:21:1;21848:2;21828:18;;;21821:30;21887:29;21867:18;;;21860:57;21934:18;;42337:56:0;21607:351:1;42337:56:0;42530:21;42538:12;41783:4;41813:12;-1:-1:-1;41803:22:0;41726:105;42530:21;42529:22;42521:64;;;;-1:-1:-1;;;42521:64:0;;22165:2:1;42521:64:0;;;22147:21:1;22204:2;22184:18;;;22177:30;22243:31;22223:18;;;22216:59;22292:18;;42521:64:0;21963:353:1;42521:64:0;42612:12;42600:8;:24;;42592:68;;;;-1:-1:-1;;;42592:68:0;;22523:2:1;42592:68:0;;;22505:21:1;22562:2;22542:18;;;22535:30;22601:33;22581:18;;;22574:61;22652:18;;42592:68:0;22321:355:1;42592:68:0;-1:-1:-1;;;;;42772:16:0;;42739:30;42772:16;;;:12;:16;;;;;;;;;42739:49;;;;;;;;;-1:-1:-1;;;;;42739:49:0;;;;;-1:-1:-1;;;42739:49:0;;;;;;;;;;;42814:119;;;;;;;;42834:19;;42739:49;;42814:119;;;42834:39;;42864:8;;42834:39;:::i;:::-;-1:-1:-1;;;;;42814:119:0;;;;;42917:8;42882:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;42814:119:0;;;;;;-1:-1:-1;;;;;42795:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;42795:138:0;;;;;;;;;;;;42968:43;;;;;;;;;;;42994:15;42968:43;;;;;;;;42940:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;42940:71:0;-1:-1:-1;;;;;;42940:71:0;;;;;;;;;;;;;;;;;;42952:12;;43064:281;43088:8;43084:1;:12;43064:281;;;43117:38;;43142:12;;-1:-1:-1;;;;;43117:38:0;;;43134:1;;43117:38;;43134:1;;43117:38;43182:59;43213:1;43217:2;43221:12;43235:5;43182:22;:59::i;:::-;43164:150;;;;-1:-1:-1;;;43164:150:0;;;;;;;:::i;:::-;43323:14;;;;:::i;:::-;;;;43098:3;;;;;:::i;:::-;;;;43064:281;;;-1:-1:-1;43353:12:0;:27;;;43387:60;53131:216;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:186::-;2747:6;2800:2;2788:9;2779:7;2775:23;2771:32;2768:52;;;2816:1;2813;2806:12;2768:52;2839:29;2858:9;2839:29;:::i;2879:276::-;2937:6;2990:2;2978:9;2969:7;2965:23;2961:32;2958:52;;;3006:1;3003;2996:12;2958:52;3045:9;3032:23;3095:10;3088:5;3084:22;3077:5;3074:33;3064:61;;3121:1;3118;3111:12;3381:127;3442:10;3437:3;3433:20;3430:1;3423:31;3473:4;3470:1;3463:15;3497:4;3494:1;3487:15;3513:632;3578:5;3608:18;3649:2;3641:6;3638:14;3635:40;;;3655:18;;:::i;:::-;3730:2;3724:9;3698:2;3784:15;;-1:-1:-1;;3780:24:1;;;3806:2;3776:33;3772:42;3760:55;;;3830:18;;;3850:22;;;3827:46;3824:72;;;3876:18;;:::i;:::-;3916:10;3912:2;3905:22;3945:6;3936:15;;3975:6;3967;3960:22;4015:3;4006:6;4001:3;3997:16;3994:25;3991:45;;;4032:1;4029;4022:12;3991:45;4082:6;4077:3;4070:4;4062:6;4058:17;4045:44;4137:1;4130:4;4121:6;4113;4109:19;4105:30;4098:41;;;;3513:632;;;;;:::o;4150:451::-;4219:6;4272:2;4260:9;4251:7;4247:23;4243:32;4240:52;;;4288:1;4285;4278:12;4240:52;4328:9;4315:23;4361:18;4353:6;4350:30;4347:50;;;4393:1;4390;4383:12;4347:50;4416:22;;4469:4;4461:13;;4457:27;-1:-1:-1;4447:55:1;;4498:1;4495;4488:12;4447:55;4521:74;4587:7;4582:2;4569:16;4564:2;4560;4556:11;4521:74;:::i;4606:778::-;4699:6;4707;4715;4768:2;4756:9;4747:7;4743:23;4739:32;4736:52;;;4784:1;4781;4774:12;4736:52;4824:9;4811:23;4853:18;4894:2;4886:6;4883:14;4880:34;;;4910:1;4907;4900:12;4880:34;4948:6;4937:9;4933:22;4923:32;;4993:7;4986:4;4982:2;4978:13;4974:27;4964:55;;5015:1;5012;5005:12;4964:55;5055:2;5042:16;5081:2;5073:6;5070:14;5067:34;;;5097:1;5094;5087:12;5067:34;5152:7;5145:4;5135:6;5132:1;5128:14;5124:2;5120:23;5116:34;5113:47;5110:67;;;5173:1;5170;5163:12;5110:67;5204:4;5196:13;;;;-1:-1:-1;5228:6:1;-1:-1:-1;;5269:20:1;;5256:34;5330:4;5319:16;;5309:27;;5299:55;;5350:1;5347;5340:12;5299:55;5373:5;5363:15;;;4606:778;;;;;:::o;5613:118::-;5699:5;5692:13;5685:21;5678:5;5675:32;5665:60;;5721:1;5718;5711:12;5736:315;5801:6;5809;5862:2;5850:9;5841:7;5837:23;5833:32;5830:52;;;5878:1;5875;5868:12;5830:52;5901:29;5920:9;5901:29;:::i;:::-;5891:39;;5980:2;5969:9;5965:18;5952:32;5993:28;6015:5;5993:28;:::i;:::-;6040:5;6030:15;;;5736:315;;;;;:::o;6056:667::-;6151:6;6159;6167;6175;6228:3;6216:9;6207:7;6203:23;6199:33;6196:53;;;6245:1;6242;6235:12;6196:53;6268:29;6287:9;6268:29;:::i;:::-;6258:39;;6316:38;6350:2;6339:9;6335:18;6316:38;:::i;:::-;6306:48;;6401:2;6390:9;6386:18;6373:32;6363:42;;6456:2;6445:9;6441:18;6428:32;6483:18;6475:6;6472:30;6469:50;;;6515:1;6512;6505:12;6469:50;6538:22;;6591:4;6583:13;;6579:27;-1:-1:-1;6569:55:1;;6620:1;6617;6610:12;6569:55;6643:74;6709:7;6704:2;6691:16;6686:2;6682;6678:11;6643:74;:::i;:::-;6633:84;;;6056:667;;;;;;;:::o;6728:260::-;6796:6;6804;6857:2;6845:9;6836:7;6832:23;6828:32;6825:52;;;6873:1;6870;6863:12;6825:52;6896:29;6915:9;6896:29;:::i;:::-;6886:39;;6944:38;6978:2;6967:9;6963:18;6944:38;:::i;:::-;6934:48;;6728:260;;;;;:::o;6993:380::-;7072:1;7068:12;;;;7115;;;7136:61;;7190:4;7182:6;7178:17;7168:27;;7136:61;7243:2;7235:6;7232:14;7212:18;7209:38;7206:161;;;7289:10;7284:3;7280:20;7277:1;7270:31;7324:4;7321:1;7314:15;7352:4;7349:1;7342:15;8522:332;8724:2;8706:21;;;8763:1;8743:18;;;8736:29;-1:-1:-1;;;8796:2:1;8781:18;;8774:39;8845:2;8830:18;;8522:332::o;9613:127::-;9674:10;9669:3;9665:20;9662:1;9655:31;9705:4;9702:1;9695:15;9729:4;9726:1;9719:15;9745:128;9785:3;9816:1;9812:6;9809:1;9806:13;9803:39;;;9822:18;;:::i;:::-;-1:-1:-1;9858:9:1;;9745:128::o;10239:168::-;10279:7;10345:1;10341;10337:6;10333:14;10330:1;10327:21;10322:1;10315:9;10308:17;10304:45;10301:71;;;10352:18;;:::i;:::-;-1:-1:-1;10392:9:1;;10239:168::o;10770:125::-;10810:4;10838:1;10835;10832:8;10829:34;;;10843:18;;:::i;:::-;-1:-1:-1;10880:9:1;;10770:125::o;11303:135::-;11342:3;-1:-1:-1;;11363:17:1;;11360:43;;;11383:18;;:::i;:::-;-1:-1:-1;11430:1:1;11419:13;;11303:135::o;12870:245::-;12937:6;12990:2;12978:9;12969:7;12965:23;12961:32;12958:52;;;13006:1;13003;12996:12;12958:52;13038:9;13032:16;13057:28;13079:5;13057:28;:::i;14740:127::-;14801:10;14796:3;14792:20;14789:1;14782:31;14832:4;14829:1;14822:15;14856:4;14853:1;14846:15;15581:415;15783:2;15765:21;;;15822:2;15802:18;;;15795:30;15861:34;15856:2;15841:18;;15834:62;-1:-1:-1;;;15927:2:1;15912:18;;15905:49;15986:3;15971:19;;15581:415::o;16355:470::-;16534:3;16572:6;16566:13;16588:53;16634:6;16629:3;16622:4;16614:6;16610:17;16588:53;:::i;:::-;16704:13;;16663:16;;;;16726:57;16704:13;16663:16;16760:4;16748:17;;16726:57;:::i;:::-;16799:20;;16355:470;-1:-1:-1;;;;16355:470:1:o;19065:246::-;19105:4;-1:-1:-1;;;;;19218:10:1;;;;19188;;19240:12;;;19237:38;;;19255:18;;:::i;:::-;19292:13;;19065:246;-1:-1:-1;;;19065:246:1:o;19316:253::-;19356:3;-1:-1:-1;;;;;19445:2:1;19442:1;19438:10;19475:2;19472:1;19468:10;19506:3;19502:2;19498:12;19493:3;19490:21;19487:47;;;19514:18;;:::i;19929:136::-;19968:3;19996:5;19986:39;;20005:18;;:::i;:::-;-1:-1:-1;;;20041:18:1;;19929:136::o;20428:489::-;-1:-1:-1;;;;;20697:15:1;;;20679:34;;20749:15;;20744:2;20729:18;;20722:43;20796:2;20781:18;;20774:34;;;20844:3;20839:2;20824:18;;20817:31;;;20622:4;;20865:46;;20891:19;;20883:6;20865:46;:::i;:::-;20857:54;20428:489;-1:-1:-1;;;;;;20428:489:1:o;20922:249::-;20991:6;21044:2;21032:9;21023:7;21019:23;21015:32;21012:52;;;21060:1;21057;21050:12;21012:52;21092:9;21086:16;21111:30;21135:5;21111:30;:::i;21176:217::-;21216:1;21242;21232:132;;21286:10;21281:3;21277:20;21274:1;21267:31;21321:4;21318:1;21311:15;21349:4;21346:1;21339:15;21232:132;-1:-1:-1;21378:9:1;;21176:217::o;21398:204::-;21436:3;21472:4;21469:1;21465:12;21504:4;21501:1;21497:12;21539:3;21533:4;21529:14;21524:3;21521:23;21518:49;;;21547:18;;:::i;:::-;21583:13;;21398:204;-1:-1:-1;;;21398:204:1:o

Swarm Source

ipfs://86f2511d0c8ab59c7c1c6039cd9c693620f4b7fbc7ed5122e8683e3f00aad914
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.