ETH Price: $2,957.41 (+0.03%)

Token

GBOT (GBOT)

Overview

Max Total Supply

100,000 GBOT

Holders

928

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
0x: Exchange Proxy Flash Wallet
Balance
0.000000000000000001 GBOT

Value
$0.00
0xdB6f1920A889355780aF7570773609Bd8Cb1f498
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
GBOT

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2023-08-17
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

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

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @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 up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (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; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                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.
            require(denominator > prod1, "Math: mulDiv overflow");

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

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            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 (rounding == Rounding.Up && 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 down.
     *
     * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

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


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

pragma solidity ^0.8.0;



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

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toString(int256 value) internal pure returns (string memory) {
        return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

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

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

// File: taxable.sol



pragma solidity ^0.8.0; // Must use solidity 0.8.0 or higher. Math isn't so safe otherwise...


abstract contract Taxable is Context {

/// @dev Events defined for any contract changes.

	event TaxOn(address account); // Emits event "Tax On" when tax is enabled, returning the address of the Governor.
	event TaxOff(address account); // Emits event "Tax Off" when tax is disabled, returning the address of the Governor.
    event TaxChanged(address account); // Emits event "Tax Changed" when tax amount is updated, returning the address of the Governor.
	event TaxDestinationChanged(address account); // Emits event "Tax Destination Changed" when tax destination is changed, returning the address of the President.

/// @dev Name and type of constants defined.

	bool private _taxed; // Stores whether tax is enabled/disabled in a boolean.
	uint private _thetax; // Stores tax amount as a uint256 integer.
    uint private _maxtax; // Stores maximum tax amount as a uint256 integer.
    uint private _mintax; // Stores minimum tax amount as a uint256 integer.
    address private _taxdestination; // Stores tax destination as a blockchain address type.

/// @dev Constructor adds values to constants by passing arguments from token constructor.

	constructor(bool __taxed, uint __thetax, uint __maxtax, uint __mintax, address __taxdestination) {
        _taxed = __taxed; // Recommended: false 
        _thetax = __thetax; // Recommended: 1000 ; 1000 = 10%
        _maxtax = __maxtax; // Recommended: 1500 ; 1500 = 15%
        _mintax = __mintax; // Recommended: 25 ; 25 = 0.25%
        _taxdestination = __taxdestination;
    }

/// @dev Modifiers throw errors if conditions are not met.

	modifier whenNotTaxed() { // Modifier for requiring the tax be off in order for the caller function to work.
        _requireNotTaxed(); // Function requires tax be off.
        _;
    }

	modifier whenTaxed() { // Modifier for requiring the tax be on in order for the caller function to work.
        _requireTaxed(); // Function requires tax be on.
        _;
    }

/// @dev Public view functions allow privately stored constants to be interfaced.

	function taxed() public view virtual returns (bool) { // Function enables public interface for tax enabled/disabled boolean.
        return _taxed; // Returns true if tax is enabled, false if it is disabled.
    }

    function thetax() public view virtual returns (uint) { // Function enables public interface for tax amount in points.
        return _thetax; // Returns the current tax amount in points.
    }

    function taxdestination() public view virtual returns (address) { // Function enables public interface for tax destination address.
        return _taxdestination; // Returns the destination address for the tax.
    }
 

/// @dev Internal view functions contain the require() statements for the modifiers to use.

	function _requireNotTaxed() internal view virtual { // Function is used in the whenNotTaxed() modifier.
        require(!taxed(), "Taxable: taxed"); // Throws the call if the tax is disabled.
    }

	function _requireTaxed() internal view virtual { // Function is used in the whenTaxed() modifier.
        require(taxed(), "Taxable: not taxed"); // Throws the call if the tax is enabled.
    }

/// @dev Internal virtual functions perform the requested contract updates and emit the events to the blockchain.

	function _taxon() internal virtual whenNotTaxed { // Function turns on the tax if it was disabled and emits "Tax On" event.
        _taxed = true; // Sets the tax enabled boolean to true, enabling the tax.
        emit TaxOn(_msgSender()); // Emits the "Tax On" event to the blockchain.
    }

	function _taxoff() internal virtual whenTaxed { // Function turns off the tax if it was enabled and emits "Tax Off" event.
        _taxed = false; // Sets the tax enabled boolean to false, disabling the tax.
        emit TaxOff(_msgSender()); // Emits the "Tax Off" event to the blockchain.
    }

    function _updatetax(uint newtax) internal virtual { // Function updates the tax amount if in allowable range and emits "Tax Changed" event.
        require(newtax <= _maxtax, "Taxable: tax is too high"); // Throws the call if the new tax is above the maximum tax.
        require(newtax >= _mintax, "Taxable: tax is too low"); // Throws the call if the new tax is below the minimum tax.
        _thetax = newtax; // Sets the tax amount integer to the new value, updating the tax amount.
        emit TaxChanged(_msgSender());  // Emits the "Tax Changed" event to the blockchain.
    }

	function _updatetaxdestination(address newdestination) internal virtual { // Function updates the tax destination address and emits "Tax Destination Changed" event.
        _taxdestination = newdestination;
        emit TaxDestinationChanged(_msgSender());  // Emits the "Tax Destination Changed" event to the blockchain.
    }
}
// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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 v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

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

// 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: taxtoken.sol



pragma solidity ^0.8.4;






contract GBOT is ReentrancyGuard, ERC20, AccessControl, Taxable, Ownable {

    bytes32 public constant NOT_TAXED_FROM = keccak256("NOT_TAXED_FROM");
    bytes32 public constant NOT_TAXED_TO = keccak256("NOT_TAXED_TO");
    bytes32 public constant ALWAYS_TAXED_FROM = keccak256("ALWAYS_TAXED_FROM");
    bytes32 public constant ALWAYS_TAXED_TO = keccak256("ALWAYS_TAXED_TO");
    address public constant deadaddr = 0x000000000000000000000000000000000000dEaD;

    constructor(
   
        bool __taxed,
        uint __thetax,
        uint __maxtax,
        uint __mintax,
        address __owner
    
        )
        ERC20("GBOT", "GBOT")
        Taxable(__taxed, __thetax, __maxtax, __mintax, __owner)
    {
        _grantRole(DEFAULT_ADMIN_ROLE, __owner);
        _grantRole(NOT_TAXED_FROM, __owner);
        _grantRole(NOT_TAXED_TO, __owner);
        _grantRole(NOT_TAXED_FROM, address(this));
        _grantRole(NOT_TAXED_TO, address(this));
        _mint(__owner, 100000 * 10 ** decimals());
    }

    function enableTax() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _taxon();
    }

    function whitelisttax(address _user) external onlyOwner{
        _grantRole(NOT_TAXED_FROM, _user);
        _grantRole(NOT_TAXED_TO, _user);
    }

    function whitelisttaxTO(address _user) external onlyOwner{
   
        _grantRole(NOT_TAXED_TO, _user);
    }

        function whitelisttaxFROM(address _user) external onlyOwner{
        _grantRole(NOT_TAXED_FROM, _user);

    }

    function disableTax() public onlyRole(DEFAULT_ADMIN_ROLE) {
        _taxoff();
    }

    function updateTax(uint newtax) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _updatetax(newtax);
    }

    function updateTaxDestination(address newdestination) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _updatetaxdestination(newdestination);
    }


   function _transfer(address from, address to, uint256 amount)
        internal
        virtual
        override(ERC20)
        nonReentrant
    {
        if (hasRole(DEFAULT_ADMIN_ROLE, msg.sender)) {
            super._transfer(from, to, amount);
        } else {
            if((hasRole(NOT_TAXED_FROM, from) || hasRole(NOT_TAXED_TO, to) || !taxed())
            && !hasRole(ALWAYS_TAXED_FROM, from) && !hasRole(ALWAYS_TAXED_TO, to)) {
                super._transfer(from, to, amount);
            } else { 
                require(balanceOf(from) >= amount, "Error: transfer amount exceeds balance");
                super._transfer(from, taxdestination(), amount*thetax()/10000);
                super._transfer(from, to, amount*(10000-thetax())/10000);
            }
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"bool","name":"__taxed","type":"bool"},{"internalType":"uint256","name":"__thetax","type":"uint256"},{"internalType":"uint256","name":"__maxtax","type":"uint256"},{"internalType":"uint256","name":"__mintax","type":"uint256"},{"internalType":"address","name":"__owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TaxChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TaxDestinationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TaxOff","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"TaxOn","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":"ALWAYS_TAXED_FROM","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ALWAYS_TAXED_TO","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_TAXED_FROM","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_TAXED_TO","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","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":"amount","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":[],"name":"deadaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxdestination","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thetax","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":"amount","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":"amount","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":"uint256","name":"newtax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newdestination","type":"address"}],"name":"updateTaxDestination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelisttax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelisttaxFROM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"whitelisttaxTO","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003b9c38038062003b9c8339818101604052810190620000379190620007df565b84848484846040518060400160405280600481526020017f47424f54000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47424f540000000000000000000000000000000000000000000000000000000081525060016000819055508160049080519060200190620000c89291906200064d565b508060059080519060200190620000e19291906200064d565b50505084600760006101000a81548160ff021916908315150217905550836008819055508260098190555081600a8190555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050620001796200016d620002a060201b60201c565b620002a860201b60201c565b6200018e6000801b826200036e60201b60201c565b620001c07f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed2443461237826200036e60201b60201c565b620001f27f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff826200036e60201b60201c565b620002247f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed2443461237306200036e60201b60201c565b620002567f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff306200036e60201b60201c565b62000295816200026b6200046060201b60201c565b600a620002799190620009f7565b620186a062000289919062000a48565b6200046960201b60201c565b505050505062000c1c565b600033905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003808282620005d860201b60201c565b6200045c5760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000401620002a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004dc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d39062000b0a565b60405180910390fd5b620004f0600083836200064360201b60201c565b806003600082825462000504919062000b2c565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620005b8919062000b9a565b60405180910390a3620005d4600083836200064860201b60201c565b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b505050565b505050565b8280546200065b9062000be6565b90600052602060002090601f0160209004810192826200067f5760008555620006cb565b82601f106200069a57805160ff1916838001178555620006cb565b82800160010185558215620006cb579182015b82811115620006ca578251825591602001919060010190620006ad565b5b509050620006da9190620006de565b5090565b5b80821115620006f9576000816000905550600101620006df565b5090565b600080fd5b60008115159050919050565b620007198162000702565b81146200072557600080fd5b50565b60008151905062000739816200070e565b92915050565b6000819050919050565b62000754816200073f565b81146200076057600080fd5b50565b600081519050620007748162000749565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007a7826200077a565b9050919050565b620007b9816200079a565b8114620007c557600080fd5b50565b600081519050620007d981620007ae565b92915050565b600080600080600060a08688031215620007fe57620007fd620006fd565b5b60006200080e8882890162000728565b9550506020620008218882890162000763565b9450506040620008348882890162000763565b9350506060620008478882890162000763565b92505060806200085a88828901620007c8565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620008f557808604811115620008cd57620008cc62000867565b5b6001851615620008dd5780820291505b8081029050620008ed8562000896565b9450620008ad565b94509492505050565b600082620009105760019050620009e3565b81620009205760009050620009e3565b816001811462000939576002811462000944576200097a565b6001915050620009e3565b60ff84111562000959576200095862000867565b5b8360020a91508482111562000973576200097262000867565b5b50620009e3565b5060208310610133831016604e8410600b8410161715620009b45782820a905083811115620009ae57620009ad62000867565b5b620009e3565b620009c38484846001620008a3565b92509050818404811115620009dd57620009dc62000867565b5b81810290505b9392505050565b600060ff82169050919050565b600062000a04826200073f565b915062000a1183620009ea565b925062000a407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620008fe565b905092915050565b600062000a55826200073f565b915062000a62836200073f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000a9e5762000a9d62000867565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000af2601f8362000aa9565b915062000aff8262000aba565b602082019050919050565b6000602082019050818103600083015262000b258162000ae3565b9050919050565b600062000b39826200073f565b915062000b46836200073f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b7e5762000b7d62000867565b5b828201905092915050565b62000b94816200073f565b82525050565b600060208201905062000bb1600083018462000b89565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bff57607f821691505b6020821081141562000c165762000c1562000bb7565b5b50919050565b612f708062000c2c6000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80635f64d73011610125578063a217fddf116100ad578063cca0feb61161007c578063cca0feb614610631578063ced695a41461064d578063d547741f14610657578063dd62ed3e14610673578063f2fde38b146106a35761021c565b8063a217fddf14610595578063a457c2d7146105b3578063a9059cbb146105e3578063c498f376146106135761021c565b80638a2b66d1116100f45780638a2b66d1146104ed5780638da5cb5b1461050b57806391d148541461052957806395d89b41146105595780639e01392f146105775761021c565b80635f64d7301461047957806370a0823114610497578063715018a6146104c757806372922a37146104d15761021c565b8063313ce567116101a85780633b9b0314116101775780633b9b0314146103f957806346a85aa414610417578063513fbcec1461043557806353eb3bcf146104515780635acd2fa61461045b5761021c565b8063313ce5671461037357806332c940211461039157806336568abe146103ad57806339509351146103c95761021c565b80631c3269b7116101ef5780631c3269b7146102bd57806323b872dd146102d9578063248a9ca3146103095780632713c21e146103395780632f2ff15d146103575761021c565b806301ffc9a71461022157806306fdde0314610251578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61023b60048036038101906102369190611f17565b6106bf565b6040516102489190611f5f565b60405180910390f35b610259610739565b6040516102669190612013565b60405180910390f35b610289600480360381019061028491906120c9565b6107cb565b6040516102969190611f5f565b60405180910390f35b6102a76107ee565b6040516102b49190612118565b60405180910390f35b6102d760048036038101906102d29190612133565b6107f8565b005b6102f360048036038101906102ee9190612160565b61082d565b6040516103009190611f5f565b60405180910390f35b610323600480360381019061031e91906121e9565b61085c565b6040516103309190612225565b60405180910390f35b61034161087c565b60405161034e9190612225565b60405180910390f35b610371600480360381019061036c9190612240565b6108a0565b005b61037b6108c1565b604051610388919061229c565b60405180910390f35b6103ab60048036038101906103a69190612133565b6108ca565b005b6103c760048036038101906103c29190612240565b6108e4565b005b6103e360048036038101906103de91906120c9565b610967565b6040516103f09190611f5f565b60405180910390f35b61040161099e565b60405161040e9190612118565b60405180910390f35b61041f6109a8565b60405161042c9190612225565b60405180910390f35b61044f600480360381019061044a9190612133565b6109cc565b005b610459610a2b565b005b610463610a43565b60405161047091906122c6565b60405180910390f35b610481610a49565b60405161048e9190612225565b60405180910390f35b6104b160048036038101906104ac9190612133565b610a6d565b6040516104be9190612118565b60405180910390f35b6104cf610ab6565b005b6104eb60048036038101906104e69190612133565b610aca565b005b6104f5610aff565b60405161050291906122c6565b60405180910390f35b610513610b29565b60405161052091906122c6565b60405180910390f35b610543600480360381019061053e9190612240565b610b53565b6040516105509190611f5f565b60405180910390f35b610561610bbe565b60405161056e9190612013565b60405180910390f35b61057f610c50565b60405161058c9190611f5f565b60405180910390f35b61059d610c67565b6040516105aa9190612225565b60405180910390f35b6105cd60048036038101906105c891906120c9565b610c6e565b6040516105da9190611f5f565b60405180910390f35b6105fd60048036038101906105f891906120c9565b610ce5565b60405161060a9190611f5f565b60405180910390f35b61061b610d08565b6040516106289190612225565b60405180910390f35b61064b600480360381019061064691906122e1565b610d2c565b005b610655610d46565b005b610671600480360381019061066c9190612240565b610d5e565b005b61068d6004803603810190610688919061230e565b610d7f565b60405161069a9190612118565b60405180910390f35b6106bd60048036038101906106b89190612133565b610e06565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610732575061073182610e8a565b5b9050919050565b6060600480546107489061237d565b80601f01602080910402602001604051908101604052809291908181526020018280546107749061237d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b6000806107d6610ef4565b90506107e3818585610efc565b600191505092915050565b6000600354905090565b6108006110c7565b61082a7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123782611145565b50565b600080610838610ef4565b9050610845858285611226565b6108508585856112b2565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123781565b6108a98261085c565b6108b281611484565b6108bc8383611145565b505050565b60006012905090565b6000801b6108d781611484565b6108e082611498565b5050565b6108ec610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090612421565b60405180910390fd5b610963828261151a565b5050565b600080610972610ef4565b90506109938185856109848589610d7f565b61098e9190612470565b610efc565b600191505092915050565b6000600854905090565b7fdb1f6cc858f64c436f0ba814bf59b72262e27f9b82ae65442c00c7cfad070f3581565b6109d46110c7565b6109fe7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123782611145565b610a287f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff82611145565b50565b6000801b610a3881611484565b610a406115fc565b50565b61dead81565b7f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff81565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610abe6110c7565b610ac8600061165f565b565b610ad26110c7565b610afc7f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff82611145565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054610bcd9061237d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf99061237d565b8015610c465780601f10610c1b57610100808354040283529160200191610c46565b820191906000526020600020905b815481529060010190602001808311610c2957829003601f168201915b5050505050905090565b6000600760009054906101000a900460ff16905090565b6000801b81565b600080610c79610ef4565b90506000610c878286610d7f565b905083811015610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390612538565b60405180910390fd5b610cd98286868403610efc565b60019250505092915050565b600080610cf0610ef4565b9050610cfd8185856112b2565b600191505092915050565b7f3c9053d8d897bea84f1a2e8814845cc40f47b0a508dc93e56bc37c81c21a3b7881565b6000801b610d3981611484565b610d4282611725565b5050565b6000801b610d5381611484565b610d5b6117f7565b50565b610d678261085c565b610d7081611484565b610d7a838361151a565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e0e6110c7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e75906125ca565b60405180910390fd5b610e878161165f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f639061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd3906126ee565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110ba9190612118565b60405180910390a3505050565b6110cf610ef4565b73ffffffffffffffffffffffffffffffffffffffff166110ed610b29565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061275a565b60405180910390fd5b565b61114f8282610b53565b6112225760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111c7610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006112328484610d7f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112ac578181101561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906127c6565b60405180910390fd5b6112ab8484848403610efc565b5b50505050565b6112ba61185a565b6112c76000801b33610b53565b156112dc576112d78383836118aa565b611477565b6113067f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123784610b53565b8061133757506113367f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff83610b53565b5b806113475750611345610c50565b155b801561137a57506113787f3c9053d8d897bea84f1a2e8814845cc40f47b0a508dc93e56bc37c81c21a3b7884610b53565b155b80156113ad57506113ab7fdb1f6cc858f64c436f0ba814bf59b72262e27f9b82ae65442c00c7cfad070f3583610b53565b155b156113c2576113bd8383836118aa565b611476565b806113cc84610a6d565b101561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490612858565b60405180910390fd5b61143e83611419610aff565b61271061142461099e565b8561142f9190612878565b6114399190612901565b6118aa565b611475838361271061144e61099e565b61271061145b9190612932565b856114669190612878565b6114709190612901565b6118aa565b5b5b61147f611b25565b505050565b61149581611490610ef4565b611b2f565b50565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f09eee28d8d70bfad809ce8acadd46ce657b1fa64646b1e4b414e6bbb2eb2c8fa611502610ef4565b60405161150f91906122c6565b60405180910390a150565b6115248282610b53565b156115f85760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061159d610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611604611bb4565b6001600760006101000a81548160ff0219169083151502179055507fcca130fdd52ce6e5eedb160c5f635a53883abcfe2b46453038a1516d7d5380b9611648610ef4565b60405161165591906122c6565b60405180910390a1565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60095481111561176a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611761906129b2565b60405180910390fd5b600a548110156117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690612a1e565b60405180910390fd5b806008819055507fc8eab30ec12770242ba7c205b239d632db8d3f54b3392aa8692893c8fd07abc36117df610ef4565b6040516117ec91906122c6565b60405180910390a150565b6117ff611bfe565b6000600760006101000a81548160ff0219169083151502179055507f8b99205429b09a5a41d0d69839e5129b5f813b29a8e9924b45131170948d88a8611843610ef4565b60405161185091906122c6565b60405180910390a1565b600260005414156118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790612a8a565b60405180910390fd5b6002600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190612b1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190612bae565b60405180910390fd5b611995838383611c47565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390612c40565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b0c9190612118565b60405180910390a3611b1f848484611c4c565b50505050565b6001600081905550565b611b398282610b53565b611bb057611b4681611c51565b611b548360001c6020611c7e565b604051602001611b65929190612d34565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba79190612013565b60405180910390fd5b5050565b611bbc610c50565b15611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390612dba565b60405180910390fd5b565b611c06610c50565b611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90612e26565b60405180910390fd5b565b505050565b505050565b6060611c778273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c7e565b9050919050565b606060006002836002611c919190612878565b611c9b9190612470565b67ffffffffffffffff811115611cb457611cb3612e46565b5b6040519080825280601f01601f191660200182016040528015611ce65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d1e57611d1d612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d8257611d81612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611dc29190612878565b611dcc9190612470565b90505b6001811115611e6c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611e0e57611e0d612e75565b5b1a60f81b828281518110611e2557611e24612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e6590612ea4565b9050611dcf565b5060008414611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790612f1a565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ef481611ebf565b8114611eff57600080fd5b50565b600081359050611f1181611eeb565b92915050565b600060208284031215611f2d57611f2c611eba565b5b6000611f3b84828501611f02565b91505092915050565b60008115159050919050565b611f5981611f44565b82525050565b6000602082019050611f746000830184611f50565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fb4578082015181840152602081019050611f99565b83811115611fc3576000848401525b50505050565b6000601f19601f8301169050919050565b6000611fe582611f7a565b611fef8185611f85565b9350611fff818560208601611f96565b61200881611fc9565b840191505092915050565b6000602082019050818103600083015261202d8184611fda565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061206082612035565b9050919050565b61207081612055565b811461207b57600080fd5b50565b60008135905061208d81612067565b92915050565b6000819050919050565b6120a681612093565b81146120b157600080fd5b50565b6000813590506120c38161209d565b92915050565b600080604083850312156120e0576120df611eba565b5b60006120ee8582860161207e565b92505060206120ff858286016120b4565b9150509250929050565b61211281612093565b82525050565b600060208201905061212d6000830184612109565b92915050565b60006020828403121561214957612148611eba565b5b60006121578482850161207e565b91505092915050565b60008060006060848603121561217957612178611eba565b5b60006121878682870161207e565b93505060206121988682870161207e565b92505060406121a9868287016120b4565b9150509250925092565b6000819050919050565b6121c6816121b3565b81146121d157600080fd5b50565b6000813590506121e3816121bd565b92915050565b6000602082840312156121ff576121fe611eba565b5b600061220d848285016121d4565b91505092915050565b61221f816121b3565b82525050565b600060208201905061223a6000830184612216565b92915050565b6000806040838503121561225757612256611eba565b5b6000612265858286016121d4565b92505060206122768582860161207e565b9150509250929050565b600060ff82169050919050565b61229681612280565b82525050565b60006020820190506122b1600083018461228d565b92915050565b6122c081612055565b82525050565b60006020820190506122db60008301846122b7565b92915050565b6000602082840312156122f7576122f6611eba565b5b6000612305848285016120b4565b91505092915050565b6000806040838503121561232557612324611eba565b5b60006123338582860161207e565b92505060206123448582860161207e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061239557607f821691505b602082108114156123a9576123a861234e565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061240b602f83611f85565b9150612416826123af565b604082019050919050565b6000602082019050818103600083015261243a816123fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061247b82612093565b915061248683612093565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124bb576124ba612441565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612522602583611f85565b915061252d826124c6565b604082019050919050565b6000602082019050818103600083015261255181612515565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006125b4602683611f85565b91506125bf82612558565b604082019050919050565b600060208201905081810360008301526125e3816125a7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612646602483611f85565b9150612651826125ea565b604082019050919050565b6000602082019050818103600083015261267581612639565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126d8602283611f85565b91506126e38261267c565b604082019050919050565b60006020820190508181036000830152612707816126cb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612744602083611f85565b915061274f8261270e565b602082019050919050565b6000602082019050818103600083015261277381612737565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006127b0601d83611f85565b91506127bb8261277a565b602082019050919050565b600060208201905081810360008301526127df816127a3565b9050919050565b7f4572726f723a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612842602683611f85565b915061284d826127e6565b604082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b600061288382612093565b915061288e83612093565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128c7576128c6612441565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061290c82612093565b915061291783612093565b925082612927576129266128d2565b5b828204905092915050565b600061293d82612093565b915061294883612093565b92508282101561295b5761295a612441565b5b828203905092915050565b7f54617861626c653a2074617820697320746f6f20686967680000000000000000600082015250565b600061299c601883611f85565b91506129a782612966565b602082019050919050565b600060208201905081810360008301526129cb8161298f565b9050919050565b7f54617861626c653a2074617820697320746f6f206c6f77000000000000000000600082015250565b6000612a08601783611f85565b9150612a13826129d2565b602082019050919050565b60006020820190508181036000830152612a37816129fb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612a74601f83611f85565b9150612a7f82612a3e565b602082019050919050565b60006020820190508181036000830152612aa381612a67565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612b06602583611f85565b9150612b1182612aaa565b604082019050919050565b60006020820190508181036000830152612b3581612af9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b98602383611f85565b9150612ba382612b3c565b604082019050919050565b60006020820190508181036000830152612bc781612b8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612c2a602683611f85565b9150612c3582612bce565b604082019050919050565b60006020820190508181036000830152612c5981612c1d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612ca1601783612c60565b9150612cac82612c6b565b601782019050919050565b6000612cc282611f7a565b612ccc8185612c60565b9350612cdc818560208601611f96565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d1e601183612c60565b9150612d2982612ce8565b601182019050919050565b6000612d3f82612c94565b9150612d4b8285612cb7565b9150612d5682612d11565b9150612d628284612cb7565b91508190509392505050565b7f54617861626c653a207461786564000000000000000000000000000000000000600082015250565b6000612da4600e83611f85565b9150612daf82612d6e565b602082019050919050565b60006020820190508181036000830152612dd381612d97565b9050919050565b7f54617861626c653a206e6f742074617865640000000000000000000000000000600082015250565b6000612e10601283611f85565b9150612e1b82612dda565b602082019050919050565b60006020820190508181036000830152612e3f81612e03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612eaf82612093565b91506000821415612ec357612ec2612441565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612f04602083611f85565b9150612f0f82612ece565b602082019050919050565b60006020820190508181036000830152612f3381612ef7565b905091905056fea2646970667358221220e07a822836049ca0ccfcdceb89666aed5c84a8597108a989c36d97a866c59e0364736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bf7a0c21660879fdd051f5ee92cd2936779ec57

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80635f64d73011610125578063a217fddf116100ad578063cca0feb61161007c578063cca0feb614610631578063ced695a41461064d578063d547741f14610657578063dd62ed3e14610673578063f2fde38b146106a35761021c565b8063a217fddf14610595578063a457c2d7146105b3578063a9059cbb146105e3578063c498f376146106135761021c565b80638a2b66d1116100f45780638a2b66d1146104ed5780638da5cb5b1461050b57806391d148541461052957806395d89b41146105595780639e01392f146105775761021c565b80635f64d7301461047957806370a0823114610497578063715018a6146104c757806372922a37146104d15761021c565b8063313ce567116101a85780633b9b0314116101775780633b9b0314146103f957806346a85aa414610417578063513fbcec1461043557806353eb3bcf146104515780635acd2fa61461045b5761021c565b8063313ce5671461037357806332c940211461039157806336568abe146103ad57806339509351146103c95761021c565b80631c3269b7116101ef5780631c3269b7146102bd57806323b872dd146102d9578063248a9ca3146103095780632713c21e146103395780632f2ff15d146103575761021c565b806301ffc9a71461022157806306fdde0314610251578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61023b60048036038101906102369190611f17565b6106bf565b6040516102489190611f5f565b60405180910390f35b610259610739565b6040516102669190612013565b60405180910390f35b610289600480360381019061028491906120c9565b6107cb565b6040516102969190611f5f565b60405180910390f35b6102a76107ee565b6040516102b49190612118565b60405180910390f35b6102d760048036038101906102d29190612133565b6107f8565b005b6102f360048036038101906102ee9190612160565b61082d565b6040516103009190611f5f565b60405180910390f35b610323600480360381019061031e91906121e9565b61085c565b6040516103309190612225565b60405180910390f35b61034161087c565b60405161034e9190612225565b60405180910390f35b610371600480360381019061036c9190612240565b6108a0565b005b61037b6108c1565b604051610388919061229c565b60405180910390f35b6103ab60048036038101906103a69190612133565b6108ca565b005b6103c760048036038101906103c29190612240565b6108e4565b005b6103e360048036038101906103de91906120c9565b610967565b6040516103f09190611f5f565b60405180910390f35b61040161099e565b60405161040e9190612118565b60405180910390f35b61041f6109a8565b60405161042c9190612225565b60405180910390f35b61044f600480360381019061044a9190612133565b6109cc565b005b610459610a2b565b005b610463610a43565b60405161047091906122c6565b60405180910390f35b610481610a49565b60405161048e9190612225565b60405180910390f35b6104b160048036038101906104ac9190612133565b610a6d565b6040516104be9190612118565b60405180910390f35b6104cf610ab6565b005b6104eb60048036038101906104e69190612133565b610aca565b005b6104f5610aff565b60405161050291906122c6565b60405180910390f35b610513610b29565b60405161052091906122c6565b60405180910390f35b610543600480360381019061053e9190612240565b610b53565b6040516105509190611f5f565b60405180910390f35b610561610bbe565b60405161056e9190612013565b60405180910390f35b61057f610c50565b60405161058c9190611f5f565b60405180910390f35b61059d610c67565b6040516105aa9190612225565b60405180910390f35b6105cd60048036038101906105c891906120c9565b610c6e565b6040516105da9190611f5f565b60405180910390f35b6105fd60048036038101906105f891906120c9565b610ce5565b60405161060a9190611f5f565b60405180910390f35b61061b610d08565b6040516106289190612225565b60405180910390f35b61064b600480360381019061064691906122e1565b610d2c565b005b610655610d46565b005b610671600480360381019061066c9190612240565b610d5e565b005b61068d6004803603810190610688919061230e565b610d7f565b60405161069a9190612118565b60405180910390f35b6106bd60048036038101906106b89190612133565b610e06565b005b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610732575061073182610e8a565b5b9050919050565b6060600480546107489061237d565b80601f01602080910402602001604051908101604052809291908181526020018280546107749061237d565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b6000806107d6610ef4565b90506107e3818585610efc565b600191505092915050565b6000600354905090565b6108006110c7565b61082a7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123782611145565b50565b600080610838610ef4565b9050610845858285611226565b6108508585856112b2565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123781565b6108a98261085c565b6108b281611484565b6108bc8383611145565b505050565b60006012905090565b6000801b6108d781611484565b6108e082611498565b5050565b6108ec610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610959576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095090612421565b60405180910390fd5b610963828261151a565b5050565b600080610972610ef4565b90506109938185856109848589610d7f565b61098e9190612470565b610efc565b600191505092915050565b6000600854905090565b7fdb1f6cc858f64c436f0ba814bf59b72262e27f9b82ae65442c00c7cfad070f3581565b6109d46110c7565b6109fe7f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123782611145565b610a287f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff82611145565b50565b6000801b610a3881611484565b610a406115fc565b50565b61dead81565b7f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff81565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610abe6110c7565b610ac8600061165f565b565b610ad26110c7565b610afc7f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff82611145565b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060058054610bcd9061237d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf99061237d565b8015610c465780601f10610c1b57610100808354040283529160200191610c46565b820191906000526020600020905b815481529060010190602001808311610c2957829003601f168201915b5050505050905090565b6000600760009054906101000a900460ff16905090565b6000801b81565b600080610c79610ef4565b90506000610c878286610d7f565b905083811015610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390612538565b60405180910390fd5b610cd98286868403610efc565b60019250505092915050565b600080610cf0610ef4565b9050610cfd8185856112b2565b600191505092915050565b7f3c9053d8d897bea84f1a2e8814845cc40f47b0a508dc93e56bc37c81c21a3b7881565b6000801b610d3981611484565b610d4282611725565b5050565b6000801b610d5381611484565b610d5b6117f7565b50565b610d678261085c565b610d7081611484565b610d7a838361151a565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610e0e6110c7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e75906125ca565b60405180910390fd5b610e878161165f565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f639061265c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd3906126ee565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110ba9190612118565b60405180910390a3505050565b6110cf610ef4565b73ffffffffffffffffffffffffffffffffffffffff166110ed610b29565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a9061275a565b60405180910390fd5b565b61114f8282610b53565b6112225760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111c7610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006112328484610d7f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112ac578181101561129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906127c6565b60405180910390fd5b6112ab8484848403610efc565b5b50505050565b6112ba61185a565b6112c76000801b33610b53565b156112dc576112d78383836118aa565b611477565b6113067f5a8e93afc88a8f41c32a59ead48949c995bbbd1ca15b8a3f9b53ed244346123784610b53565b8061133757506113367f651dbafbf0066bfdd2c717cccc977cff67bf8877ed830ce641731c2e8837c0ff83610b53565b5b806113475750611345610c50565b155b801561137a57506113787f3c9053d8d897bea84f1a2e8814845cc40f47b0a508dc93e56bc37c81c21a3b7884610b53565b155b80156113ad57506113ab7fdb1f6cc858f64c436f0ba814bf59b72262e27f9b82ae65442c00c7cfad070f3583610b53565b155b156113c2576113bd8383836118aa565b611476565b806113cc84610a6d565b101561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140490612858565b60405180910390fd5b61143e83611419610aff565b61271061142461099e565b8561142f9190612878565b6114399190612901565b6118aa565b611475838361271061144e61099e565b61271061145b9190612932565b856114669190612878565b6114709190612901565b6118aa565b5b5b61147f611b25565b505050565b61149581611490610ef4565b611b2f565b50565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f09eee28d8d70bfad809ce8acadd46ce657b1fa64646b1e4b414e6bbb2eb2c8fa611502610ef4565b60405161150f91906122c6565b60405180910390a150565b6115248282610b53565b156115f85760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061159d610ef4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611604611bb4565b6001600760006101000a81548160ff0219169083151502179055507fcca130fdd52ce6e5eedb160c5f635a53883abcfe2b46453038a1516d7d5380b9611648610ef4565b60405161165591906122c6565b60405180910390a1565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60095481111561176a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611761906129b2565b60405180910390fd5b600a548110156117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690612a1e565b60405180910390fd5b806008819055507fc8eab30ec12770242ba7c205b239d632db8d3f54b3392aa8692893c8fd07abc36117df610ef4565b6040516117ec91906122c6565b60405180910390a150565b6117ff611bfe565b6000600760006101000a81548160ff0219169083151502179055507f8b99205429b09a5a41d0d69839e5129b5f813b29a8e9924b45131170948d88a8611843610ef4565b60405161185091906122c6565b60405180910390a1565b600260005414156118a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189790612a8a565b60405180910390fd5b6002600081905550565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561191a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191190612b1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561198a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190612bae565b60405180910390fd5b611995838383611c47565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1390612c40565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b0c9190612118565b60405180910390a3611b1f848484611c4c565b50505050565b6001600081905550565b611b398282610b53565b611bb057611b4681611c51565b611b548360001c6020611c7e565b604051602001611b65929190612d34565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba79190612013565b60405180910390fd5b5050565b611bbc610c50565b15611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390612dba565b60405180910390fd5b565b611c06610c50565b611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90612e26565b60405180910390fd5b565b505050565b505050565b6060611c778273ffffffffffffffffffffffffffffffffffffffff16601460ff16611c7e565b9050919050565b606060006002836002611c919190612878565b611c9b9190612470565b67ffffffffffffffff811115611cb457611cb3612e46565b5b6040519080825280601f01601f191660200182016040528015611ce65781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611d1e57611d1d612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611d8257611d81612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611dc29190612878565b611dcc9190612470565b90505b6001811115611e6c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611e0e57611e0d612e75565b5b1a60f81b828281518110611e2557611e24612e75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e6590612ea4565b9050611dcf565b5060008414611eb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea790612f1a565b60405180910390fd5b8091505092915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ef481611ebf565b8114611eff57600080fd5b50565b600081359050611f1181611eeb565b92915050565b600060208284031215611f2d57611f2c611eba565b5b6000611f3b84828501611f02565b91505092915050565b60008115159050919050565b611f5981611f44565b82525050565b6000602082019050611f746000830184611f50565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611fb4578082015181840152602081019050611f99565b83811115611fc3576000848401525b50505050565b6000601f19601f8301169050919050565b6000611fe582611f7a565b611fef8185611f85565b9350611fff818560208601611f96565b61200881611fc9565b840191505092915050565b6000602082019050818103600083015261202d8184611fda565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061206082612035565b9050919050565b61207081612055565b811461207b57600080fd5b50565b60008135905061208d81612067565b92915050565b6000819050919050565b6120a681612093565b81146120b157600080fd5b50565b6000813590506120c38161209d565b92915050565b600080604083850312156120e0576120df611eba565b5b60006120ee8582860161207e565b92505060206120ff858286016120b4565b9150509250929050565b61211281612093565b82525050565b600060208201905061212d6000830184612109565b92915050565b60006020828403121561214957612148611eba565b5b60006121578482850161207e565b91505092915050565b60008060006060848603121561217957612178611eba565b5b60006121878682870161207e565b93505060206121988682870161207e565b92505060406121a9868287016120b4565b9150509250925092565b6000819050919050565b6121c6816121b3565b81146121d157600080fd5b50565b6000813590506121e3816121bd565b92915050565b6000602082840312156121ff576121fe611eba565b5b600061220d848285016121d4565b91505092915050565b61221f816121b3565b82525050565b600060208201905061223a6000830184612216565b92915050565b6000806040838503121561225757612256611eba565b5b6000612265858286016121d4565b92505060206122768582860161207e565b9150509250929050565b600060ff82169050919050565b61229681612280565b82525050565b60006020820190506122b1600083018461228d565b92915050565b6122c081612055565b82525050565b60006020820190506122db60008301846122b7565b92915050565b6000602082840312156122f7576122f6611eba565b5b6000612305848285016120b4565b91505092915050565b6000806040838503121561232557612324611eba565b5b60006123338582860161207e565b92505060206123448582860161207e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061239557607f821691505b602082108114156123a9576123a861234e565b5b50919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061240b602f83611f85565b9150612416826123af565b604082019050919050565b6000602082019050818103600083015261243a816123fe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061247b82612093565b915061248683612093565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124bb576124ba612441565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612522602583611f85565b915061252d826124c6565b604082019050919050565b6000602082019050818103600083015261255181612515565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006125b4602683611f85565b91506125bf82612558565b604082019050919050565b600060208201905081810360008301526125e3816125a7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612646602483611f85565b9150612651826125ea565b604082019050919050565b6000602082019050818103600083015261267581612639565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126d8602283611f85565b91506126e38261267c565b604082019050919050565b60006020820190508181036000830152612707816126cb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612744602083611f85565b915061274f8261270e565b602082019050919050565b6000602082019050818103600083015261277381612737565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006127b0601d83611f85565b91506127bb8261277a565b602082019050919050565b600060208201905081810360008301526127df816127a3565b9050919050565b7f4572726f723a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612842602683611f85565b915061284d826127e6565b604082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b600061288382612093565b915061288e83612093565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128c7576128c6612441565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061290c82612093565b915061291783612093565b925082612927576129266128d2565b5b828204905092915050565b600061293d82612093565b915061294883612093565b92508282101561295b5761295a612441565b5b828203905092915050565b7f54617861626c653a2074617820697320746f6f20686967680000000000000000600082015250565b600061299c601883611f85565b91506129a782612966565b602082019050919050565b600060208201905081810360008301526129cb8161298f565b9050919050565b7f54617861626c653a2074617820697320746f6f206c6f77000000000000000000600082015250565b6000612a08601783611f85565b9150612a13826129d2565b602082019050919050565b60006020820190508181036000830152612a37816129fb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612a74601f83611f85565b9150612a7f82612a3e565b602082019050919050565b60006020820190508181036000830152612aa381612a67565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612b06602583611f85565b9150612b1182612aaa565b604082019050919050565b60006020820190508181036000830152612b3581612af9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612b98602383611f85565b9150612ba382612b3c565b604082019050919050565b60006020820190508181036000830152612bc781612b8b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612c2a602683611f85565b9150612c3582612bce565b604082019050919050565b60006020820190508181036000830152612c5981612c1d565b9050919050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000612ca1601783612c60565b9150612cac82612c6b565b601782019050919050565b6000612cc282611f7a565b612ccc8185612c60565b9350612cdc818560208601611f96565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000612d1e601183612c60565b9150612d2982612ce8565b601182019050919050565b6000612d3f82612c94565b9150612d4b8285612cb7565b9150612d5682612d11565b9150612d628284612cb7565b91508190509392505050565b7f54617861626c653a207461786564000000000000000000000000000000000000600082015250565b6000612da4600e83611f85565b9150612daf82612d6e565b602082019050919050565b60006020820190508181036000830152612dd381612d97565b9050919050565b7f54617861626c653a206e6f742074617865640000000000000000000000000000600082015250565b6000612e10601283611f85565b9150612e1b82612dda565b602082019050919050565b60006020820190508181036000830152612e3f81612e03565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612eaf82612093565b91506000821415612ec357612ec2612441565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612f04602083611f85565b9150612f0f82612ece565b602082019050919050565b60006020820190508181036000830152612f3381612ef7565b905091905056fea2646970667358221220e07a822836049ca0ccfcdceb89666aed5c84a8597108a989c36d97a866c59e0364736f6c634300080c0033

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

000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004bf7a0c21660879fdd051f5ee92cd2936779ec57

-----Decoded View---------------
Arg [0] : __taxed (bool): True
Arg [1] : __thetax (uint256): 200
Arg [2] : __maxtax (uint256): 300
Arg [3] : __mintax (uint256): 0
Arg [4] : __owner (address): 0x4bF7A0C21660879FdD051f5eE92Cd2936779EC57

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [2] : 000000000000000000000000000000000000000000000000000000000000012c
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000004bf7a0c21660879fdd051f5ee92cd2936779ec57


Deployed Bytecode Sourcemap

59316:2702:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33620:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45017:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47377:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46146:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60727:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48158:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35443:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59398:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35884:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45988:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61055:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37028:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48828:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28335:194;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59625:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60446:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60354:84;;;:::i;:::-;;59702:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59473:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46317:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25078:103;;;:::i;:::-;;60603:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28537:219;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24437:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33916:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45236:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28112:215;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33021:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49569:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46650:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59544:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60942:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60848:86;;;:::i;:::-;;36324:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46906:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25336:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33620:204;33705:4;33744:32;33729:47;;;:11;:47;;;;:87;;;;33780:36;33804:11;33780:23;:36::i;:::-;33729:87;33722:94;;33620:204;;;:::o;45017:100::-;45071:13;45104:5;45097:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45017:100;:::o;47377:201::-;47460:4;47477:13;47493:12;:10;:12::i;:::-;47477:28;;47516:32;47525:5;47532:7;47541:6;47516:8;:32::i;:::-;47566:4;47559:11;;;47377:201;;;;:::o;46146:108::-;46207:7;46234:12;;46227:19;;46146:108;:::o;60727:113::-;24323:13;:11;:13::i;:::-;60797:33:::1;59439:27;60824:5;60797:10;:33::i;:::-;60727:113:::0;:::o;48158:261::-;48255:4;48272:15;48290:12;:10;:12::i;:::-;48272:30;;48313:38;48329:4;48335:7;48344:6;48313:15;:38::i;:::-;48362:27;48372:4;48378:2;48382:6;48362:9;:27::i;:::-;48407:4;48400:11;;;48158:261;;;;;:::o;35443:131::-;35517:7;35544:6;:12;35551:4;35544:12;;;;;;;;;;;:22;;;35537:29;;35443:131;;;:::o;59398:68::-;59439:27;59398:68;:::o;35884:147::-;35967:18;35980:4;35967:12;:18::i;:::-;33512:16;33523:4;33512:10;:16::i;:::-;35998:25:::1;36009:4;36015:7;35998:10;:25::i;:::-;35884:147:::0;;;:::o;45988:93::-;46046:5;46071:2;46064:9;;45988:93;:::o;61055:146::-;33066:4;61125:18;;33512:16;33523:4;33512:10;:16::i;:::-;61156:37:::1;61178:14;61156:21;:37::i;:::-;61055:146:::0;;:::o;37028:218::-;37135:12;:10;:12::i;:::-;37124:23;;:7;:23;;;37116:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37212:26;37224:4;37230:7;37212:11;:26::i;:::-;37028:218;;:::o;48828:238::-;48916:4;48933:13;48949:12;:10;:12::i;:::-;48933:28;;48972:64;48981:5;48988:7;49025:10;48997:25;49007:5;49014:7;48997:9;:25::i;:::-;:38;;;;:::i;:::-;48972:8;:64::i;:::-;49054:4;49047:11;;;48828:238;;;;:::o;28335:194::-;28382:4;28469:7;;28462:14;;28335:194;:::o;59625:70::-;59667:28;59625:70;:::o;60446:149::-;24323:13;:11;:13::i;:::-;60512:33:::1;59439:27;60539:5;60512:10;:33::i;:::-;60556:31;59512:25;60581:5;60556:10;:31::i;:::-;60446:149:::0;:::o;60354:84::-;33066:4;60391:18;;33512:16;33523:4;33512:10;:16::i;:::-;60422:8:::1;:6;:8::i;:::-;60354:84:::0;:::o;59702:77::-;59737:42;59702:77;:::o;59473:64::-;59512:25;59473:64;:::o;46317:127::-;46391:7;46418:9;:18;46428:7;46418:18;;;;;;;;;;;;;;;;46411:25;;46317:127;;;:::o;25078:103::-;24323:13;:11;:13::i;:::-;25143:30:::1;25170:1;25143:18;:30::i;:::-;25078:103::o:0;60603:112::-;24323:13;:11;:13::i;:::-;60676:31:::1;59512:25;60701:5;60676:10;:31::i;:::-;60603:112:::0;:::o;28537:219::-;28592:7;28685:15;;;;;;;;;;;28678:22;;28537:219;:::o;24437:87::-;24483:7;24510:6;;;;;;;;;;;24503:13;;24437:87;:::o;33916:147::-;34002:4;34026:6;:12;34033:4;34026:12;;;;;;;;;;;:20;;:29;34047:7;34026:29;;;;;;;;;;;;;;;;;;;;;;;;;34019:36;;33916:147;;;;:::o;45236:104::-;45292:13;45325:7;45318:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45236:104;:::o;28112:215::-;28158:4;28253:6;;;;;;;;;;;28246:13;;28112:215;:::o;33021:49::-;33066:4;33021:49;;;:::o;49569:436::-;49662:4;49679:13;49695:12;:10;:12::i;:::-;49679:28;;49718:24;49745:25;49755:5;49762:7;49745:9;:25::i;:::-;49718:52;;49809:15;49789:16;:35;;49781:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49902:60;49911:5;49918:7;49946:15;49927:16;:34;49902:8;:60::i;:::-;49993:4;49986:11;;;;49569:436;;;;:::o;46650:193::-;46729:4;46746:13;46762:12;:10;:12::i;:::-;46746:28;;46785;46795:5;46802:2;46806:6;46785:9;:28::i;:::-;46831:4;46824:11;;;46650:193;;;;:::o;59544:74::-;59588:30;59544:74;:::o;60942:105::-;33066:4;60990:18;;33512:16;33523:4;33512:10;:16::i;:::-;61021:18:::1;61032:6;61021:10;:18::i;:::-;60942:105:::0;;:::o;60848:86::-;33066:4;60886:18;;33512:16;33523:4;33512:10;:16::i;:::-;60917:9:::1;:7;:9::i;:::-;60848:86:::0;:::o;36324:149::-;36408:18;36421:4;36408:12;:18::i;:::-;33512:16;33523:4;33512:10;:16::i;:::-;36439:26:::1;36451:4;36457:7;36439:11;:26::i;:::-;36324:149:::0;;;:::o;46906:151::-;46995:7;47022:11;:18;47034:5;47022:18;;;;;;;;;;;;;;;:27;47041:7;47022:27;;;;;;;;;;;;;;;;47015:34;;46906:151;;;;:::o;25336:201::-;24323:13;:11;:13::i;:::-;25445:1:::1;25425:22;;:8;:22;;;;25417:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25501:28;25520:8;25501:18;:28::i;:::-;25336:201:::0;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;22988:98::-;23041:7;23068:10;23061:17;;22988:98;:::o;53562:346::-;53681:1;53664:19;;:5;:19;;;;53656:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53762:1;53743:21;;:7;:21;;;;53735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53846:6;53816:11;:18;53828:5;53816:18;;;;;;;;;;;;;;;:27;53835:7;53816:27;;;;;;;;;;;;;;;:36;;;;53884:7;53868:32;;53877:5;53868:32;;;53893:6;53868:32;;;;;;:::i;:::-;;;;;;;;53562:346;;;:::o;24602:132::-;24677:12;:10;:12::i;:::-;24666:23;;:7;:5;:7::i;:::-;:23;;;24658:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24602:132::o;38625:238::-;38709:22;38717:4;38723:7;38709;:22::i;:::-;38704:152;;38780:4;38748:6;:12;38755:4;38748:12;;;;;;;;;;;:20;;:29;38769:7;38748:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;38831:12;:10;:12::i;:::-;38804:40;;38822:7;38804:40;;38816:4;38804:40;;;;;;;;;;38704:152;38625:238;;:::o;54199:419::-;54300:24;54327:25;54337:5;54344:7;54327:9;:25::i;:::-;54300:52;;54387:17;54367:16;:37;54363:248;;54449:6;54429:16;:26;;54421:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54533:51;54542:5;54549:7;54577:6;54558:16;:25;54533:8;:51::i;:::-;54363:248;54289:329;54199:419;;;:::o;61210:805::-;58355:21;:19;:21::i;:::-;61373:39:::1;33066:4;61381:18:::0;::::1;61401:10;61373:7;:39::i;:::-;61369:639;;;61429:33;61445:4;61451:2;61455:6;61429:15;:33::i;:::-;61369:639;;;61499:29;59439:27;61523:4;61499:7;:29::i;:::-;:58;;;;61532:25;59512;61554:2;61532:7;:25::i;:::-;61499:58;:70;;;;61562:7;:5;:7::i;:::-;61561:8;61499:70;61498:122;;;;;61588:32;59588:30;61615:4;61588:7;:32::i;:::-;61587:33;61498:122;:155;;;;;61625:28;59667;61650:2;61625:7;:28::i;:::-;61624:29;61498:155;61495:502;;;61674:33;61690:4;61696:2;61700:6;61674:15;:33::i;:::-;61495:502;;;61776:6;61757:15;61767:4;61757:9;:15::i;:::-;:25;;61749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61844:62;61860:4;61866:16;:14;:16::i;:::-;61900:5;61891:8;:6;:8::i;:::-;61884:6;:15;;;;:::i;:::-;:21;;;;:::i;:::-;61844:15;:62::i;:::-;61925:56;61941:4;61947:2;61975:5;61965:8;:6;:8::i;:::-;61959:5;:14;;;;:::i;:::-;61951:6;:23;;;;:::i;:::-;:29;;;;:::i;:::-;61925:15;:56::i;:::-;61495:502;61369:639;58399:20:::0;:18;:20::i;:::-;61210:805;;;:::o;34367:105::-;34434:30;34445:4;34451:12;:10;:12::i;:::-;34434:10;:30::i;:::-;34367:105;:::o;30581:330::-;30773:14;30755:15;;:32;;;;;;;;;;;;;;;;;;30803:35;30825:12;:10;:12::i;:::-;30803:35;;;;;;:::i;:::-;;;;;;;;30581:330;:::o;39043:239::-;39127:22;39135:4;39141:7;39127;:22::i;:::-;39123:152;;;39198:5;39166:6;:12;39173:4;39166:12;;;;;;;;;;;:20;;:29;39187:7;39166:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;39250:12;:10;:12::i;:::-;39223:40;;39241:7;39223:40;;39235:4;39223:40;;;;;;;;;;39123:152;39043:239;;:::o;29380:295::-;27765:18;:16;:18::i;:::-;29522:4:::1;29513:6;;:13;;;;;;;;;;;;;;;;;;29601:19;29607:12;:10;:12::i;:::-;29601:19;;;;;;:::i;:::-;;;;;;;;29380:295::o:0;25697:191::-;25771:16;25790:6;;;;;;;;;;;25771:25;;25816:8;25807:6;;:17;;;;;;;;;;;;;;;;;;25871:8;25840:40;;25861:8;25840:40;;;;;;;;;;;;25760:128;25697:191;:::o;29987:589::-;30154:7;;30144:6;:17;;30136:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;30279:7;;30269:6;:17;;30261:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;30395:6;30385:7;:16;;;;30491:24;30502:12;:10;:12::i;:::-;30491:24;;;;;;:::i;:::-;;;;;;;;29987:589;:::o;29680:299::-;27955:15;:13;:15::i;:::-;29821:5:::1;29812:6;;:14;;;;;;;;;;;;;;;;;;29903:20;29910:12;:10;:12::i;:::-;29903:20;;;;;;:::i;:::-;;;;;;;;29680:299::o:0;58435:293::-;57837:1;58569:7;;:19;;58561:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;57837:1;58702:7;:18;;;;58435:293::o;50475:806::-;50588:1;50572:18;;:4;:18;;;;50564:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50665:1;50651:16;;:2;:16;;;;50643:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50720:38;50741:4;50747:2;50751:6;50720:20;:38::i;:::-;50771:19;50793:9;:15;50803:4;50793:15;;;;;;;;;;;;;;;;50771:37;;50842:6;50827:11;:21;;50819:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;50959:6;50945:11;:20;50927:9;:15;50937:4;50927:15;;;;;;;;;;;;;;;:38;;;;51162:6;51145:9;:13;51155:2;51145:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;51212:2;51197:26;;51206:4;51197:26;;;51216:6;51197:26;;;;;;:::i;:::-;;;;;;;;51236:37;51256:4;51262:2;51266:6;51236:19;:37::i;:::-;50553:728;50475:806;;;:::o;58736:213::-;57793:1;58919:7;:22;;;;58736:213::o;34762:492::-;34851:22;34859:4;34865:7;34851;:22::i;:::-;34846:401;;35039:28;35059:7;35039:19;:28::i;:::-;35140:38;35168:4;35160:13;;35175:2;35140:19;:38::i;:::-;34944:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34890:345;;;;;;;;;;;:::i;:::-;;;;;;;;34846:401;34762:492;;:::o;28859:199::-;28981:7;:5;:7::i;:::-;28980:8;28972:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;28859:199::o;29063:195::-;29178:7;:5;:7::i;:::-;29170:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29063:195::o;55218:91::-;;;;:::o;55913:90::-;;;;:::o;18882:151::-;18940:13;18973:52;19001:4;18985:22;;16757:2;18973:52;;:11;:52::i;:::-;18966:59;;18882:151;;;:::o;18278:447::-;18353:13;18379:19;18424:1;18415:6;18411:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18401:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18379:47;;18437:15;:6;18444:1;18437:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18463;:6;18470:1;18463:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18494:9;18519:1;18510:6;18506:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18494:26;;18489:131;18526:1;18522;:5;18489:131;;;18561:8;18578:3;18570:5;:11;18561:21;;;;;;;:::i;:::-;;;;;18549:6;18556:1;18549:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;18607:1;18597:11;;;;;18529:3;;;;:::i;:::-;;;18489:131;;;;18647:1;18638:5;:10;18630:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18710:6;18696:21;;;18278:447;;;;:::o;88:117:1:-;197:1;194;187:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:126::-;2945:7;2985:42;2978:5;2974:54;2963:65;;2908:126;;;:::o;3040:96::-;3077:7;3106:24;3124:5;3106:24;:::i;:::-;3095:35;;3040:96;;;:::o;3142:122::-;3215:24;3233:5;3215:24;:::i;:::-;3208:5;3205:35;3195:63;;3254:1;3251;3244:12;3195:63;3142:122;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:77::-;3452:7;3481:5;3470:16;;3415:77;;;:::o;3498:122::-;3571:24;3589:5;3571:24;:::i;:::-;3564:5;3561:35;3551:63;;3610:1;3607;3600:12;3551:63;3498:122;:::o;3626:139::-;3672:5;3710:6;3697:20;3688:29;;3726:33;3753:5;3726:33;:::i;:::-;3626:139;;;;:::o;3771:474::-;3839:6;3847;3896:2;3884:9;3875:7;3871:23;3867:32;3864:119;;;3902:79;;:::i;:::-;3864:119;4022:1;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3993:117;4149:2;4175:53;4220:7;4211:6;4200:9;4196:22;4175:53;:::i;:::-;4165:63;;4120:118;3771:474;;;;;:::o;4251:118::-;4338:24;4356:5;4338:24;:::i;:::-;4333:3;4326:37;4251:118;;:::o;4375:222::-;4468:4;4506:2;4495:9;4491:18;4483:26;;4519:71;4587:1;4576:9;4572:17;4563:6;4519:71;:::i;:::-;4375:222;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:77::-;5600:7;5629:5;5618:16;;5563:77;;;:::o;5646:122::-;5719:24;5737:5;5719:24;:::i;:::-;5712:5;5709:35;5699:63;;5758:1;5755;5748:12;5699:63;5646:122;:::o;5774:139::-;5820:5;5858:6;5845:20;5836:29;;5874:33;5901:5;5874:33;:::i;:::-;5774:139;;;;:::o;5919:329::-;5978:6;6027:2;6015:9;6006:7;6002:23;5998:32;5995:119;;;6033:79;;:::i;:::-;5995:119;6153:1;6178:53;6223:7;6214:6;6203:9;6199:22;6178:53;:::i;:::-;6168:63;;6124:117;5919:329;;;;:::o;6254:118::-;6341:24;6359:5;6341:24;:::i;:::-;6336:3;6329:37;6254:118;;:::o;6378:222::-;6471:4;6509:2;6498:9;6494:18;6486:26;;6522:71;6590:1;6579:9;6575:17;6566:6;6522:71;:::i;:::-;6378:222;;;;:::o;6606:474::-;6674:6;6682;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6984:2;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6955:118;6606:474;;;;;:::o;7086:86::-;7121:7;7161:4;7154:5;7150:16;7139:27;;7086:86;;;:::o;7178:112::-;7261:22;7277:5;7261:22;:::i;:::-;7256:3;7249:35;7178:112;;:::o;7296:214::-;7385:4;7423:2;7412:9;7408:18;7400:26;;7436:67;7500:1;7489:9;7485:17;7476:6;7436:67;:::i;:::-;7296:214;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:329::-;7927:6;7976:2;7964:9;7955:7;7951:23;7947:32;7944:119;;;7982:79;;:::i;:::-;7944:119;8102:1;8127:53;8172:7;8163:6;8152:9;8148:22;8127:53;:::i;:::-;8117:63;;8073:117;7868:329;;;;:::o;8203:474::-;8271:6;8279;8328:2;8316:9;8307:7;8303:23;8299:32;8296:119;;;8334:79;;:::i;:::-;8296:119;8454:1;8479:53;8524:7;8515:6;8504:9;8500:22;8479:53;:::i;:::-;8469:63;;8425:117;8581:2;8607:53;8652:7;8643:6;8632:9;8628:22;8607:53;:::i;:::-;8597:63;;8552:118;8203:474;;;;;:::o;8683:180::-;8731:77;8728:1;8721:88;8828:4;8825:1;8818:15;8852:4;8849:1;8842:15;8869:320;8913:6;8950:1;8944:4;8940:12;8930:22;;8997:1;8991:4;8987:12;9018:18;9008:81;;9074:4;9066:6;9062:17;9052:27;;9008:81;9136:2;9128:6;9125:14;9105:18;9102:38;9099:84;;;9155:18;;:::i;:::-;9099:84;8920:269;8869:320;;;:::o;9195:234::-;9335:34;9331:1;9323:6;9319:14;9312:58;9404:17;9399:2;9391:6;9387:15;9380:42;9195:234;:::o;9435:366::-;9577:3;9598:67;9662:2;9657:3;9598:67;:::i;:::-;9591:74;;9674:93;9763:3;9674:93;:::i;:::-;9792:2;9787:3;9783:12;9776:19;;9435:366;;;:::o;9807:419::-;9973:4;10011:2;10000:9;9996:18;9988:26;;10060:9;10054:4;10050:20;10046:1;10035:9;10031:17;10024:47;10088:131;10214:4;10088:131;:::i;:::-;10080:139;;9807:419;;;:::o;10232:180::-;10280:77;10277:1;10270:88;10377:4;10374:1;10367:15;10401:4;10398:1;10391:15;10418:305;10458:3;10477:20;10495:1;10477:20;:::i;:::-;10472:25;;10511:20;10529:1;10511:20;:::i;:::-;10506:25;;10665:1;10597:66;10593:74;10590:1;10587:81;10584:107;;;10671:18;;:::i;:::-;10584:107;10715:1;10712;10708:9;10701:16;;10418:305;;;;:::o;10729:224::-;10869:34;10865:1;10857:6;10853:14;10846:58;10938:7;10933:2;10925:6;10921:15;10914:32;10729:224;:::o;10959:366::-;11101:3;11122:67;11186:2;11181:3;11122:67;:::i;:::-;11115:74;;11198:93;11287:3;11198:93;:::i;:::-;11316:2;11311:3;11307:12;11300:19;;10959:366;;;:::o;11331:419::-;11497:4;11535:2;11524:9;11520:18;11512:26;;11584:9;11578:4;11574:20;11570:1;11559:9;11555:17;11548:47;11612:131;11738:4;11612:131;:::i;:::-;11604:139;;11331:419;;;:::o;11756:225::-;11896:34;11892:1;11884:6;11880:14;11873:58;11965:8;11960:2;11952:6;11948:15;11941:33;11756:225;:::o;11987:366::-;12129:3;12150:67;12214:2;12209:3;12150:67;:::i;:::-;12143:74;;12226:93;12315:3;12226:93;:::i;:::-;12344:2;12339:3;12335:12;12328:19;;11987:366;;;:::o;12359:419::-;12525:4;12563:2;12552:9;12548:18;12540:26;;12612:9;12606:4;12602:20;12598:1;12587:9;12583:17;12576:47;12640:131;12766:4;12640:131;:::i;:::-;12632:139;;12359:419;;;:::o;12784:223::-;12924:34;12920:1;12912:6;12908:14;12901:58;12993:6;12988:2;12980:6;12976:15;12969:31;12784:223;:::o;13013:366::-;13155:3;13176:67;13240:2;13235:3;13176:67;:::i;:::-;13169:74;;13252:93;13341:3;13252:93;:::i;:::-;13370:2;13365:3;13361:12;13354:19;;13013:366;;;:::o;13385:419::-;13551:4;13589:2;13578:9;13574:18;13566:26;;13638:9;13632:4;13628:20;13624:1;13613:9;13609:17;13602:47;13666:131;13792:4;13666:131;:::i;:::-;13658:139;;13385:419;;;:::o;13810:221::-;13950:34;13946:1;13938:6;13934:14;13927:58;14019:4;14014:2;14006:6;14002:15;13995:29;13810:221;:::o;14037:366::-;14179:3;14200:67;14264:2;14259:3;14200:67;:::i;:::-;14193:74;;14276:93;14365:3;14276:93;:::i;:::-;14394:2;14389:3;14385:12;14378:19;;14037:366;;;:::o;14409:419::-;14575:4;14613:2;14602:9;14598:18;14590:26;;14662:9;14656:4;14652:20;14648:1;14637:9;14633:17;14626:47;14690:131;14816:4;14690:131;:::i;:::-;14682:139;;14409:419;;;:::o;14834:182::-;14974:34;14970:1;14962:6;14958:14;14951:58;14834:182;:::o;15022:366::-;15164:3;15185:67;15249:2;15244:3;15185:67;:::i;:::-;15178:74;;15261:93;15350:3;15261:93;:::i;:::-;15379:2;15374:3;15370:12;15363:19;;15022:366;;;:::o;15394:419::-;15560:4;15598:2;15587:9;15583:18;15575:26;;15647:9;15641:4;15637:20;15633:1;15622:9;15618:17;15611:47;15675:131;15801:4;15675:131;:::i;:::-;15667:139;;15394:419;;;:::o;15819:179::-;15959:31;15955:1;15947:6;15943:14;15936:55;15819:179;:::o;16004:366::-;16146:3;16167:67;16231:2;16226:3;16167:67;:::i;:::-;16160:74;;16243:93;16332:3;16243:93;:::i;:::-;16361:2;16356:3;16352:12;16345:19;;16004:366;;;:::o;16376:419::-;16542:4;16580:2;16569:9;16565:18;16557:26;;16629:9;16623:4;16619:20;16615:1;16604:9;16600:17;16593:47;16657:131;16783:4;16657:131;:::i;:::-;16649:139;;16376:419;;;:::o;16801:225::-;16941:34;16937:1;16929:6;16925:14;16918:58;17010:8;17005:2;16997:6;16993:15;16986:33;16801:225;:::o;17032:366::-;17174:3;17195:67;17259:2;17254:3;17195:67;:::i;:::-;17188:74;;17271:93;17360:3;17271:93;:::i;:::-;17389:2;17384:3;17380:12;17373:19;;17032:366;;;:::o;17404:419::-;17570:4;17608:2;17597:9;17593:18;17585:26;;17657:9;17651:4;17647:20;17643:1;17632:9;17628:17;17621:47;17685:131;17811:4;17685:131;:::i;:::-;17677:139;;17404:419;;;:::o;17829:348::-;17869:7;17892:20;17910:1;17892:20;:::i;:::-;17887:25;;17926:20;17944:1;17926:20;:::i;:::-;17921:25;;18114:1;18046:66;18042:74;18039:1;18036:81;18031:1;18024:9;18017:17;18013:105;18010:131;;;18121:18;;:::i;:::-;18010:131;18169:1;18166;18162:9;18151:20;;17829:348;;;;:::o;18183:180::-;18231:77;18228:1;18221:88;18328:4;18325:1;18318:15;18352:4;18349:1;18342:15;18369:185;18409:1;18426:20;18444:1;18426:20;:::i;:::-;18421:25;;18460:20;18478:1;18460:20;:::i;:::-;18455:25;;18499:1;18489:35;;18504:18;;:::i;:::-;18489:35;18546:1;18543;18539:9;18534:14;;18369:185;;;;:::o;18560:191::-;18600:4;18620:20;18638:1;18620:20;:::i;:::-;18615:25;;18654:20;18672:1;18654:20;:::i;:::-;18649:25;;18693:1;18690;18687:8;18684:34;;;18698:18;;:::i;:::-;18684:34;18743:1;18740;18736:9;18728:17;;18560:191;;;;:::o;18757:174::-;18897:26;18893:1;18885:6;18881:14;18874:50;18757:174;:::o;18937:366::-;19079:3;19100:67;19164:2;19159:3;19100:67;:::i;:::-;19093:74;;19176:93;19265:3;19176:93;:::i;:::-;19294:2;19289:3;19285:12;19278:19;;18937:366;;;:::o;19309:419::-;19475:4;19513:2;19502:9;19498:18;19490:26;;19562:9;19556:4;19552:20;19548:1;19537:9;19533:17;19526:47;19590:131;19716:4;19590:131;:::i;:::-;19582:139;;19309:419;;;:::o;19734:173::-;19874:25;19870:1;19862:6;19858:14;19851:49;19734:173;:::o;19913:366::-;20055:3;20076:67;20140:2;20135:3;20076:67;:::i;:::-;20069:74;;20152:93;20241:3;20152:93;:::i;:::-;20270:2;20265:3;20261:12;20254:19;;19913:366;;;:::o;20285:419::-;20451:4;20489:2;20478:9;20474:18;20466:26;;20538:9;20532:4;20528:20;20524:1;20513:9;20509:17;20502:47;20566:131;20692:4;20566:131;:::i;:::-;20558:139;;20285:419;;;:::o;20710:181::-;20850:33;20846:1;20838:6;20834:14;20827:57;20710:181;:::o;20897:366::-;21039:3;21060:67;21124:2;21119:3;21060:67;:::i;:::-;21053:74;;21136:93;21225:3;21136:93;:::i;:::-;21254:2;21249:3;21245:12;21238:19;;20897:366;;;:::o;21269:419::-;21435:4;21473:2;21462:9;21458:18;21450:26;;21522:9;21516:4;21512:20;21508:1;21497:9;21493:17;21486:47;21550:131;21676:4;21550:131;:::i;:::-;21542:139;;21269:419;;;:::o;21694:224::-;21834:34;21830:1;21822:6;21818:14;21811:58;21903:7;21898:2;21890:6;21886:15;21879:32;21694:224;:::o;21924:366::-;22066:3;22087:67;22151:2;22146:3;22087:67;:::i;:::-;22080:74;;22163:93;22252:3;22163:93;:::i;:::-;22281:2;22276:3;22272:12;22265:19;;21924:366;;;:::o;22296:419::-;22462:4;22500:2;22489:9;22485:18;22477:26;;22549:9;22543:4;22539:20;22535:1;22524:9;22520:17;22513:47;22577:131;22703:4;22577:131;:::i;:::-;22569:139;;22296:419;;;:::o;22721:222::-;22861:34;22857:1;22849:6;22845:14;22838:58;22930:5;22925:2;22917:6;22913:15;22906:30;22721:222;:::o;22949:366::-;23091:3;23112:67;23176:2;23171:3;23112:67;:::i;:::-;23105:74;;23188:93;23277:3;23188:93;:::i;:::-;23306:2;23301:3;23297:12;23290:19;;22949:366;;;:::o;23321:419::-;23487:4;23525:2;23514:9;23510:18;23502:26;;23574:9;23568:4;23564:20;23560:1;23549:9;23545:17;23538:47;23602:131;23728:4;23602:131;:::i;:::-;23594:139;;23321:419;;;:::o;23746:225::-;23886:34;23882:1;23874:6;23870:14;23863:58;23955:8;23950:2;23942:6;23938:15;23931:33;23746:225;:::o;23977:366::-;24119:3;24140:67;24204:2;24199:3;24140:67;:::i;:::-;24133:74;;24216:93;24305:3;24216:93;:::i;:::-;24334:2;24329:3;24325:12;24318:19;;23977:366;;;:::o;24349:419::-;24515:4;24553:2;24542:9;24538:18;24530:26;;24602:9;24596:4;24592:20;24588:1;24577:9;24573:17;24566:47;24630:131;24756:4;24630:131;:::i;:::-;24622:139;;24349:419;;;:::o;24774:148::-;24876:11;24913:3;24898:18;;24774:148;;;;:::o;24928:173::-;25068:25;25064:1;25056:6;25052:14;25045:49;24928:173;:::o;25107:402::-;25267:3;25288:85;25370:2;25365:3;25288:85;:::i;:::-;25281:92;;25382:93;25471:3;25382:93;:::i;:::-;25500:2;25495:3;25491:12;25484:19;;25107:402;;;:::o;25515:377::-;25621:3;25649:39;25682:5;25649:39;:::i;:::-;25704:89;25786:6;25781:3;25704:89;:::i;:::-;25697:96;;25802:52;25847:6;25842:3;25835:4;25828:5;25824:16;25802:52;:::i;:::-;25879:6;25874:3;25870:16;25863:23;;25625:267;25515:377;;;;:::o;25898:167::-;26038:19;26034:1;26026:6;26022:14;26015:43;25898:167;:::o;26071:402::-;26231:3;26252:85;26334:2;26329:3;26252:85;:::i;:::-;26245:92;;26346:93;26435:3;26346:93;:::i;:::-;26464:2;26459:3;26455:12;26448:19;;26071:402;;;:::o;26479:967::-;26861:3;26883:148;27027:3;26883:148;:::i;:::-;26876:155;;27048:95;27139:3;27130:6;27048:95;:::i;:::-;27041:102;;27160:148;27304:3;27160:148;:::i;:::-;27153:155;;27325:95;27416:3;27407:6;27325:95;:::i;:::-;27318:102;;27437:3;27430:10;;26479:967;;;;;:::o;27452:164::-;27592:16;27588:1;27580:6;27576:14;27569:40;27452:164;:::o;27622:366::-;27764:3;27785:67;27849:2;27844:3;27785:67;:::i;:::-;27778:74;;27861:93;27950:3;27861:93;:::i;:::-;27979:2;27974:3;27970:12;27963:19;;27622:366;;;:::o;27994:419::-;28160:4;28198:2;28187:9;28183:18;28175:26;;28247:9;28241:4;28237:20;28233:1;28222:9;28218:17;28211:47;28275:131;28401:4;28275:131;:::i;:::-;28267:139;;27994:419;;;:::o;28419:168::-;28559:20;28555:1;28547:6;28543:14;28536:44;28419:168;:::o;28593:366::-;28735:3;28756:67;28820:2;28815:3;28756:67;:::i;:::-;28749:74;;28832:93;28921:3;28832:93;:::i;:::-;28950:2;28945:3;28941:12;28934:19;;28593:366;;;:::o;28965:419::-;29131:4;29169:2;29158:9;29154:18;29146:26;;29218:9;29212:4;29208:20;29204:1;29193:9;29189:17;29182:47;29246:131;29372:4;29246:131;:::i;:::-;29238:139;;28965:419;;;:::o;29390:180::-;29438:77;29435:1;29428:88;29535:4;29532:1;29525:15;29559:4;29556:1;29549:15;29576:180;29624:77;29621:1;29614:88;29721:4;29718:1;29711:15;29745:4;29742:1;29735:15;29762:171;29801:3;29824:24;29842:5;29824:24;:::i;:::-;29815:33;;29870:4;29863:5;29860:15;29857:41;;;29878:18;;:::i;:::-;29857:41;29925:1;29918:5;29914:13;29907:20;;29762:171;;;:::o;29939:182::-;30079:34;30075:1;30067:6;30063:14;30056:58;29939:182;:::o;30127:366::-;30269:3;30290:67;30354:2;30349:3;30290:67;:::i;:::-;30283:74;;30366:93;30455:3;30366:93;:::i;:::-;30484:2;30479:3;30475:12;30468:19;;30127:366;;;:::o;30499:419::-;30665:4;30703:2;30692:9;30688:18;30680:26;;30752:9;30746:4;30742:20;30738:1;30727:9;30723:17;30716:47;30780:131;30906:4;30780:131;:::i;:::-;30772:139;;30499:419;;;:::o

Swarm Source

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