ETH Price: $2,772.41 (+5.62%)
Gas: 1.51 Gwei

Token

Rizz (RIZZ)
 

Overview

Max Total Supply

378,378,378,378,378 RIZZ

Holders

118

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
97,670,871,759.196580816040861936 RIZZ

Value
$0.00
0x3e07b29ba72a9f7eca08591a39e303064326270e
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:
RizzFaucet

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-15
*/

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)

pragma solidity ^0.8.20;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    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.
     */
    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.
     */
    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.
     */
    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 largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or
     * denominator == 0.
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by
     * Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator.
            // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.

            uint256 twos = denominator & (0 - denominator);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also
            // works in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded
     * towards zero.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, deducting from
     * the caller's allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

// File: contracts/Rizz.sol


pragma solidity ^0.8.20;

/*                                                                          
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@          @@@@          @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@                      @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@         @@@@@@     @@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@@@((@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@@(((((@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@(((((((@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@(((((((((@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@((((((((((@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@((((((((@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@       @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@                #@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@             
*/






contract RizzFaucet is ERC20, ReentrancyGuard, ERC20Burnable, Ownable{
    constructor(address __initialOwner)
    ERC20("Rizz", "RIZZ")
    Ownable(__initialOwner)
    {
        DEV_WALLET = __initialOwner;
        FAUCET_LAST_OPENED = block.number;
    }

    /// max amount of RIZZ mintable
    uint256 public MAX_SUPPLY = 420420420420420 * 10 ** 18;

    /// 10% of token supply allocated for allowrizzst presale
    uint256 public PRESALE_ALLOCATION = (MAX_SUPPLY / 100) * 10;

    uint256 public PRESALE_MINIMUM_CONTRIBUTION = 0.1 ether;

    uint256 public PRESALE_MAX_CONTRIBUTION = 0.420 ether;

    uint256 public PRESALE_CAP = 42 ether;

    uint256 public PRESALE_TOTAL_CONTRIBUTIONS;

    /// how many tokens have been minted so far
    uint256 public TOTAL_RIZZ_DRIPPED;

    /// a failsafe in case sh*t goes bad in presale
    bool public ALLOW_PRESALE_REFUNDS;

    /// a failsafe in case sh*t goes bad in presale
    bool public ALLOWRIZZST_ONLY = true;

    /// phases:
    /// 0: deployed
    /// 1: presale (closed allowrizzst only)
    /// 2: claim active
    /// 3: paused
    uint256 public CURRENT_PHASE;
    
    /// blocks for faucet claim -- can claim faster if you HODL. Adjusted for testnet
    uint256 public DRIP_TIMER = 100069; 

    address public DEV_WALLET;

    uint256 public FAUCET_LAST_OPENED;

    /// keep track of how much eth each wallet 
    /// has contributed in each presale phase
    mapping (address => uint256) public presaleContribution;
    
    /// store each address in an array so we can iterate
    /// over it later when the tokens are allocated
    address[] public presaleContributorAddresses;

    /// allowrizzst for presale
    mapping (address => bool) public onAllowrizzst;

    /// keep track of tokens that have been claimed
    mapping (address => uint256) public tokensClaimedByAddress;
    mapping (address => uint256) public tokensAllocatedByAddress;
    mapping (address => uint256) public lastBlockClaimed;

    bool public TOKENS_ALLOCATED_BY_DEV;

    /// adjust the current phase
    function setPhase(uint256 _phase) public onlyOwner {
        CURRENT_PHASE = _phase;
        if (_phase == 2){
            /// ensure tokens have been allocated before the faucet is activated
            require(TOKENS_ALLOCATED_BY_DEV, "tokens not allocated yet");
            FAUCET_LAST_OPENED = block.number;
        }
    }

    /// set the dev wallet 
    function setDevWallet(address _devWallet) public onlyOwner {
        DEV_WALLET = _devWallet;
    }

    /// set the dev wallet 
    function setDripTimer(uint256 _numberOfBlocks) public onlyOwner {
        DRIP_TIMER = _numberOfBlocks;
    }

    /// allow refunds for presale if needed
    function allowRefunds(bool _allow) public onlyOwner {
        ALLOW_PRESALE_REFUNDS = _allow;
    }

     /// allow refunds for presale if needed
    function toggleAllowrizzst(bool _value) public onlyOwner {
        ALLOWRIZZST_ONLY = _value;
    }

    function addToAllowrizzst(address[] memory  _addresses) public onlyOwner{
        /// loop over the addresses submitted and add them to allowlist
        for(uint8 i=0; i< _addresses.length; i++){
            onAllowrizzst[_addresses[i]] = true;
        }
    }

    /// presale mechanic logic
    function contributePresale() nonReentrant external payable {

        /// presale is only allowed during phases 1 and 2 
        require(CURRENT_PHASE == 1, "presale is not active");

        if (ALLOWRIZZST_ONLY){
            /// check the address for allowrizzst
            require(onAllowrizzst[msg.sender], "not on allowrizzst");
        }

        /// enforce the total limit of contributions
        require(
            PRESALE_TOTAL_CONTRIBUTIONS + msg.value <= PRESALE_CAP, 
            "presale cap exceeded"
        );

        /// enforce the per wallet contribution limit
        require(
            presaleContribution[msg.sender] + msg.value <= PRESALE_MAX_CONTRIBUTION, 
            "contribution cap exceeded"
        );
        /// if the address has never made a contribution, add them to the contributors list
        if (presaleContribution[msg.sender] == 0){
            
            /// a minimum contribution must be sent for each presale contribution
            require(msg.value >= PRESALE_MINIMUM_CONTRIBUTION, "minmimum contribution not met");

            presaleContributorAddresses.push(msg.sender);
        }

        /// add the contribution to the address' total
        /// allows for multiple contributions
        presaleContribution[msg.sender] += msg.value;

        /// add the contribution to the phase2 total
        PRESALE_TOTAL_CONTRIBUTIONS += msg.value;
    }

    function mint(address to, uint256 amount) internal {
        /// ensure we don't mint more tokens than the full supply allows
        require(TOTAL_RIZZ_DRIPPED + amount <= MAX_SUPPLY, "mint would exceed max supply");

        /// keep track of how much rizz is minted
        TOTAL_RIZZ_DRIPPED += amount;

        /// mint the tokens
        _mint(to, amount);
    }

    /// check how many tokens an address is able to claim at this moment
    function eligibleToClaim(address _address) public view returns (uint256) {
        /// start by assuming 0 eligible tokens
        uint256 eligibleTokens;

        /// start with how many tokens the address has remaining to claim
        uint256 remainingTokens = tokensAllocatedByAddress[_address] - tokensClaimedByAddress[_address];

        /// look up the last time this address claimed tokens
        uint256 lastClaim = lastBlockClaimed[_address];
        
        /// if they've never claimed, base the time on when the faucet opened
        if (lastClaim == 0){
            lastClaim = FAUCET_LAST_OPENED;
        }

        /// calculate what percentage of blocks have passed out of 100
        uint256 percentageOfBlocksPassed = Math.min(100, (((block.number - lastClaim) * 100) / DRIP_TIMER));

        /// determine how many tokens are eligible based on the percentage of blocks passed
        uint256 tokensBasedOnTime = (remainingTokens / 100) * percentageOfBlocksPassed;

        /// percentage of tokens held out of 100
        uint256 percentageHeldOrNeverClaimed = Math.min(100, (((balanceOf(_address) + remainingTokens) * 100) / tokensAllocatedByAddress[_address]));
    
        /// get number of eligible tokens based on holding percentage and time
        eligibleTokens = (tokensBasedOnTime / 100) * percentageHeldOrNeverClaimed;

        /// if they've never claimed tokens before then set the number at 69% of eligible tokens
        if (tokensClaimedByAddress[_address] == 0){
            uint256 minimumClaim = (tokensAllocatedByAddress[_address] / 100) * 69;
            if (minimumClaim > eligibleTokens){
                eligibleTokens = minimumClaim;
            }
        }

        return eligibleTokens;
    }

    function claimPresaleFromFaucet() nonReentrant public {
        require(CURRENT_PHASE == 2, "claim is not active");

        /// look up how many tokens the address is eligible to claim
        uint256 amountToClaim = eligibleToClaim(msg.sender);

        require(amountToClaim > 0, "no tokens to claim");

        require(amountToClaim + tokensClaimedByAddress[msg.sender] <= tokensAllocatedByAddress[msg.sender], "claim exceeds allocation");

        /// reset the block timer for this address
        lastBlockClaimed[msg.sender] = block.number;

        /// keep track of how many tokens have been claimed by this address
        tokensClaimedByAddress[msg.sender] += amountToClaim;

        mint(msg.sender, amountToClaim);
    }

    function getPresaleAllocation(address _address) public view returns (uint256) {
        uint256 percentageHeld = presaleContribution[_address] * 100 / PRESALE_TOTAL_CONTRIBUTIONS;
        uint256 amountToAllocate = (PRESALE_ALLOCATION / 100) * percentageHeld;
        return amountToAllocate;
    }

    function allocateTokens() public onlyOwner {
        /// prevent owner being drunk and call allocateTokens() again when the presale claim is already underway
        require(!TOKENS_ALLOCATED_BY_DEV, "tokens can only be allocated once");

        /// loop through the list of contributors and assign them tokens 
        for(uint8 i=0; i< presaleContributorAddresses.length; i++){
            address contributorAddress = presaleContributorAddresses[i];
            tokensAllocatedByAddress[contributorAddress] = getPresaleAllocation(contributorAddress);
        }
        TOKENS_ALLOCATED_BY_DEV = true;
    }

    function claimRefund() nonReentrant public {
        require(ALLOW_PRESALE_REFUNDS, "refunds not currently allowed");
       
        (bool success, ) = msg.sender.call{value: presaleContribution[msg.sender]}("");
        require(success, "Refund failed");

        presaleContribution[msg.sender] = 0;
        tokensAllocatedByAddress[msg.sender] = 0;
    }

    /// mint the dev supply to use for LP and marketing etc
    function mintDevTokens() public onlyOwner {
        uint256 devTokensToMint = MAX_SUPPLY - PRESALE_ALLOCATION;
        mint(msg.sender, devTokensToMint);
    }

    /// @dev allows the owner to withdraw the funds in this contract
    function withdrawBalance(address payable _address) external onlyOwner {
        (bool success, ) = _address.call{value: address(this).balance}("");
        require(success, "Withdraw failed");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"__initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ALLOWRIZZST_ONLY","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALLOW_PRESALE_REFUNDS","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CURRENT_PHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEV_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DRIP_TIMER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FAUCET_LAST_OPENED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ALLOCATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MAX_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINIMUM_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_TOTAL_CONTRIBUTIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKENS_ALLOCATED_BY_DEV","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_RIZZ_DRIPPED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addToAllowrizzst","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allocateTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"allowRefunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPresaleFromFaucet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contributePresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"eligibleToClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPresaleAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBlockClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintDevTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"onAllowrizzst","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"presaleContributorAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfBlocks","type":"uint256"}],"name":"setDripTimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_phase","type":"uint256"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"toggleAllowrizzst","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensAllocatedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokensClaimedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526d14ba73a4e4a66cbdc579a2900000600755600a606460075462000029919062000345565b6200003591906200037c565b60085567016345785d8a00006009556705d423c655aa0000600a55680246ddf97976680000600b556001600e60016101000a81548160ff021916908315150217905550620186e56010553480156200008b575f80fd5b5060405162003bc938038062003bc98339818101604052810190620000b191906200042b565b806040518060400160405280600481526020017f52697a7a000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f52495a5a0000000000000000000000000000000000000000000000000000000081525081600390816200012f9190620006b6565b508060049081620001419190620006b6565b50505060016005819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001bf575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001b69190620007ab565b60405180910390fd5b620001d0816200021f60201b60201c565b508060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055504360128190555050620007c6565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200035182620002e2565b91506200035e83620002e2565b925082620003715762000370620002eb565b5b828204905092915050565b5f6200038882620002e2565b91506200039583620002e2565b9250828202620003a581620002e2565b91508282048414831517620003bf57620003be62000318565b5b5092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620003f582620003ca565b9050919050565b6200040781620003e9565b811462000412575f80fd5b50565b5f815190506200042581620003fc565b92915050565b5f60208284031215620004435762000442620003c6565b5b5f620004528482850162000415565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620004d757607f821691505b602082108103620004ed57620004ec62000492565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000514565b6200055d868362000514565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200059e620005986200059284620002e2565b62000575565b620002e2565b9050919050565b5f819050919050565b620005b9836200057e565b620005d1620005c882620005a5565b84845462000520565b825550505050565b5f90565b620005e7620005d9565b620005f4818484620005ae565b505050565b5b818110156200061b576200060f5f82620005dd565b600181019050620005fa565b5050565b601f8211156200066a576200063481620004f3565b6200063f8462000505565b810160208510156200064f578190505b620006676200065e8562000505565b830182620005f9565b50505b505050565b5f82821c905092915050565b5f6200068c5f19846008026200066f565b1980831691505092915050565b5f620006a683836200067b565b9150826002028217905092915050565b620006c1826200045b565b67ffffffffffffffff811115620006dd57620006dc62000465565b5b620006e98254620004bf565b620006f68282856200061f565b5f60209050601f8311600181146200072c575f841562000717578287015190505b62000723858262000699565b86555062000792565b601f1984166200073c86620004f3565b5f5b8281101562000765578489015182556001820191506020850194506020810190506200073e565b8683101562000785578489015162000781601f8916826200067b565b8355505b6001600288020188555050505b505050505050565b620007a581620003e9565b82525050565b5f602082019050620007c05f8301846200079a565b92915050565b6133f580620007d45f395ff3fe608060405260043610610292575f3560e01c806379cc679011610159578063b19fde5a116100c0578063d29dbbec11610079578063d29dbbec146109c0578063da191788146109e8578063dd62ed3e14610a10578063e150813714610a4c578063f2fde38b14610a76578063f691c8f814610a9e57610292565b8063b19fde5a146108c6578063b5545a3c14610902578063bbb7ef7c14610918578063bd94fafc14610942578063c26c67b41461096c578063c7b5a48c1461099657610292565b8063910b4fdb11610112578063910b4fdb146107ba57806395d89b41146107f6578063a20238c314610820578063a8ec977914610836578063a9059cbb14610860578063aaa7dfed1461089c57610292565b806379cc6790146106b05780638769c281146106d857806388bb1617146107005780638c5f1e3e1461073c5780638da5cb5b146107665780639091a5851461079057610292565b8063313ce567116101fd57806360f67db1116101b657806360f67db11461059657806370a08231146105be578063715018a6146105fa578063756af45f1461061057806376e2d559146106385780637710f5db1461067457610292565b8063313ce5671461046657806332cb6b0c146104905780634280e767146104ba57806342966c68146104f65780634ba976b11461051e5780635be28bc71461055a57610292565b80631f53ac021161024f5780631f53ac021461035c578063211ce0891461038457806323b872dd146103ae578063280a82dd146103ea5780632cc82655146104145780632d04f8201461043c57610292565b8063038949221461029657806306fdde03146102ac57806308bd0399146102d6578063095ea7b3146102ec57806318160ddd146103285780631cc34ff914610352575b5f80fd5b3480156102a1575f80fd5b506102aa610ac8565b005b3480156102b7575f80fd5b506102c0610bee565b6040516102cd919061264f565b60405180910390f35b3480156102e1575f80fd5b506102ea610c7e565b005b3480156102f7575f80fd5b50610312600480360381019061030d919061270d565b610e8b565b60405161031f9190612765565b60405180910390f35b348015610333575f80fd5b5061033c610ead565b604051610349919061278d565b60405180910390f35b61035a610eb6565b005b348015610367575f80fd5b50610382600480360381019061037d91906127a6565b6111e0565b005b34801561038f575f80fd5b5061039861122b565b6040516103a5919061278d565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf91906127d1565b611231565b6040516103e19190612765565b60405180910390f35b3480156103f5575f80fd5b506103fe61125f565b60405161040b919061278d565b60405180910390f35b34801561041f575f80fd5b5061043a60048036038101906104359190612821565b611265565b005b348015610447575f80fd5b506104506112d5565b60405161045d919061285b565b60405180910390f35b348015610471575f80fd5b5061047a6112fa565b604051610487919061288f565b60405180910390f35b34801561049b575f80fd5b506104a4611302565b6040516104b1919061278d565b60405180910390f35b3480156104c5575f80fd5b506104e060048036038101906104db91906127a6565b611308565b6040516104ed919061278d565b60405180910390f35b348015610501575f80fd5b5061051c60048036038101906105179190612821565b61131d565b005b348015610529575f80fd5b50610544600480360381019061053f91906127a6565b611331565b604051610551919061278d565b60405180910390f35b348015610565575f80fd5b50610580600480360381019061057b91906127a6565b611346565b60405161058d9190612765565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b79190612821565b611363565b005b3480156105c9575f80fd5b506105e460048036038101906105df91906127a6565b611375565b6040516105f1919061278d565b60405180910390f35b348015610605575f80fd5b5061060e6113ba565b005b34801561061b575f80fd5b50610636600480360381019061063191906128e3565b6113cd565b005b348015610643575f80fd5b5061065e600480360381019061065991906127a6565b611481565b60405161066b919061278d565b60405180910390f35b34801561067f575f80fd5b5061069a600480360381019061069591906127a6565b6116ef565b6040516106a7919061278d565b60405180910390f35b3480156106bb575f80fd5b506106d660048036038101906106d1919061270d565b611704565b005b3480156106e3575f80fd5b506106fe60048036038101906106f99190612938565b611724565b005b34801561070b575f80fd5b50610726600480360381019061072191906127a6565b611748565b604051610733919061278d565b60405180910390f35b348015610747575f80fd5b5061075061175d565b60405161075d919061278d565b60405180910390f35b348015610771575f80fd5b5061077a611763565b604051610787919061285b565b60405180910390f35b34801561079b575f80fd5b506107a461178b565b6040516107b1919061278d565b60405180910390f35b3480156107c5575f80fd5b506107e060048036038101906107db9190612821565b611791565b6040516107ed919061285b565b60405180910390f35b348015610801575f80fd5b5061080a6117cc565b604051610817919061264f565b60405180910390f35b34801561082b575f80fd5b5061083461185c565b005b348015610841575f80fd5b5061084a611884565b604051610857919061278d565b60405180910390f35b34801561086b575f80fd5b506108866004803603810190610881919061270d565b61188a565b6040516108939190612765565b60405180910390f35b3480156108a7575f80fd5b506108b06118ac565b6040516108bd9190612765565b60405180910390f35b3480156108d1575f80fd5b506108ec60048036038101906108e791906127a6565b6118bf565b6040516108f9919061278d565b60405180910390f35b34801561090d575f80fd5b50610916611941565b005b348015610923575f80fd5b5061092c611b0b565b604051610939919061278d565b60405180910390f35b34801561094d575f80fd5b50610956611b11565b604051610963919061278d565b60405180910390f35b348015610977575f80fd5b50610980611b17565b60405161098d9190612765565b60405180910390f35b3480156109a1575f80fd5b506109aa611b29565b6040516109b7919061278d565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190612938565b611b2f565b005b3480156109f3575f80fd5b50610a0e6004803603810190610a099190612aa3565b611b54565b005b348015610a1b575f80fd5b50610a366004803603810190610a319190612aea565b611bf3565b604051610a43919061278d565b60405180910390f35b348015610a57575f80fd5b50610a60611c75565b604051610a6d9190612765565b60405180910390f35b348015610a81575f80fd5b50610a9c6004803603810190610a9791906127a6565b611c87565b005b348015610aa9575f80fd5b50610ab2611d0b565b604051610abf919061278d565b60405180910390f35b610ad0611d11565b60195f9054906101000a900460ff1615610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612b98565b60405180910390fd5b5f5b6014805490508160ff161015610bd1575f60148260ff1681548110610b4957610b48612bb6565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610b7c816118bf565b60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508080610bc990612c10565b915050610b21565b50600160195f6101000a81548160ff021916908315150217905550565b606060038054610bfd90612c65565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2990612c65565b8015610c745780601f10610c4b57610100808354040283529160200191610c74565b820191905f5260205f20905b815481529060010190602001808311610c5757829003601f168201915b5050505050905090565b610c86611d98565b6002600f5414610ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc290612cdf565b60405180910390fd5b5f610cd533611481565b90505f8111610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090612d47565b60405180910390fd5b60175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482610da09190612d65565b1115610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890612de2565b60405180910390fd5b4360185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e6f9190612d65565b92505081905550610e803382611de7565b50610e89611e5f565b565b5f80610e95611e69565b9050610ea2818585611e70565b600191505092915050565b5f600254905090565b610ebe611d98565b6001600f5414610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612e4a565b60405180910390fd5b600e60019054906101000a900460ff1615610fa25760155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9890612eb2565b60405180910390fd5b5b600b5434600c54610fb39190612d65565b1115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90612f1a565b60405180910390fd5b600a543460135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546110409190612d65565b1115611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890612f82565b60405180910390fd5b5f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361116b5760095434101561110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612fea565b60405180910390fd5b601433908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b3460135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111b79190612d65565b9250508190555034600c5f8282546111cf9190612d65565b925050819055506111de611e5f565b565b6111e8611d11565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b5f8061123b611e69565b9050611248858285611e82565b611253858585611f14565b60019150509392505050565b600a5481565b61126d611d11565b80600f81905550600281036112d25760195f9054906101000a900460ff166112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190613052565b60405180910390fd5b436012819055505b50565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b60075481565b6013602052805f5260405f205f915090505481565b61132e611328611e69565b82612004565b50565b6016602052805f5260405f205f915090505481565b6015602052805f5260405f205f915054906101000a900460ff1681565b61136b611d11565b8060108190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6113c2611d11565b6113cb5f612083565b565b6113d5611d11565b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516113fa9061309d565b5f6040518083038185875af1925050503d805f8114611434576040519150601f19603f3d011682016040523d82523d5f602084013e611439565b606091505b505090508061147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906130fb565b60405180910390fd5b5050565b5f805f60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460175f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461150a9190613119565b90505f60185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f810361155a5760125490505b5f61158a6064601054606485436115719190613119565b61157b919061314c565b61158591906131ba565b612146565b90505f8160648561159b91906131ba565b6115a5919061314c565b90505f61161a606460175f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546064886115f78d611375565b6116019190612d65565b61160b919061314c565b61161591906131ba565b612146565b90508060648361162a91906131ba565b611634919061314c565b95505f60165f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036116e1575f6045606460175f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116c791906131ba565b6116d1919061314c565b9050868111156116df578096505b505b859650505050505050919050565b6018602052805f5260405f205f915090505481565b61171682611710611e69565b83611e82565b6117208282612004565b5050565b61172c611d11565b80600e5f6101000a81548160ff02191690831515021790555050565b6017602052805f5260405f205f915090505481565b600f5481565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b601481815481106117a0575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546117db90612c65565b80601f016020809104026020016040519081016040528092919081815260200182805461180790612c65565b80156118525780601f1061182957610100808354040283529160200191611852565b820191905f5260205f20905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b611864611d11565b5f6008546007546118759190613119565b90506118813382611de7565b50565b60105481565b5f80611894611e69565b90506118a1818585611f14565b600191505092915050565b600e60019054906101000a900460ff1681565b5f80600c54606460135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461190e919061314c565b61191891906131ba565b90505f81606460085461192b91906131ba565b611935919061314c565b90508092505050919050565b611949611d98565b600e5f9054906101000a900460ff16611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90613234565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516119f99061309d565b5f6040518083038185875af1925050503d805f8114611a33576040519150601f19603f3d011682016040523d82523d5f602084013e611a38565b606091505b5050905080611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a739061329c565b60405180910390fd5b5f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050611b09611e5f565b565b600c5481565b600b5481565b600e5f9054906101000a900460ff1681565b60085481565b611b37611d11565b80600e60016101000a81548160ff02191690831515021790555050565b611b5c611d11565b5f5b81518160ff161015611bef57600160155f848460ff1681518110611b8557611b84612bb6565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080611be790612c10565b915050611b5e565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60195f9054906101000a900460ff1681565b611c8f611d11565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cff575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611cf6919061285b565b60405180910390fd5b611d0881612083565b50565b600d5481565b611d19611e69565b73ffffffffffffffffffffffffffffffffffffffff16611d37611763565b73ffffffffffffffffffffffffffffffffffffffff1614611d9657611d5a611e69565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d8d919061285b565b60405180910390fd5b565b600260055403611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613304565b60405180910390fd5b6002600581905550565b60075481600d54611df89190612d65565b1115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e309061336c565b60405180910390fd5b80600d5f828254611e4a9190612d65565b92505081905550611e5b828261215e565b5050565b6001600581905550565b5f33905090565b611e7d83838360016121dd565b505050565b5f611e8d8484611bf3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f0e5781811015611eff578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611ef69392919061338a565b60405180910390fd5b611f0d84848484035f6121dd565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f84575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f7b919061285b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff4575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611feb919061285b565b60405180910390fd5b611fff8383836123ac565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612074575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161206b919061285b565b60405180910390fd5b61207f825f836123ac565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8183106121545781612156565b825b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ce575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121c5919061285b565b60405180910390fd5b6121d95f83836123ac565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361224d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612244919061285b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122bd575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016122b4919061285b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156123a6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161239d919061278d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123fc578060025f8282546123f09190612d65565b925050819055506124ca565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612485578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161247c9392919061338a565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612511578060025f828254039250508190555061255b565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125b8919061278d565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156125fc5780820151818401526020810190506125e1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612621826125c5565b61262b81856125cf565b935061263b8185602086016125df565b61264481612607565b840191505092915050565b5f6020820190508181035f8301526126678184612617565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6126a982612680565b9050919050565b6126b98161269f565b81146126c3575f80fd5b50565b5f813590506126d4816126b0565b92915050565b5f819050919050565b6126ec816126da565b81146126f6575f80fd5b50565b5f81359050612707816126e3565b92915050565b5f806040838503121561272357612722612678565b5b5f612730858286016126c6565b9250506020612741858286016126f9565b9150509250929050565b5f8115159050919050565b61275f8161274b565b82525050565b5f6020820190506127785f830184612756565b92915050565b612787816126da565b82525050565b5f6020820190506127a05f83018461277e565b92915050565b5f602082840312156127bb576127ba612678565b5b5f6127c8848285016126c6565b91505092915050565b5f805f606084860312156127e8576127e7612678565b5b5f6127f5868287016126c6565b9350506020612806868287016126c6565b9250506040612817868287016126f9565b9150509250925092565b5f6020828403121561283657612835612678565b5b5f612843848285016126f9565b91505092915050565b6128558161269f565b82525050565b5f60208201905061286e5f83018461284c565b92915050565b5f60ff82169050919050565b61288981612874565b82525050565b5f6020820190506128a25f830184612880565b92915050565b5f6128b282612680565b9050919050565b6128c2816128a8565b81146128cc575f80fd5b50565b5f813590506128dd816128b9565b92915050565b5f602082840312156128f8576128f7612678565b5b5f612905848285016128cf565b91505092915050565b6129178161274b565b8114612921575f80fd5b50565b5f813590506129328161290e565b92915050565b5f6020828403121561294d5761294c612678565b5b5f61295a84828501612924565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61299d82612607565b810181811067ffffffffffffffff821117156129bc576129bb612967565b5b80604052505050565b5f6129ce61266f565b90506129da8282612994565b919050565b5f67ffffffffffffffff8211156129f9576129f8612967565b5b602082029050602081019050919050565b5f80fd5b5f612a20612a1b846129df565b6129c5565b90508083825260208201905060208402830185811115612a4357612a42612a0a565b5b835b81811015612a6c5780612a5888826126c6565b845260208401935050602081019050612a45565b5050509392505050565b5f82601f830112612a8a57612a89612963565b5b8135612a9a848260208601612a0e565b91505092915050565b5f60208284031215612ab857612ab7612678565b5b5f82013567ffffffffffffffff811115612ad557612ad461267c565b5b612ae184828501612a76565b91505092915050565b5f8060408385031215612b0057612aff612678565b5b5f612b0d858286016126c6565b9250506020612b1e858286016126c6565b9150509250929050565b7f746f6b656e732063616e206f6e6c7920626520616c6c6f6361746564206f6e635f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f612b826021836125cf565b9150612b8d82612b28565b604082019050919050565b5f6020820190508181035f830152612baf81612b76565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c1a82612874565b915060ff8203612c2d57612c2c612be3565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c7c57607f821691505b602082108103612c8f57612c8e612c38565b5b50919050565b7f636c61696d206973206e6f7420616374697665000000000000000000000000005f82015250565b5f612cc96013836125cf565b9150612cd482612c95565b602082019050919050565b5f6020820190508181035f830152612cf681612cbd565b9050919050565b7f6e6f20746f6b656e7320746f20636c61696d00000000000000000000000000005f82015250565b5f612d316012836125cf565b9150612d3c82612cfd565b602082019050919050565b5f6020820190508181035f830152612d5e81612d25565b9050919050565b5f612d6f826126da565b9150612d7a836126da565b9250828201905080821115612d9257612d91612be3565b5b92915050565b7f636c61696d206578636565647320616c6c6f636174696f6e00000000000000005f82015250565b5f612dcc6018836125cf565b9150612dd782612d98565b602082019050919050565b5f6020820190508181035f830152612df981612dc0565b9050919050565b7f70726573616c65206973206e6f742061637469766500000000000000000000005f82015250565b5f612e346015836125cf565b9150612e3f82612e00565b602082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f6e6f74206f6e20616c6c6f7772697a7a737400000000000000000000000000005f82015250565b5f612e9c6012836125cf565b9150612ea782612e68565b602082019050919050565b5f6020820190508181035f830152612ec981612e90565b9050919050565b7f70726573616c65206361702065786365656465640000000000000000000000005f82015250565b5f612f046014836125cf565b9150612f0f82612ed0565b602082019050919050565b5f6020820190508181035f830152612f3181612ef8565b9050919050565b7f636f6e747269627574696f6e20636170206578636565646564000000000000005f82015250565b5f612f6c6019836125cf565b9150612f7782612f38565b602082019050919050565b5f6020820190508181035f830152612f9981612f60565b9050919050565b7f6d696e6d696d756d20636f6e747269627574696f6e206e6f74206d65740000005f82015250565b5f612fd4601d836125cf565b9150612fdf82612fa0565b602082019050919050565b5f6020820190508181035f83015261300181612fc8565b9050919050565b7f746f6b656e73206e6f7420616c6c6f63617465642079657400000000000000005f82015250565b5f61303c6018836125cf565b915061304782613008565b602082019050919050565b5f6020820190508181035f83015261306981613030565b9050919050565b5f81905092915050565b50565b5f6130885f83613070565b91506130938261307a565b5f82019050919050565b5f6130a78261307d565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f6130e5600f836125cf565b91506130f0826130b1565b602082019050919050565b5f6020820190508181035f830152613112816130d9565b9050919050565b5f613123826126da565b915061312e836126da565b925082820390508181111561314657613145612be3565b5b92915050565b5f613156826126da565b9150613161836126da565b925082820261316f816126da565b9150828204841483151761318657613185612be3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131c4826126da565b91506131cf836126da565b9250826131df576131de61318d565b5b828204905092915050565b7f726566756e6473206e6f742063757272656e746c7920616c6c6f7765640000005f82015250565b5f61321e601d836125cf565b9150613229826131ea565b602082019050919050565b5f6020820190508181035f83015261324b81613212565b9050919050565b7f526566756e64206661696c6564000000000000000000000000000000000000005f82015250565b5f613286600d836125cf565b915061329182613252565b602082019050919050565b5f6020820190508181035f8301526132b38161327a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6132ee601f836125cf565b91506132f9826132ba565b602082019050919050565b5f6020820190508181035f83015261331b816132e2565b9050919050565b7f6d696e7420776f756c6420657863656564206d617820737570706c79000000005f82015250565b5f613356601c836125cf565b915061336182613322565b602082019050919050565b5f6020820190508181035f8301526133838161334a565b9050919050565b5f60608201905061339d5f83018661284c565b6133aa602083018561277e565b6133b7604083018461277e565b94935050505056fea2646970667358221220a292fe28445f7a77338bc21e3cc83786d2f78c9184006881fac9d3cfbd3495ba64736f6c63430008140033000000000000000000000000d2b3b9713e47d7c393caaeb5c6409135e0804e24

Deployed Bytecode

0x608060405260043610610292575f3560e01c806379cc679011610159578063b19fde5a116100c0578063d29dbbec11610079578063d29dbbec146109c0578063da191788146109e8578063dd62ed3e14610a10578063e150813714610a4c578063f2fde38b14610a76578063f691c8f814610a9e57610292565b8063b19fde5a146108c6578063b5545a3c14610902578063bbb7ef7c14610918578063bd94fafc14610942578063c26c67b41461096c578063c7b5a48c1461099657610292565b8063910b4fdb11610112578063910b4fdb146107ba57806395d89b41146107f6578063a20238c314610820578063a8ec977914610836578063a9059cbb14610860578063aaa7dfed1461089c57610292565b806379cc6790146106b05780638769c281146106d857806388bb1617146107005780638c5f1e3e1461073c5780638da5cb5b146107665780639091a5851461079057610292565b8063313ce567116101fd57806360f67db1116101b657806360f67db11461059657806370a08231146105be578063715018a6146105fa578063756af45f1461061057806376e2d559146106385780637710f5db1461067457610292565b8063313ce5671461046657806332cb6b0c146104905780634280e767146104ba57806342966c68146104f65780634ba976b11461051e5780635be28bc71461055a57610292565b80631f53ac021161024f5780631f53ac021461035c578063211ce0891461038457806323b872dd146103ae578063280a82dd146103ea5780632cc82655146104145780632d04f8201461043c57610292565b8063038949221461029657806306fdde03146102ac57806308bd0399146102d6578063095ea7b3146102ec57806318160ddd146103285780631cc34ff914610352575b5f80fd5b3480156102a1575f80fd5b506102aa610ac8565b005b3480156102b7575f80fd5b506102c0610bee565b6040516102cd919061264f565b60405180910390f35b3480156102e1575f80fd5b506102ea610c7e565b005b3480156102f7575f80fd5b50610312600480360381019061030d919061270d565b610e8b565b60405161031f9190612765565b60405180910390f35b348015610333575f80fd5b5061033c610ead565b604051610349919061278d565b60405180910390f35b61035a610eb6565b005b348015610367575f80fd5b50610382600480360381019061037d91906127a6565b6111e0565b005b34801561038f575f80fd5b5061039861122b565b6040516103a5919061278d565b60405180910390f35b3480156103b9575f80fd5b506103d460048036038101906103cf91906127d1565b611231565b6040516103e19190612765565b60405180910390f35b3480156103f5575f80fd5b506103fe61125f565b60405161040b919061278d565b60405180910390f35b34801561041f575f80fd5b5061043a60048036038101906104359190612821565b611265565b005b348015610447575f80fd5b506104506112d5565b60405161045d919061285b565b60405180910390f35b348015610471575f80fd5b5061047a6112fa565b604051610487919061288f565b60405180910390f35b34801561049b575f80fd5b506104a4611302565b6040516104b1919061278d565b60405180910390f35b3480156104c5575f80fd5b506104e060048036038101906104db91906127a6565b611308565b6040516104ed919061278d565b60405180910390f35b348015610501575f80fd5b5061051c60048036038101906105179190612821565b61131d565b005b348015610529575f80fd5b50610544600480360381019061053f91906127a6565b611331565b604051610551919061278d565b60405180910390f35b348015610565575f80fd5b50610580600480360381019061057b91906127a6565b611346565b60405161058d9190612765565b60405180910390f35b3480156105a1575f80fd5b506105bc60048036038101906105b79190612821565b611363565b005b3480156105c9575f80fd5b506105e460048036038101906105df91906127a6565b611375565b6040516105f1919061278d565b60405180910390f35b348015610605575f80fd5b5061060e6113ba565b005b34801561061b575f80fd5b50610636600480360381019061063191906128e3565b6113cd565b005b348015610643575f80fd5b5061065e600480360381019061065991906127a6565b611481565b60405161066b919061278d565b60405180910390f35b34801561067f575f80fd5b5061069a600480360381019061069591906127a6565b6116ef565b6040516106a7919061278d565b60405180910390f35b3480156106bb575f80fd5b506106d660048036038101906106d1919061270d565b611704565b005b3480156106e3575f80fd5b506106fe60048036038101906106f99190612938565b611724565b005b34801561070b575f80fd5b50610726600480360381019061072191906127a6565b611748565b604051610733919061278d565b60405180910390f35b348015610747575f80fd5b5061075061175d565b60405161075d919061278d565b60405180910390f35b348015610771575f80fd5b5061077a611763565b604051610787919061285b565b60405180910390f35b34801561079b575f80fd5b506107a461178b565b6040516107b1919061278d565b60405180910390f35b3480156107c5575f80fd5b506107e060048036038101906107db9190612821565b611791565b6040516107ed919061285b565b60405180910390f35b348015610801575f80fd5b5061080a6117cc565b604051610817919061264f565b60405180910390f35b34801561082b575f80fd5b5061083461185c565b005b348015610841575f80fd5b5061084a611884565b604051610857919061278d565b60405180910390f35b34801561086b575f80fd5b506108866004803603810190610881919061270d565b61188a565b6040516108939190612765565b60405180910390f35b3480156108a7575f80fd5b506108b06118ac565b6040516108bd9190612765565b60405180910390f35b3480156108d1575f80fd5b506108ec60048036038101906108e791906127a6565b6118bf565b6040516108f9919061278d565b60405180910390f35b34801561090d575f80fd5b50610916611941565b005b348015610923575f80fd5b5061092c611b0b565b604051610939919061278d565b60405180910390f35b34801561094d575f80fd5b50610956611b11565b604051610963919061278d565b60405180910390f35b348015610977575f80fd5b50610980611b17565b60405161098d9190612765565b60405180910390f35b3480156109a1575f80fd5b506109aa611b29565b6040516109b7919061278d565b60405180910390f35b3480156109cb575f80fd5b506109e660048036038101906109e19190612938565b611b2f565b005b3480156109f3575f80fd5b50610a0e6004803603810190610a099190612aa3565b611b54565b005b348015610a1b575f80fd5b50610a366004803603810190610a319190612aea565b611bf3565b604051610a43919061278d565b60405180910390f35b348015610a57575f80fd5b50610a60611c75565b604051610a6d9190612765565b60405180910390f35b348015610a81575f80fd5b50610a9c6004803603810190610a9791906127a6565b611c87565b005b348015610aa9575f80fd5b50610ab2611d0b565b604051610abf919061278d565b60405180910390f35b610ad0611d11565b60195f9054906101000a900460ff1615610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612b98565b60405180910390fd5b5f5b6014805490508160ff161015610bd1575f60148260ff1681548110610b4957610b48612bb6565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610b7c816118bf565b60175f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550508080610bc990612c10565b915050610b21565b50600160195f6101000a81548160ff021916908315150217905550565b606060038054610bfd90612c65565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2990612c65565b8015610c745780601f10610c4b57610100808354040283529160200191610c74565b820191905f5260205f20905b815481529060010190602001808311610c5757829003601f168201915b5050505050905090565b610c86611d98565b6002600f5414610ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc290612cdf565b60405180910390fd5b5f610cd533611481565b90505f8111610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090612d47565b60405180910390fd5b60175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482610da09190612d65565b1115610de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd890612de2565b60405180910390fd5b4360185f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060165f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610e6f9190612d65565b92505081905550610e803382611de7565b50610e89611e5f565b565b5f80610e95611e69565b9050610ea2818585611e70565b600191505092915050565b5f600254905090565b610ebe611d98565b6001600f5414610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90612e4a565b60405180910390fd5b600e60019054906101000a900460ff1615610fa25760155f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9890612eb2565b60405180910390fd5b5b600b5434600c54610fb39190612d65565b1115610ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610feb90612f1a565b60405180910390fd5b600a543460135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546110409190612d65565b1115611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890612f82565b60405180910390fd5b5f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361116b5760095434101561110a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110190612fea565b60405180910390fd5b601433908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b3460135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111b79190612d65565b9250508190555034600c5f8282546111cf9190612d65565b925050819055506111de611e5f565b565b6111e8611d11565b8060115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60125481565b5f8061123b611e69565b9050611248858285611e82565b611253858585611f14565b60019150509392505050565b600a5481565b61126d611d11565b80600f81905550600281036112d25760195f9054906101000a900460ff166112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190613052565b60405180910390fd5b436012819055505b50565b60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b60075481565b6013602052805f5260405f205f915090505481565b61132e611328611e69565b82612004565b50565b6016602052805f5260405f205f915090505481565b6015602052805f5260405f205f915054906101000a900460ff1681565b61136b611d11565b8060108190555050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6113c2611d11565b6113cb5f612083565b565b6113d5611d11565b5f8173ffffffffffffffffffffffffffffffffffffffff16476040516113fa9061309d565b5f6040518083038185875af1925050503d805f8114611434576040519150601f19603f3d011682016040523d82523d5f602084013e611439565b606091505b505090508061147d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611474906130fb565b60405180910390fd5b5050565b5f805f60165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460175f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461150a9190613119565b90505f60185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f810361155a5760125490505b5f61158a6064601054606485436115719190613119565b61157b919061314c565b61158591906131ba565b612146565b90505f8160648561159b91906131ba565b6115a5919061314c565b90505f61161a606460175f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546064886115f78d611375565b6116019190612d65565b61160b919061314c565b61161591906131ba565b612146565b90508060648361162a91906131ba565b611634919061314c565b95505f60165f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036116e1575f6045606460175f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546116c791906131ba565b6116d1919061314c565b9050868111156116df578096505b505b859650505050505050919050565b6018602052805f5260405f205f915090505481565b61171682611710611e69565b83611e82565b6117208282612004565b5050565b61172c611d11565b80600e5f6101000a81548160ff02191690831515021790555050565b6017602052805f5260405f205f915090505481565b600f5481565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095481565b601481815481106117a0575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546117db90612c65565b80601f016020809104026020016040519081016040528092919081815260200182805461180790612c65565b80156118525780601f1061182957610100808354040283529160200191611852565b820191905f5260205f20905b81548152906001019060200180831161183557829003601f168201915b5050505050905090565b611864611d11565b5f6008546007546118759190613119565b90506118813382611de7565b50565b60105481565b5f80611894611e69565b90506118a1818585611f14565b600191505092915050565b600e60019054906101000a900460ff1681565b5f80600c54606460135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461190e919061314c565b61191891906131ba565b90505f81606460085461192b91906131ba565b611935919061314c565b90508092505050919050565b611949611d98565b600e5f9054906101000a900460ff16611997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198e90613234565b60405180910390fd5b5f3373ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040516119f99061309d565b5f6040518083038185875af1925050503d805f8114611a33576040519150601f19603f3d011682016040523d82523d5f602084013e611a38565b606091505b5050905080611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a739061329c565b60405180910390fd5b5f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60175f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050611b09611e5f565b565b600c5481565b600b5481565b600e5f9054906101000a900460ff1681565b60085481565b611b37611d11565b80600e60016101000a81548160ff02191690831515021790555050565b611b5c611d11565b5f5b81518160ff161015611bef57600160155f848460ff1681518110611b8557611b84612bb6565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080611be790612c10565b915050611b5e565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60195f9054906101000a900460ff1681565b611c8f611d11565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cff575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611cf6919061285b565b60405180910390fd5b611d0881612083565b50565b600d5481565b611d19611e69565b73ffffffffffffffffffffffffffffffffffffffff16611d37611763565b73ffffffffffffffffffffffffffffffffffffffff1614611d9657611d5a611e69565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d8d919061285b565b60405180910390fd5b565b600260055403611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613304565b60405180910390fd5b6002600581905550565b60075481600d54611df89190612d65565b1115611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e309061336c565b60405180910390fd5b80600d5f828254611e4a9190612d65565b92505081905550611e5b828261215e565b5050565b6001600581905550565b5f33905090565b611e7d83838360016121dd565b505050565b5f611e8d8484611bf3565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f0e5781811015611eff578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611ef69392919061338a565b60405180910390fd5b611f0d84848484035f6121dd565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f84575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611f7b919061285b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ff4575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611feb919061285b565b60405180910390fd5b611fff8383836123ac565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612074575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161206b919061285b565b60405180910390fd5b61207f825f836123ac565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8183106121545781612156565b825b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121ce575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121c5919061285b565b60405180910390fd5b6121d95f83836123ac565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361224d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612244919061285b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122bd575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016122b4919061285b565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156123a6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161239d919061278d565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123fc578060025f8282546123f09190612d65565b925050819055506124ca565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612485578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161247c9392919061338a565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612511578060025f828254039250508190555061255b565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125b8919061278d565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156125fc5780820151818401526020810190506125e1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612621826125c5565b61262b81856125cf565b935061263b8185602086016125df565b61264481612607565b840191505092915050565b5f6020820190508181035f8301526126678184612617565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6126a982612680565b9050919050565b6126b98161269f565b81146126c3575f80fd5b50565b5f813590506126d4816126b0565b92915050565b5f819050919050565b6126ec816126da565b81146126f6575f80fd5b50565b5f81359050612707816126e3565b92915050565b5f806040838503121561272357612722612678565b5b5f612730858286016126c6565b9250506020612741858286016126f9565b9150509250929050565b5f8115159050919050565b61275f8161274b565b82525050565b5f6020820190506127785f830184612756565b92915050565b612787816126da565b82525050565b5f6020820190506127a05f83018461277e565b92915050565b5f602082840312156127bb576127ba612678565b5b5f6127c8848285016126c6565b91505092915050565b5f805f606084860312156127e8576127e7612678565b5b5f6127f5868287016126c6565b9350506020612806868287016126c6565b9250506040612817868287016126f9565b9150509250925092565b5f6020828403121561283657612835612678565b5b5f612843848285016126f9565b91505092915050565b6128558161269f565b82525050565b5f60208201905061286e5f83018461284c565b92915050565b5f60ff82169050919050565b61288981612874565b82525050565b5f6020820190506128a25f830184612880565b92915050565b5f6128b282612680565b9050919050565b6128c2816128a8565b81146128cc575f80fd5b50565b5f813590506128dd816128b9565b92915050565b5f602082840312156128f8576128f7612678565b5b5f612905848285016128cf565b91505092915050565b6129178161274b565b8114612921575f80fd5b50565b5f813590506129328161290e565b92915050565b5f6020828403121561294d5761294c612678565b5b5f61295a84828501612924565b91505092915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61299d82612607565b810181811067ffffffffffffffff821117156129bc576129bb612967565b5b80604052505050565b5f6129ce61266f565b90506129da8282612994565b919050565b5f67ffffffffffffffff8211156129f9576129f8612967565b5b602082029050602081019050919050565b5f80fd5b5f612a20612a1b846129df565b6129c5565b90508083825260208201905060208402830185811115612a4357612a42612a0a565b5b835b81811015612a6c5780612a5888826126c6565b845260208401935050602081019050612a45565b5050509392505050565b5f82601f830112612a8a57612a89612963565b5b8135612a9a848260208601612a0e565b91505092915050565b5f60208284031215612ab857612ab7612678565b5b5f82013567ffffffffffffffff811115612ad557612ad461267c565b5b612ae184828501612a76565b91505092915050565b5f8060408385031215612b0057612aff612678565b5b5f612b0d858286016126c6565b9250506020612b1e858286016126c6565b9150509250929050565b7f746f6b656e732063616e206f6e6c7920626520616c6c6f6361746564206f6e635f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f612b826021836125cf565b9150612b8d82612b28565b604082019050919050565b5f6020820190508181035f830152612baf81612b76565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612c1a82612874565b915060ff8203612c2d57612c2c612be3565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612c7c57607f821691505b602082108103612c8f57612c8e612c38565b5b50919050565b7f636c61696d206973206e6f7420616374697665000000000000000000000000005f82015250565b5f612cc96013836125cf565b9150612cd482612c95565b602082019050919050565b5f6020820190508181035f830152612cf681612cbd565b9050919050565b7f6e6f20746f6b656e7320746f20636c61696d00000000000000000000000000005f82015250565b5f612d316012836125cf565b9150612d3c82612cfd565b602082019050919050565b5f6020820190508181035f830152612d5e81612d25565b9050919050565b5f612d6f826126da565b9150612d7a836126da565b9250828201905080821115612d9257612d91612be3565b5b92915050565b7f636c61696d206578636565647320616c6c6f636174696f6e00000000000000005f82015250565b5f612dcc6018836125cf565b9150612dd782612d98565b602082019050919050565b5f6020820190508181035f830152612df981612dc0565b9050919050565b7f70726573616c65206973206e6f742061637469766500000000000000000000005f82015250565b5f612e346015836125cf565b9150612e3f82612e00565b602082019050919050565b5f6020820190508181035f830152612e6181612e28565b9050919050565b7f6e6f74206f6e20616c6c6f7772697a7a737400000000000000000000000000005f82015250565b5f612e9c6012836125cf565b9150612ea782612e68565b602082019050919050565b5f6020820190508181035f830152612ec981612e90565b9050919050565b7f70726573616c65206361702065786365656465640000000000000000000000005f82015250565b5f612f046014836125cf565b9150612f0f82612ed0565b602082019050919050565b5f6020820190508181035f830152612f3181612ef8565b9050919050565b7f636f6e747269627574696f6e20636170206578636565646564000000000000005f82015250565b5f612f6c6019836125cf565b9150612f7782612f38565b602082019050919050565b5f6020820190508181035f830152612f9981612f60565b9050919050565b7f6d696e6d696d756d20636f6e747269627574696f6e206e6f74206d65740000005f82015250565b5f612fd4601d836125cf565b9150612fdf82612fa0565b602082019050919050565b5f6020820190508181035f83015261300181612fc8565b9050919050565b7f746f6b656e73206e6f7420616c6c6f63617465642079657400000000000000005f82015250565b5f61303c6018836125cf565b915061304782613008565b602082019050919050565b5f6020820190508181035f83015261306981613030565b9050919050565b5f81905092915050565b50565b5f6130885f83613070565b91506130938261307a565b5f82019050919050565b5f6130a78261307d565b9150819050919050565b7f5769746864726177206661696c656400000000000000000000000000000000005f82015250565b5f6130e5600f836125cf565b91506130f0826130b1565b602082019050919050565b5f6020820190508181035f830152613112816130d9565b9050919050565b5f613123826126da565b915061312e836126da565b925082820390508181111561314657613145612be3565b5b92915050565b5f613156826126da565b9150613161836126da565b925082820261316f816126da565b9150828204841483151761318657613185612be3565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131c4826126da565b91506131cf836126da565b9250826131df576131de61318d565b5b828204905092915050565b7f726566756e6473206e6f742063757272656e746c7920616c6c6f7765640000005f82015250565b5f61321e601d836125cf565b9150613229826131ea565b602082019050919050565b5f6020820190508181035f83015261324b81613212565b9050919050565b7f526566756e64206661696c6564000000000000000000000000000000000000005f82015250565b5f613286600d836125cf565b915061329182613252565b602082019050919050565b5f6020820190508181035f8301526132b38161327a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6132ee601f836125cf565b91506132f9826132ba565b602082019050919050565b5f6020820190508181035f83015261331b816132e2565b9050919050565b7f6d696e7420776f756c6420657863656564206d617820737570706c79000000005f82015250565b5f613356601c836125cf565b915061336182613322565b602082019050919050565b5f6020820190508181035f8301526133838161334a565b9050919050565b5f60608201905061339d5f83018661284c565b6133aa602083018561277e565b6133b7604083018461277e565b94935050505056fea2646970667358221220a292fe28445f7a77338bc21e3cc83786d2f78c9184006881fac9d3cfbd3495ba64736f6c63430008140033

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

000000000000000000000000d2b3b9713e47d7c393caaeb5c6409135e0804e24

-----Decoded View---------------
Arg [0] : __initialOwner (address): 0xd2B3b9713E47D7C393cAAeB5C6409135E0804E24

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d2b3b9713e47d7c393caaeb5c6409135e0804e24


Deployed Bytecode Sourcemap

47338:9643:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55474:620;;;;;;;;;;;;;:::i;:::-;;35171:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54405:751;;;;;;;;;;;;;:::i;:::-;;37464:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36273:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50706:1445;;;:::i;:::-;;49834:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48680:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38232:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47904:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49462:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48646:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36124:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47646:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48818:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45096:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49191:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49083:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49972:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36435:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28784:103;;;;;;;;;;;;;:::i;:::-;;56777:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52618:1779;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49323:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45514:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50136:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49256:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48474:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28109:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47840:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48997:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35381:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56537:162;;;;;;;;;;;;;:::i;:::-;;48602:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36758:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48302:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55164:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56102:366;;;;;;;;;;;;;:::i;:::-;;48012:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47966:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48207:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47772:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50291:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50400:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37003:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49384:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29042:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48112:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55474:620;27995:13;:11;:13::i;:::-;55651:23:::1;;;;;;;;;;;55650:24;55642:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55804:7;55800:246;55818:27;:34;;;;55815:1;:37;;;55800:246;;;55873:26;55902:27;55930:1;55902:30;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55873:59;;55994:40;56015:18;55994:20;:40::i;:::-;55947:24;:44;55972:18;55947:44;;;;;;;;;;;;;;;:87;;;;55858:188;55854:3;;;;;:::i;:::-;;;;55800:246;;;;56082:4;56056:23;;:30;;;;;;;;;;;;;;;;;;55474:620::o:0;35171:91::-;35216:13;35249:5;35242:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35171:91;:::o;54405:751::-;17905:21;:19;:21::i;:::-;54495:1:::1;54478:13;;:18;54470:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54603:21;54627:27;54643:10;54627:15;:27::i;:::-;54603:51;;54691:1;54675:13;:17;54667:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;54790:24;:36;54815:10;54790:36;;;;;;;;;;;;;;;;54752:22;:34;54775:10;54752:34;;;;;;;;;;;;;;;;54736:13;:50;;;;:::i;:::-;:90;;54728:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54951:12;54920:16;:28;54937:10;54920:28;;;;;;;;;;;;;;;:43;;;;55091:13;55053:22;:34;55076:10;55053:34;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;55117:31;55122:10;55134:13;55117:4;:31::i;:::-;54459:697;17949:20:::0;:18;:20::i;:::-;54405:751::o;37464:190::-;37537:4;37554:13;37570:12;:10;:12::i;:::-;37554:28;;37593:31;37602:5;37609:7;37618:5;37593:8;:31::i;:::-;37642:4;37635:11;;;37464:190;;;;:::o;36273:99::-;36325:7;36352:12;;36345:19;;36273:99;:::o;50706:1445::-;17905:21;:19;:21::i;:::-;50863:1:::1;50846:13;;:18;50838:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50907:16;;;;;;;;;;;50903:155;;;50998:13;:25;51012:10;50998:25;;;;;;;;;;;;;;;;;;;;;;;;;50990:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:155;51189:11;;51176:9;51146:27;;:39;;;;:::i;:::-;:54;;51124:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;51386:24;;51373:9;51339:19;:31;51359:10;51339:31;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:71;;51317:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;51607:1;51572:19;:31;51592:10;51572:31;;;;;;;;;;;;;;;;:36:::0;51568:309:::1;;51742:28;;51729:9;:41;;51721:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;51821:27;51854:10;51821:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51568:309;52027:9;51992:19;:31;52012:10;51992:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;52134:9;52103:27;;:40;;;;;;;:::i;:::-;;;;;;;;17949:20:::0;:18;:20::i;:::-;50706:1445::o;49834:101::-;27995:13;:11;:13::i;:::-;49917:10:::1;49904;;:23;;;;;;;;;;;;;;;;;;49834:101:::0;:::o;48680:33::-;;;;:::o;38232:249::-;38319:4;38336:15;38354:12;:10;:12::i;:::-;38336:30;;38377:37;38393:4;38399:7;38408:5;38377:15;:37::i;:::-;38425:26;38435:4;38441:2;38445:5;38425:9;:26::i;:::-;38469:4;38462:11;;;38232:249;;;;;:::o;47904:53::-;;;;:::o;49462:335::-;27995:13;:11;:13::i;:::-;49540:6:::1;49524:13;:22;;;;49571:1;49561:6;:11:::0;49557:233:::1;;49678:23;;;;;;;;;;;49670:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49766:12;49745:18;:33;;;;49557:233;49462:335:::0;:::o;48646:25::-;;;;;;;;;;;;;:::o;36124:84::-;36173:5;36198:2;36191:9;;36124:84;:::o;47646:54::-;;;;:::o;48818:55::-;;;;;;;;;;;;;;;;;:::o;45096:89::-;45151:26;45157:12;:10;:12::i;:::-;45171:5;45151;:26::i;:::-;45096:89;:::o;49191:58::-;;;;;;;;;;;;;;;;;:::o;49083:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;49972:111::-;27995:13;:11;:13::i;:::-;50060:15:::1;50047:10;:28;;;;49972:111:::0;:::o;36435:118::-;36500:7;36527:9;:18;36537:7;36527:18;;;;;;;;;;;;;;;;36520:25;;36435:118;;;:::o;28784:103::-;27995:13;:11;:13::i;:::-;28849:30:::1;28876:1;28849:18;:30::i;:::-;28784:103::o:0;56777:201::-;27995:13;:11;:13::i;:::-;56859:12:::1;56877:8;:13;;56898:21;56877:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56858:66;;;56943:7;56935:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;56847:131;56777:201:::0;:::o;52618:1779::-;52682:7;52751:22;52861:23;52924:22;:32;52947:8;52924:32;;;;;;;;;;;;;;;;52887:24;:34;52912:8;52887:34;;;;;;;;;;;;;;;;:69;;;;:::i;:::-;52861:95;;53032:17;53052:16;:26;53069:8;53052:26;;;;;;;;;;;;;;;;53032:46;;53195:1;53182:9;:14;53178:76;;53224:18;;53212:30;;53178:76;53338:32;53373:64;53382:3;53425:10;;53418:3;53405:9;53390:12;:24;;;;:::i;:::-;53389:32;;;;:::i;:::-;53388:47;;;;:::i;:::-;53373:8;:64::i;:::-;53338:99;;53543:25;53597:24;53590:3;53572:15;:21;;;;:::i;:::-;53571:50;;;;:::i;:::-;53543:78;;53684:36;53723:101;53732:3;53788:24;:34;53813:8;53788:34;;;;;;;;;;;;;;;;53781:3;53762:15;53740:19;53750:8;53740:9;:19::i;:::-;:37;;;;:::i;:::-;53739:45;;;;:::i;:::-;53738:84;;;;:::i;:::-;53723:8;:101::i;:::-;53684:140;;53966:28;53959:3;53939:17;:23;;;;:::i;:::-;53938:56;;;;:::i;:::-;53921:73;;54145:1;54109:22;:32;54132:8;54109:32;;;;;;;;;;;;;;;;:37;54105:251;;54162:20;54230:2;54223:3;54186:24;:34;54211:8;54186:34;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;54185:47;;;;:::i;:::-;54162:70;;54266:14;54251:12;:29;54247:98;;;54317:12;54300:29;;54247:98;54147:209;54105:251;54375:14;54368:21;;;;;;;;52618:1779;;;:::o;49323:52::-;;;;;;;;;;;;;;;;;:::o;45514:161::-;45590:45;45606:7;45615:12;:10;:12::i;:::-;45629:5;45590:15;:45::i;:::-;45646:21;45652:7;45661:5;45646;:21::i;:::-;45514:161;;:::o;50136:101::-;27995:13;:11;:13::i;:::-;50223:6:::1;50199:21;;:30;;;;;;;;;;;;;;;;;;50136:101:::0;:::o;49256:60::-;;;;;;;;;;;;;;;;;:::o;48474:28::-;;;;:::o;28109:87::-;28155:7;28182:6;;;;;;;;;;;28175:13;;28109:87;:::o;47840:55::-;;;;:::o;48997:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35381:95::-;35428:13;35461:7;35454:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35381:95;:::o;56537:162::-;27995:13;:11;:13::i;:::-;56590:23:::1;56629:18;;56616:10;;:31;;;;:::i;:::-;56590:57;;56658:33;56663:10;56675:15;56658:4;:33::i;:::-;56579:120;56537:162::o:0;48602:34::-;;;;:::o;36758:182::-;36827:4;36844:13;36860:12;:10;:12::i;:::-;36844:28;;36883:27;36893:5;36900:2;36904:5;36883:9;:27::i;:::-;36928:4;36921:11;;;36758:182;;;;:::o;48302:35::-;;;;;;;;;;;;;:::o;55164:302::-;55233:7;55253:22;55316:27;;55310:3;55278:19;:29;55298:8;55278:29;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:65;;;;:::i;:::-;55253:90;;55354:24;55410:14;55403:3;55382:18;;:24;;;;:::i;:::-;55381:43;;;;:::i;:::-;55354:70;;55442:16;55435:23;;;;55164:302;;;:::o;56102:366::-;17905:21;:19;:21::i;:::-;56164::::1;;;;;;;;;;;56156:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56240:12;56258:10;:15;;56281:19;:31;56301:10;56281:31;;;;;;;;;;;;;;;;56258:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56239:78;;;56336:7;56328:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;56408:1;56374:19;:31;56394:10;56374:31;;;;;;;;;;;;;;;:35;;;;56459:1;56420:24;:36;56445:10;56420:36;;;;;;;;;;;;;;;:40;;;;56145:323;17949:20:::0;:18;:20::i;:::-;56102:366::o;48012:42::-;;;;:::o;47966:37::-;;;;:::o;48207:33::-;;;;;;;;;;;;;:::o;47772:59::-;;;;:::o;50291:101::-;27995:13;:11;:13::i;:::-;50378:6:::1;50359:16;;:25;;;;;;;;;;;;;;;;;;50291:101:::0;:::o;50400:266::-;27995:13;:11;:13::i;:::-;50560:7:::1;50556:103;50574:10;:17;50571:1;:20;;;50556:103;;;50643:4;50612:13;:28;50626:10;50637:1;50626:13;;;;;;;;;;:::i;:::-;;;;;;;;50612:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;50593:3;;;;;:::i;:::-;;;;50556:103;;;;50400:266:::0;:::o;37003:142::-;37083:7;37110:11;:18;37122:5;37110:18;;;;;;;;;;;;;;;:27;37129:7;37110:27;;;;;;;;;;;;;;;;37103:34;;37003:142;;;;:::o;49384:35::-;;;;;;;;;;;;;:::o;29042:220::-;27995:13;:11;:13::i;:::-;29147:1:::1;29127:22;;:8;:22;;::::0;29123:93:::1;;29201:1;29173:31;;;;;;;;;;;:::i;:::-;;;;;;;;29123:93;29226:28;29245:8;29226:18;:28::i;:::-;29042:220:::0;:::o;48112:33::-;;;;:::o;28274:166::-;28345:12;:10;:12::i;:::-;28334:23;;:7;:5;:7::i;:::-;:23;;;28330:103;;28408:12;:10;:12::i;:::-;28381:40;;;;;;;;;;;:::i;:::-;;;;;;;;28330:103;28274:166::o;17985:293::-;17387:1;18119:7;;:19;18111:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;17387:1;18252:7;:18;;;;17985:293::o;52159:377::-;52334:10;;52324:6;52303:18;;:27;;;;:::i;:::-;:41;;52295:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52463:6;52441:18;;:28;;;;;;;:::i;:::-;;;;;;;;52511:17;52517:2;52521:6;52511:5;:17::i;:::-;52159:377;;:::o;18286:213::-;17343:1;18469:7;:22;;;;18286:213::o;26225:98::-;26278:7;26305:10;26298:17;;26225:98;:::o;42291:130::-;42376:37;42385:5;42392:7;42401:5;42408:4;42376:8;:37::i;:::-;42291:130;;;:::o;44007:487::-;44107:24;44134:25;44144:5;44151:7;44134:9;:25::i;:::-;44107:52;;44194:17;44174:16;:37;44170:317;;44251:5;44232:16;:24;44228:132;;;44311:7;44320:16;44338:5;44284:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;44228:132;44403:57;44412:5;44419:7;44447:5;44428:16;:24;44454:5;44403:8;:57::i;:::-;44170:317;44096:398;44007:487;;;:::o;38866:308::-;38966:1;38950:18;;:4;:18;;;38946:88;;39019:1;38992:30;;;;;;;;;;;:::i;:::-;;;;;;;;38946:88;39062:1;39048:16;;:2;:16;;;39044:88;;39117:1;39088:32;;;;;;;;;;;:::i;:::-;;;;;;;;39044:88;39142:24;39150:4;39156:2;39160:5;39142:7;:24::i;:::-;38866:308;;;:::o;41527:211::-;41617:1;41598:21;;:7;:21;;;41594:91;;41670:1;41643:30;;;;;;;;;;;:::i;:::-;;;;;;;;41594:91;41695:35;41703:7;41720:1;41724:5;41695:7;:35::i;:::-;41527:211;;:::o;29422:191::-;29496:16;29515:6;;;;;;;;;;;29496:25;;29541:8;29532:6;;:17;;;;;;;;;;;;;;;;;;29596:8;29565:40;;29586:8;29565:40;;;;;;;;;;;;29485:128;29422:191;:::o;2669:106::-;2727:7;2758:1;2754;:5;:13;;2766:1;2754:13;;;2762:1;2754:13;2747:20;;2669:106;;;;:::o;40986:213::-;41076:1;41057:21;;:7;:21;;;41053:93;;41131:1;41102:32;;;;;;;;;;;:::i;:::-;;;;;;;;41053:93;41156:35;41172:1;41176:7;41185:5;41156:7;:35::i;:::-;40986:213;;:::o;43272:443::-;43402:1;43385:19;;:5;:19;;;43381:91;;43457:1;43428:32;;;;;;;;;;;:::i;:::-;;;;;;;;43381:91;43505:1;43486:21;;:7;:21;;;43482:92;;43559:1;43531:31;;;;;;;;;;;:::i;:::-;;;;;;;;43482:92;43614:5;43584:11;:18;43596:5;43584:18;;;;;;;;;;;;;;;:27;43603:7;43584:27;;;;;;;;;;;;;;;:35;;;;43634:9;43630:78;;;43681:7;43665:31;;43674:5;43665:31;;;43690:5;43665:31;;;;;;:::i;:::-;;;;;;;;43630:78;43272:443;;;;:::o;39498:1135::-;39604:1;39588:18;;:4;:18;;;39584:552;;39742:5;39726:12;;:21;;;;;;;:::i;:::-;;;;;;;;39584:552;;;39780:19;39802:9;:15;39812:4;39802:15;;;;;;;;;;;;;;;;39780:37;;39850:5;39836:11;:19;39832:117;;;39908:4;39914:11;39927:5;39883:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;39832:117;40104:5;40090:11;:19;40072:9;:15;40082:4;40072:15;;;;;;;;;;;;;;;:37;;;;39765:371;39584:552;40166:1;40152:16;;:2;:16;;;40148:435;;40334:5;40318:12;;:21;;;;;;;;;;;40148:435;;;40551:5;40534:9;:13;40544:2;40534:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;40148:435;40615:2;40600:25;;40609:4;40600:25;;;40619:5;40600:25;;;;;;:::i;:::-;;;;;;;;39498:1135;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:329::-;3857:6;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;3798:329;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:329::-;4817:6;4866:2;4854:9;4845:7;4841:23;4837:32;4834:119;;;4872:79;;:::i;:::-;4834:119;4992:1;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4963:117;4758:329;;;;:::o;5093:118::-;5180:24;5198:5;5180:24;:::i;:::-;5175:3;5168:37;5093:118;;:::o;5217:222::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5361:71;5429:1;5418:9;5414:17;5405:6;5361:71;:::i;:::-;5217:222;;;;:::o;5445:86::-;5480:7;5520:4;5513:5;5509:16;5498:27;;5445:86;;;:::o;5537:112::-;5620:22;5636:5;5620:22;:::i;:::-;5615:3;5608:35;5537:112;;:::o;5655:214::-;5744:4;5782:2;5771:9;5767:18;5759:26;;5795:67;5859:1;5848:9;5844:17;5835:6;5795:67;:::i;:::-;5655:214;;;;:::o;5875:104::-;5920:7;5949:24;5967:5;5949:24;:::i;:::-;5938:35;;5875:104;;;:::o;5985:138::-;6066:32;6092:5;6066:32;:::i;:::-;6059:5;6056:43;6046:71;;6113:1;6110;6103:12;6046:71;5985:138;:::o;6129:155::-;6183:5;6221:6;6208:20;6199:29;;6237:41;6272:5;6237:41;:::i;:::-;6129:155;;;;:::o;6290:345::-;6357:6;6406:2;6394:9;6385:7;6381:23;6377:32;6374:119;;;6412:79;;:::i;:::-;6374:119;6532:1;6557:61;6610:7;6601:6;6590:9;6586:22;6557:61;:::i;:::-;6547:71;;6503:125;6290:345;;;;:::o;6641:116::-;6711:21;6726:5;6711:21;:::i;:::-;6704:5;6701:32;6691:60;;6747:1;6744;6737:12;6691:60;6641:116;:::o;6763:133::-;6806:5;6844:6;6831:20;6822:29;;6860:30;6884:5;6860:30;:::i;:::-;6763:133;;;;:::o;6902:323::-;6958:6;7007:2;6995:9;6986:7;6982:23;6978:32;6975:119;;;7013:79;;:::i;:::-;6975:119;7133:1;7158:50;7200:7;7191:6;7180:9;7176:22;7158:50;:::i;:::-;7148:60;;7104:114;6902:323;;;;:::o;7231:117::-;7340:1;7337;7330:12;7354:180;7402:77;7399:1;7392:88;7499:4;7496:1;7489:15;7523:4;7520:1;7513:15;7540:281;7623:27;7645:4;7623:27;:::i;:::-;7615:6;7611:40;7753:6;7741:10;7738:22;7717:18;7705:10;7702:34;7699:62;7696:88;;;7764:18;;:::i;:::-;7696:88;7804:10;7800:2;7793:22;7583:238;7540:281;;:::o;7827:129::-;7861:6;7888:20;;:::i;:::-;7878:30;;7917:33;7945:4;7937:6;7917:33;:::i;:::-;7827:129;;;:::o;7962:311::-;8039:4;8129:18;8121:6;8118:30;8115:56;;;8151:18;;:::i;:::-;8115:56;8201:4;8193:6;8189:17;8181:25;;8261:4;8255;8251:15;8243:23;;7962:311;;;:::o;8279:117::-;8388:1;8385;8378:12;8419:710;8515:5;8540:81;8556:64;8613:6;8556:64;:::i;:::-;8540:81;:::i;:::-;8531:90;;8641:5;8670:6;8663:5;8656:21;8704:4;8697:5;8693:16;8686:23;;8757:4;8749:6;8745:17;8737:6;8733:30;8786:3;8778:6;8775:15;8772:122;;;8805:79;;:::i;:::-;8772:122;8920:6;8903:220;8937:6;8932:3;8929:15;8903:220;;;9012:3;9041:37;9074:3;9062:10;9041:37;:::i;:::-;9036:3;9029:50;9108:4;9103:3;9099:14;9092:21;;8979:144;8963:4;8958:3;8954:14;8947:21;;8903:220;;;8907:21;8521:608;;8419:710;;;;;:::o;9152:370::-;9223:5;9272:3;9265:4;9257:6;9253:17;9249:27;9239:122;;9280:79;;:::i;:::-;9239:122;9397:6;9384:20;9422:94;9512:3;9504:6;9497:4;9489:6;9485:17;9422:94;:::i;:::-;9413:103;;9229:293;9152:370;;;;:::o;9528:539::-;9612:6;9661:2;9649:9;9640:7;9636:23;9632:32;9629:119;;;9667:79;;:::i;:::-;9629:119;9815:1;9804:9;9800:17;9787:31;9845:18;9837:6;9834:30;9831:117;;;9867:79;;:::i;:::-;9831:117;9972:78;10042:7;10033:6;10022:9;10018:22;9972:78;:::i;:::-;9962:88;;9758:302;9528:539;;;;:::o;10073:474::-;10141:6;10149;10198:2;10186:9;10177:7;10173:23;10169:32;10166:119;;;10204:79;;:::i;:::-;10166:119;10324:1;10349:53;10394:7;10385:6;10374:9;10370:22;10349:53;:::i;:::-;10339:63;;10295:117;10451:2;10477:53;10522:7;10513:6;10502:9;10498:22;10477:53;:::i;:::-;10467:63;;10422:118;10073:474;;;;;:::o;10553:220::-;10693:34;10689:1;10681:6;10677:14;10670:58;10762:3;10757:2;10749:6;10745:15;10738:28;10553:220;:::o;10779:366::-;10921:3;10942:67;11006:2;11001:3;10942:67;:::i;:::-;10935:74;;11018:93;11107:3;11018:93;:::i;:::-;11136:2;11131:3;11127:12;11120:19;;10779:366;;;:::o;11151:419::-;11317:4;11355:2;11344:9;11340:18;11332:26;;11404:9;11398:4;11394:20;11390:1;11379:9;11375:17;11368:47;11432:131;11558:4;11432:131;:::i;:::-;11424:139;;11151:419;;;:::o;11576:180::-;11624:77;11621:1;11614:88;11721:4;11718:1;11711:15;11745:4;11742:1;11735:15;11762:180;11810:77;11807:1;11800:88;11907:4;11904:1;11897:15;11931:4;11928:1;11921:15;11948:167;11985:3;12008:22;12024:5;12008:22;:::i;:::-;11999:31;;12052:4;12045:5;12042:15;12039:41;;12060:18;;:::i;:::-;12039:41;12107:1;12100:5;12096:13;12089:20;;11948:167;;;:::o;12121:180::-;12169:77;12166:1;12159:88;12266:4;12263:1;12256:15;12290:4;12287:1;12280:15;12307:320;12351:6;12388:1;12382:4;12378:12;12368:22;;12435:1;12429:4;12425:12;12456:18;12446:81;;12512:4;12504:6;12500:17;12490:27;;12446:81;12574:2;12566:6;12563:14;12543:18;12540:38;12537:84;;12593:18;;:::i;:::-;12537:84;12358:269;12307:320;;;:::o;12633:169::-;12773:21;12769:1;12761:6;12757:14;12750:45;12633:169;:::o;12808:366::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12808:366;;;:::o;13180:419::-;13346:4;13384:2;13373:9;13369:18;13361:26;;13433:9;13427:4;13423:20;13419:1;13408:9;13404:17;13397:47;13461:131;13587:4;13461:131;:::i;:::-;13453:139;;13180:419;;;:::o;13605:168::-;13745:20;13741:1;13733:6;13729:14;13722:44;13605:168;:::o;13779:366::-;13921:3;13942:67;14006:2;14001:3;13942:67;:::i;:::-;13935:74;;14018:93;14107:3;14018:93;:::i;:::-;14136:2;14131:3;14127:12;14120:19;;13779:366;;;:::o;14151:419::-;14317:4;14355:2;14344:9;14340:18;14332:26;;14404:9;14398:4;14394:20;14390:1;14379:9;14375:17;14368:47;14432:131;14558:4;14432:131;:::i;:::-;14424:139;;14151:419;;;:::o;14576:191::-;14616:3;14635:20;14653:1;14635:20;:::i;:::-;14630:25;;14669:20;14687:1;14669:20;:::i;:::-;14664:25;;14712:1;14709;14705:9;14698:16;;14733:3;14730:1;14727:10;14724:36;;;14740:18;;:::i;:::-;14724:36;14576:191;;;;:::o;14773:174::-;14913:26;14909:1;14901:6;14897:14;14890:50;14773:174;:::o;14953:366::-;15095:3;15116:67;15180:2;15175:3;15116:67;:::i;:::-;15109:74;;15192:93;15281:3;15192:93;:::i;:::-;15310:2;15305:3;15301:12;15294:19;;14953:366;;;:::o;15325:419::-;15491:4;15529:2;15518:9;15514:18;15506:26;;15578:9;15572:4;15568:20;15564:1;15553:9;15549:17;15542:47;15606:131;15732:4;15606:131;:::i;:::-;15598:139;;15325:419;;;:::o;15750:171::-;15890:23;15886:1;15878:6;15874:14;15867:47;15750:171;:::o;15927:366::-;16069:3;16090:67;16154:2;16149:3;16090:67;:::i;:::-;16083:74;;16166:93;16255:3;16166:93;:::i;:::-;16284:2;16279:3;16275:12;16268:19;;15927:366;;;:::o;16299:419::-;16465:4;16503:2;16492:9;16488:18;16480:26;;16552:9;16546:4;16542:20;16538:1;16527:9;16523:17;16516:47;16580:131;16706:4;16580:131;:::i;:::-;16572:139;;16299:419;;;:::o;16724:168::-;16864:20;16860:1;16852:6;16848:14;16841:44;16724:168;:::o;16898:366::-;17040:3;17061:67;17125:2;17120:3;17061:67;:::i;:::-;17054:74;;17137:93;17226:3;17137:93;:::i;:::-;17255:2;17250:3;17246:12;17239:19;;16898:366;;;:::o;17270:419::-;17436:4;17474:2;17463:9;17459:18;17451:26;;17523:9;17517:4;17513:20;17509:1;17498:9;17494:17;17487:47;17551:131;17677:4;17551:131;:::i;:::-;17543:139;;17270:419;;;:::o;17695:170::-;17835:22;17831:1;17823:6;17819:14;17812:46;17695:170;:::o;17871:366::-;18013:3;18034:67;18098:2;18093:3;18034:67;:::i;:::-;18027:74;;18110:93;18199:3;18110:93;:::i;:::-;18228:2;18223:3;18219:12;18212:19;;17871:366;;;:::o;18243:419::-;18409:4;18447:2;18436:9;18432:18;18424:26;;18496:9;18490:4;18486:20;18482:1;18471:9;18467:17;18460:47;18524:131;18650:4;18524:131;:::i;:::-;18516:139;;18243:419;;;:::o;18668:175::-;18808:27;18804:1;18796:6;18792:14;18785:51;18668:175;:::o;18849:366::-;18991:3;19012:67;19076:2;19071:3;19012:67;:::i;:::-;19005:74;;19088:93;19177:3;19088:93;:::i;:::-;19206:2;19201:3;19197:12;19190:19;;18849:366;;;:::o;19221:419::-;19387:4;19425:2;19414:9;19410:18;19402:26;;19474:9;19468:4;19464:20;19460:1;19449:9;19445:17;19438:47;19502:131;19628:4;19502:131;:::i;:::-;19494:139;;19221:419;;;:::o;19646:179::-;19786:31;19782:1;19774:6;19770:14;19763:55;19646:179;:::o;19831:366::-;19973:3;19994:67;20058:2;20053:3;19994:67;:::i;:::-;19987:74;;20070:93;20159:3;20070:93;:::i;:::-;20188:2;20183:3;20179:12;20172:19;;19831:366;;;:::o;20203:419::-;20369:4;20407:2;20396:9;20392:18;20384:26;;20456:9;20450:4;20446:20;20442:1;20431:9;20427:17;20420:47;20484:131;20610:4;20484:131;:::i;:::-;20476:139;;20203:419;;;:::o;20628:174::-;20768:26;20764:1;20756:6;20752:14;20745:50;20628:174;:::o;20808:366::-;20950:3;20971:67;21035:2;21030:3;20971:67;:::i;:::-;20964:74;;21047:93;21136:3;21047:93;:::i;:::-;21165:2;21160:3;21156:12;21149:19;;20808:366;;;:::o;21180:419::-;21346:4;21384:2;21373:9;21369:18;21361:26;;21433:9;21427:4;21423:20;21419:1;21408:9;21404:17;21397:47;21461:131;21587:4;21461:131;:::i;:::-;21453:139;;21180:419;;;:::o;21605:147::-;21706:11;21743:3;21728:18;;21605:147;;;;:::o;21758:114::-;;:::o;21878:398::-;22037:3;22058:83;22139:1;22134:3;22058:83;:::i;:::-;22051:90;;22150:93;22239:3;22150:93;:::i;:::-;22268:1;22263:3;22259:11;22252:18;;21878:398;;;:::o;22282:379::-;22466:3;22488:147;22631:3;22488:147;:::i;:::-;22481:154;;22652:3;22645:10;;22282:379;;;:::o;22667:165::-;22807:17;22803:1;22795:6;22791:14;22784:41;22667:165;:::o;22838:366::-;22980:3;23001:67;23065:2;23060:3;23001:67;:::i;:::-;22994:74;;23077:93;23166:3;23077:93;:::i;:::-;23195:2;23190:3;23186:12;23179:19;;22838:366;;;:::o;23210:419::-;23376:4;23414:2;23403:9;23399:18;23391:26;;23463:9;23457:4;23453:20;23449:1;23438:9;23434:17;23427:47;23491:131;23617:4;23491:131;:::i;:::-;23483:139;;23210:419;;;:::o;23635:194::-;23675:4;23695:20;23713:1;23695:20;:::i;:::-;23690:25;;23729:20;23747:1;23729:20;:::i;:::-;23724:25;;23773:1;23770;23766:9;23758:17;;23797:1;23791:4;23788:11;23785:37;;;23802:18;;:::i;:::-;23785:37;23635:194;;;;:::o;23835:410::-;23875:7;23898:20;23916:1;23898:20;:::i;:::-;23893:25;;23932:20;23950:1;23932:20;:::i;:::-;23927:25;;23987:1;23984;23980:9;24009:30;24027:11;24009:30;:::i;:::-;23998:41;;24188:1;24179:7;24175:15;24172:1;24169:22;24149:1;24142:9;24122:83;24099:139;;24218:18;;:::i;:::-;24099:139;23883:362;23835:410;;;;:::o;24251:180::-;24299:77;24296:1;24289:88;24396:4;24393:1;24386:15;24420:4;24417:1;24410:15;24437:185;24477:1;24494:20;24512:1;24494:20;:::i;:::-;24489:25;;24528:20;24546:1;24528:20;:::i;:::-;24523:25;;24567:1;24557:35;;24572:18;;:::i;:::-;24557:35;24614:1;24611;24607:9;24602:14;;24437:185;;;;:::o;24628:179::-;24768:31;24764:1;24756:6;24752:14;24745:55;24628:179;:::o;24813:366::-;24955:3;24976:67;25040:2;25035:3;24976:67;:::i;:::-;24969:74;;25052:93;25141:3;25052:93;:::i;:::-;25170:2;25165:3;25161:12;25154:19;;24813:366;;;:::o;25185:419::-;25351:4;25389:2;25378:9;25374:18;25366:26;;25438:9;25432:4;25428:20;25424:1;25413:9;25409:17;25402:47;25466:131;25592:4;25466:131;:::i;:::-;25458:139;;25185:419;;;:::o;25610:163::-;25750:15;25746:1;25738:6;25734:14;25727:39;25610:163;:::o;25779:366::-;25921:3;25942:67;26006:2;26001:3;25942:67;:::i;:::-;25935:74;;26018:93;26107:3;26018:93;:::i;:::-;26136:2;26131:3;26127:12;26120:19;;25779:366;;;:::o;26151:419::-;26317:4;26355:2;26344:9;26340:18;26332:26;;26404:9;26398:4;26394:20;26390:1;26379:9;26375:17;26368:47;26432:131;26558:4;26432:131;:::i;:::-;26424:139;;26151:419;;;:::o;26576:181::-;26716:33;26712:1;26704:6;26700:14;26693:57;26576:181;:::o;26763:366::-;26905:3;26926:67;26990:2;26985:3;26926:67;:::i;:::-;26919:74;;27002:93;27091:3;27002:93;:::i;:::-;27120:2;27115:3;27111:12;27104:19;;26763:366;;;:::o;27135:419::-;27301:4;27339:2;27328:9;27324:18;27316:26;;27388:9;27382:4;27378:20;27374:1;27363:9;27359:17;27352:47;27416:131;27542:4;27416:131;:::i;:::-;27408:139;;27135:419;;;:::o;27560:178::-;27700:30;27696:1;27688:6;27684:14;27677:54;27560:178;:::o;27744:366::-;27886:3;27907:67;27971:2;27966:3;27907:67;:::i;:::-;27900:74;;27983:93;28072:3;27983:93;:::i;:::-;28101:2;28096:3;28092:12;28085:19;;27744:366;;;:::o;28116:419::-;28282:4;28320:2;28309:9;28305:18;28297:26;;28369:9;28363:4;28359:20;28355:1;28344:9;28340:17;28333:47;28397:131;28523:4;28397:131;:::i;:::-;28389:139;;28116:419;;;:::o;28541:442::-;28690:4;28728:2;28717:9;28713:18;28705:26;;28741:71;28809:1;28798:9;28794:17;28785:6;28741:71;:::i;:::-;28822:72;28890:2;28879:9;28875:18;28866:6;28822:72;:::i;:::-;28904;28972:2;28961:9;28957:18;28948:6;28904:72;:::i;:::-;28541:442;;;;;;:::o

Swarm Source

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