ETH Price: $3,484.06 (+0.94%)

Token

ZhuSu (ZHUSU)
 

Overview

Max Total Supply

1,000,000 ZHUSU

Holders

45

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000336201 ZHUSU

Value
$0.00
0x710a66d0b884b3e46c1c6eae8f9e2887f2a0337e
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:
ZhuSu

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-13
*/

/*
▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▓▓▓▒▓▓▓▓▓▓▓▓▓▓▒▒▒
▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓████████████▓▓█▓▓▓▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒
▒▒▒▓▓▓▓▓▓▓▓██████████████████████████▓▓▓▒▒▒▒▓▓▓▒▒▒
▓▒▓▓▓▓▓▓▓██████████████████████████████▓▓▓▓▒▒▒▒▒▒▒
▒▒▓▓▒▒▓█████████████████████████████▓███████▓▒▒▒▒▒
▒▒▒▒▒▓█████████████▓▓▓▓▓▓▓▓▓▓███▓▓▓▓▓▓███████▓▒▒▒▒
▒▒▒▒▓██▓███████▓▓▓▓▒▓▓▓▒▓▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓██████▓▒▒▓
▒▒▒▒▓██████████▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓█████▒▒▒▒
▒▒▒▒██████████▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓███▒▒▒▒
▒▒▒▓████████▓▓▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓█▓▓▒▒▒▒
▒▒▒▓██████▓▓▓▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▒▒▒▓▓▓▓▓▓▓▒▒▒▒▒
▒▒▓████▓▓▓▓▓▓▒░░▒▒▒▒▒▒▒▓▓▓▓▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒
▒▒▓██▓▓▓▓▓▓▓▓▒░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▒▒▒▒▒▒▓▓▒▒▒▒▒▒
▒▒▓▓▒▒▒▒▒▒▒▒▒▒▒░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▒▒▒▒▒▓▒▒▒▒▒▒▒
▒▒▓▓▒▒▒░░░▒▒▒▒▒▒░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▒▒▓▓▓▒▒▒▒▒▒▒
▒▒▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒
▒▒▓▓▓▓▓▓▒▒▒░▒▒░░▒░░▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒
▓▓▓▓▓█████▓▓▓▓▒▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓██████████▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓██▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓████████████▓▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓███▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓██████▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▓▒▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓

$ZHUSU

Twitter: https://twitter.com/ZHUSU_ERC
Telegram: https://t.me/ZHUSU_ERC

*/

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

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

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

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

// File: contracts/ZhuSu.sol

pragma solidity ^0.8.20;







contract ZhuSu is ERC20, Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public marketingWallet;
    address public devWallet;    

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyMarketingFee;
    uint256 public buyLiquidityFee;
    uint256 public buyDevFee;

    uint256 public sellTotalFees;
    uint256 public sellMarketingFee;
    uint256 public sellLiquidityFee;
    uint256 public sellDevFee;

    uint256 public tokensForMarketing;
    uint256 public tokensForLiquidity;
    uint256 public tokensForDev;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    
    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event marketingWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event devWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    event AutoNukeLP();

    event ManualNukeLP();

    constructor() ERC20("ZhuSu", "ZHUSU") {
 
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); // RocketSwap
 
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
 
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
 
        uint256 _buyMarketingFee;
        uint256 _buyLiquidityFee;
        uint256 _buyDevFee = 5;
 
        uint256 _sellMarketingFee;
        uint256 _sellLiquidityFee;
        uint256 _sellDevFee = 5;
 
        uint256 totalSupply = 1_000_000 * 1e18;
 
        maxTransactionAmount = totalSupply * 50 / 1000; // 5% maxTransactionAmountTxn
        maxWallet = totalSupply * 50 / 1000; // 5% maxWallet
        swapTokensAtAmount = totalSupply * 10 / 10000; // 0.1% swap wallet
 
        buyMarketingFee = _buyMarketingFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyDevFee = _buyDevFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
 
        sellMarketingFee = _sellMarketingFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellDevFee = _sellDevFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
 
        marketingWallet = address(owner()); // set as marketing wallet
        devWallet = address(owner()); // set as dev wallet
 
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
 
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
 
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    function setRouter(address router) public onlyOwner {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(router);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner returns (bool) {
        transferDelayEnabled = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.1%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set maxWallet lower than 0.5%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        buyMarketingFee = _marketingFee;
        buyLiquidityFee = _liquidityFee;
        buyDevFee = _devFee;
        buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
        require(buyTotalFees <= 20, "Must keep fees at 20% or less");
    }

    function updateSellFees(
        uint256 _marketingFee,
        uint256 _liquidityFee,
        uint256 _devFee
    ) external onlyOwner {
        sellMarketingFee = _marketingFee;
        sellLiquidityFee = _liquidityFee;
        sellDevFee = _devFee;
        sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
        require(sellTotalFees <= 25, "Must keep fees at 25% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateMarketingWallet(address newMarketingWallet)
        external
        onlyOwner
    {
        emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function updateDevWallet(address newWallet) external onlyOwner {
        emit devWalletUpdated(newWallet, devWallet);
        devWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.
                if (transferDelayEnabled) {
                    if (
                        to != owner() &&
                        to != address(uniswapV2Router) &&
                        to != address(uniswapV2Pair)
                    ) {
                        require(
                            _holderLastTransferTimestamp[tx.origin] <
                                block.number,
                            "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed."
                        );
                        _holderLastTransferTimestamp[tx.origin] = block.number;
                    }
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev += (fees * sellDevFee) / sellTotalFees;
                tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev += (fees * buyDevFee) / buyTotalFees;
                tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            marketingWallet,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForMarketing +
            tokensForDev;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
            totalTokensToSwap
        );
        uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);

        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;

        tokensForLiquidity = 0;
        tokensForMarketing = 0;
        tokensForDev = 0;

        (success, ) = address(devWallet).call{value: ethForDev}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        (success, ) = address(marketingWallet).call{
            value: address(this).balance
        }("");
    }

    function payout() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawToken() public onlyOwner {
        this.approve(address(this), totalSupply());
        this.transferFrom(address(this), owner(), balanceOf(address(this)));
    }
}

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":[],"name":"AutoNukeLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[],"name":"ManualNukeLP","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","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":"payout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600e805462ffffff191660019081179091556010805460ff191690911790553480156200002f575f80fd5b50604051806040016040528060058152602001645a6875537560d81b815250604051806040016040528060058152602001645a4855535560d81b81525081600390816200007d9190620006f6565b5060046200008c8282620006f6565b505050620000a9620000a3620003eb60201b60201c565b620003ef565b60016006819055737a250d5630b4cf539739df2c5dacb4c659f2488d90620000d390829062000440565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200012b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001519190620007be565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200019d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c39190620007be565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156200020e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002349190620007be565b600880546001600160a01b0319166001600160a01b039290921691821790556200026090600162000440565b60085462000279906001600160a01b0316600162000474565b5f80600581808269d3c21bcecceda10000006103e86200029b82603262000801565b620002a7919062000821565b600b556103e8620002ba82603262000801565b620002c6919062000821565b600d55612710620002d982600a62000801565b620002e5919062000821565b600c556012879055601386905560148590558462000304878962000841565b62000310919062000841565b601155601684905560178390556018829055816200032f848662000841565b6200033b919062000841565b601555600554600980546001600160a01b03199081166001600160a01b03909316928317909155600a8054909116821790556200037a906001620004c7565b62000387306001620004c7565b6200039661dead6001620004c7565b620003b5620003ad6005546001600160a01b031690565b600162000440565b620003c230600162000440565b620003d161dead600162000440565b620003dd33826200052f565b505050505050505062000857565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6200044a620005f4565b6001600160a01b03919091165f908152601d60205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b620004d1620005f4565b6001600160a01b0382165f818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200058b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060025f8282546200059e919062000841565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b03163314620006505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000582565b565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200068057607f821691505b6020821081036200069f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000652575f81815260208120601f850160051c81016020861015620006cd5750805b601f850160051c820191505b81811015620006ee57828155600101620006d9565b505050505050565b81516001600160401b0381111562000712576200071262000657565b6200072a816200072384546200066b565b84620006a5565b602080601f83116001811462000760575f8415620007485750858301515b5f19600386901b1c1916600185901b178555620006ee565b5f85815260208120601f198616915b8281101562000790578886015182559484019460019091019084016200076f565b5085821015620007ae57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620007cf575f80fd5b81516001600160a01b0381168114620007e6575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176200081b576200081b620007ed565b92915050565b5f826200083c57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200081b576200081b620007ed565b61292280620008655f395ff3fe608060405260043610610369575f3560e01c80638ea5220f116101c8578063c0d78655116100fd578063d85ba0631161009d578063f11a24d31161006d578063f11a24d314610986578063f2fde38b1461099b578063f6374342146109ba578063f8b45b05146109cf575f80fd5b8063d85ba06314610929578063dd62ed3e1461093e578063e2f456051461095d578063e884f26014610972575f80fd5b8063c876d0b9116100d8578063c876d0b9146108c8578063c8c8ebe4146108e1578063ca628c78146108f6578063d257b34f1461090a575f80fd5b8063c0d786551461086b578063c17b5b8c1461088a578063c18bc195146108a9575f80fd5b8063a0d82dc511610168578063aacebbe311610143578063aacebbe3146107e1578063b62496f514610800578063bbc0c7421461082e578063c02466681461084c575f80fd5b8063a0d82dc51461078e578063a457c2d7146107a3578063a9059cbb146107c2575f80fd5b806395d89b41116101a357806395d89b41146107315780639a7a23d6146107455780639c3b4fdc146107645780639fccce3214610779575f80fd5b80638ea5220f146106de57806392136913146106fd578063924de9b714610712575f80fd5b80634a62bb651161029e578063751039fc1161023e5780637bce5a04116102195780637bce5a04146106795780638095d5641461068e5780638a8c523c146106ad5780638da5cb5b146106c1575f80fd5b8063751039fc146106275780637571336a1461063b57806375f0a8741461065a575f80fd5b80636a486a8e116102795780636a486a8e146105ab5780636ddd1713146105c057806370a08231146105df578063715018a614610613575f80fd5b80634a62bb65146105475780634fbee1931461056057806363bd1d4a14610597575f80fd5b80631f3fed8f1161030957806327c8f835116102e457806327c8f835146104d9578063313ce567146104ee578063395093511461050957806349bd5a5e14610528575f80fd5b80631f3fed8f14610486578063203e727e1461049b57806323b872dd146104ba575f80fd5b80631694505e116103445780631694505e146103fb57806318160ddd146104325780631816467f146104505780631a8145bb14610471575f80fd5b806306fdde0314610374578063095ea7b31461039e57806310d5de53146103cd575f80fd5b3661037057005b5f80fd5b34801561037f575f80fd5b506103886109e4565b604051610395919061252b565b60405180910390f35b3480156103a9575f80fd5b506103bd6103b836600461258a565b610a74565b6040519015158152602001610395565b3480156103d8575f80fd5b506103bd6103e73660046125b4565b601d6020525f908152604090205460ff1681565b348015610406575f80fd5b5060075461041a906001600160a01b031681565b6040516001600160a01b039091168152602001610395565b34801561043d575f80fd5b506002545b604051908152602001610395565b34801561045b575f80fd5b5061046f61046a3660046125b4565b610a8d565b005b34801561047c575f80fd5b50610442601a5481565b348015610491575f80fd5b5061044260195481565b3480156104a6575f80fd5b5061046f6104b53660046125cf565b610af1565b3480156104c5575f80fd5b506103bd6104d43660046125e6565b610bb1565b3480156104e4575f80fd5b5061041a61dead81565b3480156104f9575f80fd5b5060405160128152602001610395565b348015610514575f80fd5b506103bd61052336600461258a565b610bd4565b348015610533575f80fd5b5060085461041a906001600160a01b031681565b348015610552575f80fd5b50600e546103bd9060ff1681565b34801561056b575f80fd5b506103bd61057a3660046125b4565b6001600160a01b03165f908152601c602052604090205460ff1690565b3480156105a2575f80fd5b5061046f610bf5565b3480156105b6575f80fd5b5061044260155481565b3480156105cb575f80fd5b50600e546103bd9062010000900460ff1681565b3480156105ea575f80fd5b506104426105f93660046125b4565b6001600160a01b03165f9081526020819052604090205490565b34801561061e575f80fd5b5061046f610c29565b348015610632575f80fd5b506103bd610c3c565b348015610646575f80fd5b5061046f610655366004612631565b610c55565b348015610665575f80fd5b5060095461041a906001600160a01b031681565b348015610684575f80fd5b5061044260125481565b348015610699575f80fd5b5061046f6106a8366004612668565b610c87565b3480156106b8575f80fd5b5061046f610d0d565b3480156106cc575f80fd5b506005546001600160a01b031661041a565b3480156106e9575f80fd5b50600a5461041a906001600160a01b031681565b348015610708575f80fd5b5061044260165481565b34801561071d575f80fd5b5061046f61072c366004612691565b610d28565b34801561073c575f80fd5b50610388610d4c565b348015610750575f80fd5b5061046f61075f366004612631565b610d5b565b34801561076f575f80fd5b5061044260145481565b348015610784575f80fd5b50610442601b5481565b348015610799575f80fd5b5061044260185481565b3480156107ae575f80fd5b506103bd6107bd36600461258a565b610df5565b3480156107cd575f80fd5b506103bd6107dc36600461258a565b610e6f565b3480156107ec575f80fd5b5061046f6107fb3660046125b4565b610e7c565b34801561080b575f80fd5b506103bd61081a3660046125b4565b601e6020525f908152604090205460ff1681565b348015610839575f80fd5b50600e546103bd90610100900460ff1681565b348015610857575f80fd5b5061046f610866366004612631565b610ee0565b348015610876575f80fd5b5061046f6108853660046125b4565b610f46565b348015610895575f80fd5b5061046f6108a4366004612668565b6110f3565b3480156108b4575f80fd5b5061046f6108c33660046125cf565b611174565b3480156108d3575f80fd5b506010546103bd9060ff1681565b3480156108ec575f80fd5b50610442600b5481565b348015610901575f80fd5b5061046f611223565b348015610915575f80fd5b506103bd6109243660046125cf565b611345565b348015610934575f80fd5b5061044260115481565b348015610949575f80fd5b506104426109583660046126ac565b611473565b348015610968575f80fd5b50610442600c5481565b34801561097d575f80fd5b506103bd61149d565b348015610991575f80fd5b5061044260135481565b3480156109a6575f80fd5b5061046f6109b53660046125b4565b6114b6565b3480156109c5575f80fd5b5061044260175481565b3480156109da575f80fd5b50610442600d5481565b6060600380546109f3906126d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1f906126d8565b8015610a6a5780601f10610a4157610100808354040283529160200191610a6a565b820191905f5260205f20905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b5f33610a8181858561152c565b60019150505b92915050565b610a9561164f565b600a546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e743905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610af961164f565b670de0b6b3a76400006103e8610b0e60025490565b610b19906001612724565b610b23919061273b565b610b2d919061273b565b811015610b995760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610bab81670de0b6b3a7640000612724565b600b5550565b5f33610bbe8582856116a9565b610bc9858585611721565b506001949350505050565b5f33610a81818585610be68383611473565b610bf0919061275a565b61152c565b610bfd61164f565b60405133904780156108fc02915f818181858888f19350505050158015610c26573d5f803e3d5ffd5b50565b610c3161164f565b610c3a5f611f0c565b565b5f610c4561164f565b50600e805460ff19169055600190565b610c5d61164f565b6001600160a01b03919091165f908152601d60205260409020805460ff1916911515919091179055565b610c8f61164f565b60128390556013829055601481905580610ca9838561275a565b610cb3919061275a565b601181905560141015610d085760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b90565b505050565b610d1561164f565b600e805462ffff00191662010100179055565b610d3061164f565b600e8054911515620100000262ff000019909216919091179055565b6060600480546109f3906126d8565b610d6361164f565b6008546001600160a01b0390811690831603610de75760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b90565b610df18282611f5d565b5050565b5f3381610e028286611473565b905083811015610e625760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b90565b610bc9828686840361152c565b5f33610a81818585611721565b610e8461164f565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b610ee861164f565b6001600160a01b0382165f818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610f4e61164f565b80610f5a816001610c55565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd5919061276d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611020573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611044919061276d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561108e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b2919061276d565b600880546001600160a01b0319166001600160a01b039290921691821790556110dc906001610c55565b600854610df1906001600160a01b03166001611f5d565b6110fb61164f565b60168390556017829055601881905580611115838561275a565b61111f919061275a565b601581905560191015610d085760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610b90565b61117c61164f565b670de0b6b3a76400006103e861119160025490565b61119c906005612724565b6111a6919061273b565b6111b0919061273b565b81101561120b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b90565b61121d81670de0b6b3a7640000612724565b600d5550565b61122b61164f565b3063095ea7b38161123b60025490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611283573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a79190612788565b50306323b872dd816112c16005546001600160a01b031690565b305f908152602081905260409020546040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af1158015611321573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c269190612788565b5f61134e61164f565b620186a061135b60025490565b611366906001612724565b611370919061273b565b8210156113dd5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b90565b6103e86113e960025490565b6113f4906005612724565b6113fe919061273b565b82111561146a5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b90565b50600c55600190565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f6114a661164f565b506010805460ff19169055600190565b6114be61164f565b6001600160a01b0381166115235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b90565b610c2681611f0c565b6001600160a01b03831661158e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b90565b6001600160a01b0382166115ef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b90565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610c3a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b90565b5f6116b48484611473565b90505f19811461171b578181101561170e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b90565b61171b848484840361152c565b50505050565b6001600160a01b0383166117475760405162461bcd60e51b8152600401610b90906127a3565b6001600160a01b03821661176d5760405162461bcd60e51b8152600401610b90906127e8565b805f0361177f57610d0883835f611fb0565b600e5460ff1615611be9576005546001600160a01b038481169116148015906117b657506005546001600160a01b03838116911614155b80156117ca57506001600160a01b03821615155b80156117e157506001600160a01b03821661dead14155b80156117f75750600854600160a01b900460ff16155b15611be957600e54610100900460ff1661188d576001600160a01b0383165f908152601c602052604090205460ff168061184857506001600160a01b0382165f908152601c602052604090205460ff165b61188d5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b90565b60105460ff161561198a576005546001600160a01b038381169116148015906118c457506007546001600160a01b03838116911614155b80156118de57506008546001600160a01b03838116911614155b1561198a57325f908152600f602052604090205443116119785760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b90565b325f908152600f602052604090204390555b6001600160a01b0383165f908152601e602052604090205460ff1680156119c957506001600160a01b0382165f908152601d602052604090205460ff16155b15611aac57600b54811115611a3e5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b90565b600d546001600160a01b0383165f90815260208190526040902054611a63908361275a565b1115611aa75760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b90565b611be9565b6001600160a01b0382165f908152601e602052604090205460ff168015611aeb57506001600160a01b0383165f908152601d602052604090205460ff16155b15611b6157600b54811115611aa75760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b90565b6001600160a01b0382165f908152601d602052604090205460ff16611be957600d546001600160a01b0383165f90815260208190526040902054611ba5908361275a565b1115611be95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b90565b305f90815260208190526040902054600c5481108015908190611c145750600e5462010000900460ff165b8015611c2a5750600854600160a01b900460ff16155b8015611c4e57506001600160a01b0385165f908152601e602052604090205460ff16155b8015611c7257506001600160a01b0385165f908152601c602052604090205460ff16155b8015611c9657506001600160a01b0384165f908152601c602052604090205460ff16155b15611cc4576008805460ff60a01b1916600160a01b179055611cb66120d8565b6008805460ff60a01b191690555b6008546001600160a01b0386165f908152601c602052604090205460ff600160a01b909204821615911680611d1057506001600160a01b0385165f908152601c602052604090205460ff165b15611d1857505f5b5f8115611ef8576001600160a01b0386165f908152601e602052604090205460ff168015611d4757505f601554115b15611e0257611d6c6064611d666015548861230290919063ffffffff16565b90612314565b905060155460175482611d7f9190612724565b611d89919061273b565b601a5f828254611d99919061275a565b9091555050601554601854611dae9083612724565b611db8919061273b565b601b5f828254611dc8919061275a565b9091555050601554601654611ddd9083612724565b611de7919061273b565b60195f828254611df7919061275a565b90915550611eda9050565b6001600160a01b0387165f908152601e602052604090205460ff168015611e2a57505f601154115b15611eda57611e496064611d666011548861230290919063ffffffff16565b905060115460135482611e5c9190612724565b611e66919061273b565b601a5f828254611e76919061275a565b9091555050601154601454611e8b9083612724565b611e95919061273b565b601b5f828254611ea5919061275a565b9091555050601154601254611eba9083612724565b611ec4919061273b565b60195f828254611ed4919061275a565b90915550505b8015611eeb57611eeb873083611fb0565b611ef5818661282b565b94505b611f03878787611fb0565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611fd65760405162461bcd60e51b8152600401610b90906127a3565b6001600160a01b038216611ffc5760405162461bcd60e51b8152600401610b90906127e8565b6001600160a01b0383165f90815260208190526040902054818110156120735760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b90565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361171b565b305f9081526020819052604081205490505f601b54601954601a546120fd919061275a565b612107919061275a565b90505f821580612115575081155b1561211f57505050565b600c5461212d906014612724565b83111561214557600c54612142906014612724565b92505b5f600283601a54866121579190612724565b612161919061273b565b61216b919061273b565b90505f612178858361231f565b9050476121848261232a565b5f61218f478361231f565b90505f6121ab87611d666019548561230290919063ffffffff16565b90505f6121c788611d66601b548661230290919063ffffffff16565b90505f816121d5848661282b565b6121df919061282b565b5f601a8190556019819055601b819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f8114612239576040519150601f19603f3d011682016040523d82523d5f602084013e61223e565b606091505b5090985050861580159061225157505f81115b156122a457612260878261247a565b601a54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f81146122ee576040519150601f19603f3d011682016040523d82523d5f602084013e6122f3565b606091505b50505050505050505050505050565b5f61230d8284612724565b9392505050565b5f61230d828461273b565b5f61230d828461282b565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061235d5761235d61283e565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156123b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d8919061276d565b816001815181106123eb576123eb61283e565b6001600160a01b039283166020918202929092010152600754612411913091168461152c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906124499085905f90869030904290600401612852565b5f604051808303815f87803b158015612460575f80fd5b505af1158015612472573d5f803e3d5ffd5b505050505050565b6007546124929030906001600160a01b03168461152c565b60075460095460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156124ff573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061252491906128c1565b5050505050565b5f6020808352835180828501525f5b818110156125565785810183015185820160400152820161253a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c26575f80fd5b5f806040838503121561259b575f80fd5b82356125a681612576565b946020939093013593505050565b5f602082840312156125c4575f80fd5b813561230d81612576565b5f602082840312156125df575f80fd5b5035919050565b5f805f606084860312156125f8575f80fd5b833561260381612576565b9250602084013561261381612576565b929592945050506040919091013590565b8015158114610c26575f80fd5b5f8060408385031215612642575f80fd5b823561264d81612576565b9150602083013561265d81612624565b809150509250929050565b5f805f6060848603121561267a575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156126a1575f80fd5b813561230d81612624565b5f80604083850312156126bd575f80fd5b82356126c881612576565b9150602083013561265d81612576565b600181811c908216806126ec57607f821691505b60208210810361270a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a8757610a87612710565b5f8261275557634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a8757610a87612710565b5f6020828403121561277d575f80fd5b815161230d81612576565b5f60208284031215612798575f80fd5b815161230d81612624565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a8757610a87612710565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156128a05784516001600160a01b03168352938301939183019160010161287b565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128d3575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c08d744bb55754ecb1ee4169ad0f6d0ef1e759e55c12a6bcdc290b1e8b30059464736f6c63430008140033

Deployed Bytecode

0x608060405260043610610369575f3560e01c80638ea5220f116101c8578063c0d78655116100fd578063d85ba0631161009d578063f11a24d31161006d578063f11a24d314610986578063f2fde38b1461099b578063f6374342146109ba578063f8b45b05146109cf575f80fd5b8063d85ba06314610929578063dd62ed3e1461093e578063e2f456051461095d578063e884f26014610972575f80fd5b8063c876d0b9116100d8578063c876d0b9146108c8578063c8c8ebe4146108e1578063ca628c78146108f6578063d257b34f1461090a575f80fd5b8063c0d786551461086b578063c17b5b8c1461088a578063c18bc195146108a9575f80fd5b8063a0d82dc511610168578063aacebbe311610143578063aacebbe3146107e1578063b62496f514610800578063bbc0c7421461082e578063c02466681461084c575f80fd5b8063a0d82dc51461078e578063a457c2d7146107a3578063a9059cbb146107c2575f80fd5b806395d89b41116101a357806395d89b41146107315780639a7a23d6146107455780639c3b4fdc146107645780639fccce3214610779575f80fd5b80638ea5220f146106de57806392136913146106fd578063924de9b714610712575f80fd5b80634a62bb651161029e578063751039fc1161023e5780637bce5a04116102195780637bce5a04146106795780638095d5641461068e5780638a8c523c146106ad5780638da5cb5b146106c1575f80fd5b8063751039fc146106275780637571336a1461063b57806375f0a8741461065a575f80fd5b80636a486a8e116102795780636a486a8e146105ab5780636ddd1713146105c057806370a08231146105df578063715018a614610613575f80fd5b80634a62bb65146105475780634fbee1931461056057806363bd1d4a14610597575f80fd5b80631f3fed8f1161030957806327c8f835116102e457806327c8f835146104d9578063313ce567146104ee578063395093511461050957806349bd5a5e14610528575f80fd5b80631f3fed8f14610486578063203e727e1461049b57806323b872dd146104ba575f80fd5b80631694505e116103445780631694505e146103fb57806318160ddd146104325780631816467f146104505780631a8145bb14610471575f80fd5b806306fdde0314610374578063095ea7b31461039e57806310d5de53146103cd575f80fd5b3661037057005b5f80fd5b34801561037f575f80fd5b506103886109e4565b604051610395919061252b565b60405180910390f35b3480156103a9575f80fd5b506103bd6103b836600461258a565b610a74565b6040519015158152602001610395565b3480156103d8575f80fd5b506103bd6103e73660046125b4565b601d6020525f908152604090205460ff1681565b348015610406575f80fd5b5060075461041a906001600160a01b031681565b6040516001600160a01b039091168152602001610395565b34801561043d575f80fd5b506002545b604051908152602001610395565b34801561045b575f80fd5b5061046f61046a3660046125b4565b610a8d565b005b34801561047c575f80fd5b50610442601a5481565b348015610491575f80fd5b5061044260195481565b3480156104a6575f80fd5b5061046f6104b53660046125cf565b610af1565b3480156104c5575f80fd5b506103bd6104d43660046125e6565b610bb1565b3480156104e4575f80fd5b5061041a61dead81565b3480156104f9575f80fd5b5060405160128152602001610395565b348015610514575f80fd5b506103bd61052336600461258a565b610bd4565b348015610533575f80fd5b5060085461041a906001600160a01b031681565b348015610552575f80fd5b50600e546103bd9060ff1681565b34801561056b575f80fd5b506103bd61057a3660046125b4565b6001600160a01b03165f908152601c602052604090205460ff1690565b3480156105a2575f80fd5b5061046f610bf5565b3480156105b6575f80fd5b5061044260155481565b3480156105cb575f80fd5b50600e546103bd9062010000900460ff1681565b3480156105ea575f80fd5b506104426105f93660046125b4565b6001600160a01b03165f9081526020819052604090205490565b34801561061e575f80fd5b5061046f610c29565b348015610632575f80fd5b506103bd610c3c565b348015610646575f80fd5b5061046f610655366004612631565b610c55565b348015610665575f80fd5b5060095461041a906001600160a01b031681565b348015610684575f80fd5b5061044260125481565b348015610699575f80fd5b5061046f6106a8366004612668565b610c87565b3480156106b8575f80fd5b5061046f610d0d565b3480156106cc575f80fd5b506005546001600160a01b031661041a565b3480156106e9575f80fd5b50600a5461041a906001600160a01b031681565b348015610708575f80fd5b5061044260165481565b34801561071d575f80fd5b5061046f61072c366004612691565b610d28565b34801561073c575f80fd5b50610388610d4c565b348015610750575f80fd5b5061046f61075f366004612631565b610d5b565b34801561076f575f80fd5b5061044260145481565b348015610784575f80fd5b50610442601b5481565b348015610799575f80fd5b5061044260185481565b3480156107ae575f80fd5b506103bd6107bd36600461258a565b610df5565b3480156107cd575f80fd5b506103bd6107dc36600461258a565b610e6f565b3480156107ec575f80fd5b5061046f6107fb3660046125b4565b610e7c565b34801561080b575f80fd5b506103bd61081a3660046125b4565b601e6020525f908152604090205460ff1681565b348015610839575f80fd5b50600e546103bd90610100900460ff1681565b348015610857575f80fd5b5061046f610866366004612631565b610ee0565b348015610876575f80fd5b5061046f6108853660046125b4565b610f46565b348015610895575f80fd5b5061046f6108a4366004612668565b6110f3565b3480156108b4575f80fd5b5061046f6108c33660046125cf565b611174565b3480156108d3575f80fd5b506010546103bd9060ff1681565b3480156108ec575f80fd5b50610442600b5481565b348015610901575f80fd5b5061046f611223565b348015610915575f80fd5b506103bd6109243660046125cf565b611345565b348015610934575f80fd5b5061044260115481565b348015610949575f80fd5b506104426109583660046126ac565b611473565b348015610968575f80fd5b50610442600c5481565b34801561097d575f80fd5b506103bd61149d565b348015610991575f80fd5b5061044260135481565b3480156109a6575f80fd5b5061046f6109b53660046125b4565b6114b6565b3480156109c5575f80fd5b5061044260175481565b3480156109da575f80fd5b50610442600d5481565b6060600380546109f3906126d8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1f906126d8565b8015610a6a5780601f10610a4157610100808354040283529160200191610a6a565b820191905f5260205f20905b815481529060010190602001808311610a4d57829003601f168201915b5050505050905090565b5f33610a8181858561152c565b60019150505b92915050565b610a9561164f565b600a546040516001600160a01b03918216918316907f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e743905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b610af961164f565b670de0b6b3a76400006103e8610b0e60025490565b610b19906001612724565b610b23919061273b565b610b2d919061273b565b811015610b995760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b60648201526084015b60405180910390fd5b610bab81670de0b6b3a7640000612724565b600b5550565b5f33610bbe8582856116a9565b610bc9858585611721565b506001949350505050565b5f33610a81818585610be68383611473565b610bf0919061275a565b61152c565b610bfd61164f565b60405133904780156108fc02915f818181858888f19350505050158015610c26573d5f803e3d5ffd5b50565b610c3161164f565b610c3a5f611f0c565b565b5f610c4561164f565b50600e805460ff19169055600190565b610c5d61164f565b6001600160a01b03919091165f908152601d60205260409020805460ff1916911515919091179055565b610c8f61164f565b60128390556013829055601481905580610ca9838561275a565b610cb3919061275a565b601181905560141015610d085760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b90565b505050565b610d1561164f565b600e805462ffff00191662010100179055565b610d3061164f565b600e8054911515620100000262ff000019909216919091179055565b6060600480546109f3906126d8565b610d6361164f565b6008546001600160a01b0390811690831603610de75760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b90565b610df18282611f5d565b5050565b5f3381610e028286611473565b905083811015610e625760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610b90565b610bc9828686840361152c565b5f33610a81818585611721565b610e8461164f565b6009546040516001600160a01b03918216918316907fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b05674905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b610ee861164f565b6001600160a01b0382165f818152601c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b610f4e61164f565b80610f5a816001610c55565b600780546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610fb1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd5919061276d565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611020573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611044919061276d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801561108e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110b2919061276d565b600880546001600160a01b0319166001600160a01b039290921691821790556110dc906001610c55565b600854610df1906001600160a01b03166001611f5d565b6110fb61164f565b60168390556017829055601881905580611115838561275a565b61111f919061275a565b601581905560191015610d085760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323525206f72206c6573730000006044820152606401610b90565b61117c61164f565b670de0b6b3a76400006103e861119160025490565b61119c906005612724565b6111a6919061273b565b6111b0919061273b565b81101561120b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b90565b61121d81670de0b6b3a7640000612724565b600d5550565b61122b61164f565b3063095ea7b38161123b60025490565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611283573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a79190612788565b50306323b872dd816112c16005546001600160a01b031690565b305f908152602081905260409020546040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303815f875af1158015611321573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c269190612788565b5f61134e61164f565b620186a061135b60025490565b611366906001612724565b611370919061273b565b8210156113dd5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b90565b6103e86113e960025490565b6113f4906005612724565b6113fe919061273b565b82111561146a5760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b90565b50600c55600190565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b5f6114a661164f565b506010805460ff19169055600190565b6114be61164f565b6001600160a01b0381166115235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b90565b610c2681611f0c565b6001600160a01b03831661158e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b90565b6001600160a01b0382166115ef5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b90565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610c3a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b90565b5f6116b48484611473565b90505f19811461171b578181101561170e5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b90565b61171b848484840361152c565b50505050565b6001600160a01b0383166117475760405162461bcd60e51b8152600401610b90906127a3565b6001600160a01b03821661176d5760405162461bcd60e51b8152600401610b90906127e8565b805f0361177f57610d0883835f611fb0565b600e5460ff1615611be9576005546001600160a01b038481169116148015906117b657506005546001600160a01b03838116911614155b80156117ca57506001600160a01b03821615155b80156117e157506001600160a01b03821661dead14155b80156117f75750600854600160a01b900460ff16155b15611be957600e54610100900460ff1661188d576001600160a01b0383165f908152601c602052604090205460ff168061184857506001600160a01b0382165f908152601c602052604090205460ff165b61188d5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b90565b60105460ff161561198a576005546001600160a01b038381169116148015906118c457506007546001600160a01b03838116911614155b80156118de57506008546001600160a01b03838116911614155b1561198a57325f908152600f602052604090205443116119785760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b90565b325f908152600f602052604090204390555b6001600160a01b0383165f908152601e602052604090205460ff1680156119c957506001600160a01b0382165f908152601d602052604090205460ff16155b15611aac57600b54811115611a3e5760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b90565b600d546001600160a01b0383165f90815260208190526040902054611a63908361275a565b1115611aa75760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b90565b611be9565b6001600160a01b0382165f908152601e602052604090205460ff168015611aeb57506001600160a01b0383165f908152601d602052604090205460ff16155b15611b6157600b54811115611aa75760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b90565b6001600160a01b0382165f908152601d602052604090205460ff16611be957600d546001600160a01b0383165f90815260208190526040902054611ba5908361275a565b1115611be95760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b90565b305f90815260208190526040902054600c5481108015908190611c145750600e5462010000900460ff165b8015611c2a5750600854600160a01b900460ff16155b8015611c4e57506001600160a01b0385165f908152601e602052604090205460ff16155b8015611c7257506001600160a01b0385165f908152601c602052604090205460ff16155b8015611c9657506001600160a01b0384165f908152601c602052604090205460ff16155b15611cc4576008805460ff60a01b1916600160a01b179055611cb66120d8565b6008805460ff60a01b191690555b6008546001600160a01b0386165f908152601c602052604090205460ff600160a01b909204821615911680611d1057506001600160a01b0385165f908152601c602052604090205460ff165b15611d1857505f5b5f8115611ef8576001600160a01b0386165f908152601e602052604090205460ff168015611d4757505f601554115b15611e0257611d6c6064611d666015548861230290919063ffffffff16565b90612314565b905060155460175482611d7f9190612724565b611d89919061273b565b601a5f828254611d99919061275a565b9091555050601554601854611dae9083612724565b611db8919061273b565b601b5f828254611dc8919061275a565b9091555050601554601654611ddd9083612724565b611de7919061273b565b60195f828254611df7919061275a565b90915550611eda9050565b6001600160a01b0387165f908152601e602052604090205460ff168015611e2a57505f601154115b15611eda57611e496064611d666011548861230290919063ffffffff16565b905060115460135482611e5c9190612724565b611e66919061273b565b601a5f828254611e76919061275a565b9091555050601154601454611e8b9083612724565b611e95919061273b565b601b5f828254611ea5919061275a565b9091555050601154601254611eba9083612724565b611ec4919061273b565b60195f828254611ed4919061275a565b90915550505b8015611eeb57611eeb873083611fb0565b611ef5818661282b565b94505b611f03878787611fb0565b50505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152601e6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316611fd65760405162461bcd60e51b8152600401610b90906127a3565b6001600160a01b038216611ffc5760405162461bcd60e51b8152600401610b90906127e8565b6001600160a01b0383165f90815260208190526040902054818110156120735760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610b90565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361171b565b305f9081526020819052604081205490505f601b54601954601a546120fd919061275a565b612107919061275a565b90505f821580612115575081155b1561211f57505050565b600c5461212d906014612724565b83111561214557600c54612142906014612724565b92505b5f600283601a54866121579190612724565b612161919061273b565b61216b919061273b565b90505f612178858361231f565b9050476121848261232a565b5f61218f478361231f565b90505f6121ab87611d666019548561230290919063ffffffff16565b90505f6121c788611d66601b548661230290919063ffffffff16565b90505f816121d5848661282b565b6121df919061282b565b5f601a8190556019819055601b819055600a546040519293506001600160a01b031691849181818185875af1925050503d805f8114612239576040519150601f19603f3d011682016040523d82523d5f602084013e61223e565b606091505b5090985050861580159061225157505f81115b156122a457612260878261247a565b601a54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6009546040516001600160a01b039091169047905f81818185875af1925050503d805f81146122ee576040519150601f19603f3d011682016040523d82523d5f602084013e6122f3565b606091505b50505050505050505050505050565b5f61230d8284612724565b9392505050565b5f61230d828461273b565b5f61230d828461282b565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061235d5761235d61283e565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156123b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d8919061276d565b816001815181106123eb576123eb61283e565b6001600160a01b039283166020918202929092010152600754612411913091168461152c565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac947906124499085905f90869030904290600401612852565b5f604051808303815f87803b158015612460575f80fd5b505af1158015612472573d5f803e3d5ffd5b505050505050565b6007546124929030906001600160a01b03168461152c565b60075460095460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156124ff573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061252491906128c1565b5050505050565b5f6020808352835180828501525f5b818110156125565785810183015185820160400152820161253a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610c26575f80fd5b5f806040838503121561259b575f80fd5b82356125a681612576565b946020939093013593505050565b5f602082840312156125c4575f80fd5b813561230d81612576565b5f602082840312156125df575f80fd5b5035919050565b5f805f606084860312156125f8575f80fd5b833561260381612576565b9250602084013561261381612576565b929592945050506040919091013590565b8015158114610c26575f80fd5b5f8060408385031215612642575f80fd5b823561264d81612576565b9150602083013561265d81612624565b809150509250929050565b5f805f6060848603121561267a575f80fd5b505081359360208301359350604090920135919050565b5f602082840312156126a1575f80fd5b813561230d81612624565b5f80604083850312156126bd575f80fd5b82356126c881612576565b9150602083013561265d81612576565b600181811c908216806126ec57607f821691505b60208210810361270a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610a8757610a87612710565b5f8261275557634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610a8757610a87612710565b5f6020828403121561277d575f80fd5b815161230d81612576565b5f60208284031215612798575f80fd5b815161230d81612624565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610a8757610a87612710565b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156128a05784516001600160a01b03168352938301939183019160010161287b565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156128d3575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220c08d744bb55754ecb1ee4169ad0f6d0ef1e759e55c12a6bcdc290b1e8b30059464736f6c63430008140033

Deployed Bytecode Sourcemap

40165:17037:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29100:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31460:201;;;;;;;;;;-1:-1:-1;31460:201:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;31460:201:0;1023:187:1;41481:63:0;;;;;;;;;;-1:-1:-1;41481:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40257:41;;;;;;;;;;-1:-1:-1;40257:41:0;;;;-1:-1:-1;;;;;40257:41:0;;;;;;-1:-1:-1;;;;;1657:32:1;;;1639:51;;1627:2;1612:18;40257:41:0;1467:229:1;30229:108:0;;;;;;;;;;-1:-1:-1;30317:12:0;;30229:108;;;1847:25:1;;;1835:2;1820:18;30229:108:0;1701:177:1;48991:157:0;;;;;;;;;;-1:-1:-1;48991:157:0;;;;;:::i;:::-;;:::i;:::-;;41293:33;;;;;;;;;;;;;;;;41253;;;;;;;;;;;;;;;;46305:275;;;;;;;;;;-1:-1:-1;46305:275:0;;;;;:::i;:::-;;:::i;32241:261::-;;;;;;;;;;-1:-1:-1;32241:261:0;;;;;:::i;:::-;;:::i;40340:53::-;;;;;;;;;;;;40386:6;40340:53;;30071:93;;;;;;;;;;-1:-1:-1;30071:93:0;;30154:2;2879:36:1;;2867:2;2852:18;30071:93:0;2737:184:1;32911:238:0;;;;;;;;;;-1:-1:-1;32911:238:0;;;;;:::i;:::-;;:::i;40305:28::-;;;;;;;;;;-1:-1:-1;40305:28:0;;;;-1:-1:-1;;;;;40305:28:0;;;40621:33;;;;;;;;;;-1:-1:-1;40621:33:0;;;;;;;;49156:126;;;;;;;;;;-1:-1:-1;49156:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;49246:28:0;49222:4;49246:28;;;:19;:28;;;;;;;;;49156:126;56905:105;;;;;;;;;;;;;:::i;41108:28::-;;;;;;;;;;;;;;;;40701:31;;;;;;;;;;-1:-1:-1;40701:31:0;;;;;;;;;;;30400:127;;;;;;;;;;-1:-1:-1;30400:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;30501:18:0;30474:7;30501:18;;;;;;;;;;;;30400:127;22521:103;;;;;;;;;;;;;:::i;45413:121::-;;;;;;;;;;;;;:::i;46852:167::-;;;;;;;;;;-1:-1:-1;46852:167:0;;;;;:::i;:::-;;:::i;40432:30::-;;;;;;;;;;-1:-1:-1;40432:30:0;;;;-1:-1:-1;;;;;40432:30:0;;;41001;;;;;;;;;;;;;;;;47223:403;;;;;;;;;;-1:-1:-1;47223:403:0;;;;;:::i;:::-;;:::i;45249:112::-;;;;;;;;;;;;;:::i;21880:87::-;;;;;;;;;;-1:-1:-1;21953:6:0;;-1:-1:-1;;;;;21953:6:0;21880:87;;40469:24;;;;;;;;;;-1:-1:-1;40469:24:0;;;;-1:-1:-1;;;;;40469:24:0;;;41143:31;;;;;;;;;;;;;;;;47115:100;;;;;;;;;;-1:-1:-1;47115:100:0;;;;;:::i;:::-;;:::i;29319:104::-;;;;;;;;;;;;;:::i;48244:304::-;;;;;;;;;;-1:-1:-1;48244:304:0;;;;;:::i;:::-;;:::i;41075:24::-;;;;;;;;;;;;;;;;41333:27;;;;;;;;;;;;;;;;41219:25;;;;;;;;;;;;;;;;33652:436;;;;;;;;;;-1:-1:-1;33652:436:0;;;;;:::i;:::-;;:::i;30733:193::-;;;;;;;;;;-1:-1:-1;30733:193:0;;;;;:::i;:::-;;:::i;48752:231::-;;;;;;;;;;-1:-1:-1;48752:231:0;;;;;:::i;:::-;;:::i;41706:57::-;;;;;;;;;;-1:-1:-1;41706:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;40661:33;;;;;;;;;;-1:-1:-1;40661:33:0;;;;;;;;;;;48054:182;;;;;;;;;;-1:-1:-1;48054:182:0;;;;;:::i;:::-;;:::i;44670:525::-;;;;;;;;;;-1:-1:-1;44670:525:0;;;;;:::i;:::-;;:::i;47634:412::-;;;;;;;;;;-1:-1:-1;47634:412:0;;;;;:::i;:::-;;:::i;46588:256::-;;;;;;;;;;-1:-1:-1;46588:256:0;;;;;:::i;:::-;;:::i;40919:39::-;;;;;;;;;;-1:-1:-1;40919:39:0;;;;;;;;40506:35;;;;;;;;;;;;;;;;57018:181;;;;;;;;;;;;;:::i;45800:497::-;;;;;;;;;;-1:-1:-1;45800:497:0;;;;;:::i;:::-;;:::i;40967:27::-;;;;;;;;;;;;;;;;30989:151;;;;;;;;;;-1:-1:-1;30989:151:0;;;;;:::i;:::-;;:::i;40548:33::-;;;;;;;;;;;;;;;;45595:135;;;;;;;;;;;;;:::i;41038:30::-;;;;;;;;;;;;;;;;22779:201;;;;;;;;;;-1:-1:-1;22779:201:0;;;;;:::i;:::-;;:::i;41181:31::-;;;;;;;;;;;;;;;;40588:24;;;;;;;;;;;;;;;;29100:100;29154:13;29187:5;29180:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29100:100;:::o;31460:201::-;31543:4;20511:10;31599:32;20511:10;31615:7;31624:6;31599:8;:32::i;:::-;31649:4;31642:11;;;31460:201;;;;;:::o;48991:157::-;21766:13;:11;:13::i;:::-;49098:9:::1;::::0;49070:38:::1;::::0;-1:-1:-1;;;;;49098:9:0;;::::1;::::0;49070:38;::::1;::::0;::::1;::::0;49098:9:::1;::::0;49070:38:::1;49119:9;:21:::0;;-1:-1:-1;;;;;;49119:21:0::1;-1:-1:-1::0;;;;;49119:21:0;;;::::1;::::0;;;::::1;::::0;;48991:157::o;46305:275::-;21766:13;:11;:13::i;:::-;46442:4:::1;46434;46413:13;30317:12:::0;;;30229:108;46413:13:::1;:17;::::0;46429:1:::1;46413:17;:::i;:::-;46412:26;;;;:::i;:::-;46411:35;;;;:::i;:::-;46401:6;:45;;46379:142;;;::::0;-1:-1:-1;;;46379:142:0;;5510:2:1;46379:142:0::1;::::0;::::1;5492:21:1::0;5549:2;5529:18;;;5522:30;5588:34;5568:18;;;5561:62;-1:-1:-1;;;5639:18:1;;;5632:45;5694:19;;46379:142:0::1;;;;;;;;;46555:17;:6:::0;46565::::1;46555:17;:::i;:::-;46532:20;:40:::0;-1:-1:-1;46305:275:0:o;32241:261::-;32338:4;20511:10;32396:38;32412:4;20511:10;32427:6;32396:15;:38::i;:::-;32445:27;32455:4;32461:2;32465:6;32445:9;:27::i;:::-;-1:-1:-1;32490:4:0;;32241:261;-1:-1:-1;;;;32241:261:0:o;32911:238::-;32999:4;20511:10;33055:64;20511:10;33071:7;33108:10;33080:25;20511:10;33071:7;33080:9;:25::i;:::-;:38;;;;:::i;:::-;33055:8;:64::i;56905:105::-;21766:13;:11;:13::i;:::-;56951:51:::1;::::0;56959:10:::1;::::0;56980:21:::1;56951:51:::0;::::1;;;::::0;::::1;::::0;;;56980:21;56959:10;56951:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56905:105::o:0;22521:103::-;21766:13;:11;:13::i;:::-;22586:30:::1;22613:1;22586:18;:30::i;:::-;22521:103::o:0;45413:121::-;45465:4;21766:13;:11;:13::i;:::-;-1:-1:-1;45482:14:0::1;:22:::0;;-1:-1:-1;;45482:22:0::1;::::0;;;45413:121;:::o;46852:167::-;21766:13;:11;:13::i;:::-;-1:-1:-1;;;;;46965:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;46965:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46852:167::o;47223:403::-;21766:13;:11;:13::i;:::-;47373:15:::1;:31:::0;;;47415:15:::1;:31:::0;;;47457:9:::1;:19:::0;;;47469:7;47502:33:::1;47433:13:::0;47391;47502:33:::1;:::i;:::-;:45;;;;:::i;:::-;47487:12;:60:::0;;;47582:2:::1;-1:-1:-1::0;47566:18:0::1;47558:60;;;::::0;-1:-1:-1;;;47558:60:0;;6056:2:1;47558:60:0::1;::::0;::::1;6038:21:1::0;6095:2;6075:18;;;6068:30;6134:31;6114:18;;;6107:59;6183:18;;47558:60:0::1;5854:353:1::0;47558:60:0::1;47223:403:::0;;;:::o;45249:112::-;21766:13;:11;:13::i;:::-;45304::::1;:20:::0;;-1:-1:-1;;45335:18:0;;;;;45249:112::o;47115:100::-;21766:13;:11;:13::i;:::-;47186:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;47186:21:0;;::::1;::::0;;;::::1;::::0;;47115:100::o;29319:104::-;29375:13;29408:7;29401:14;;;;;:::i;48244:304::-;21766:13;:11;:13::i;:::-;48388::::1;::::0;-1:-1:-1;;;;;48388:13:0;;::::1;48380:21:::0;;::::1;::::0;48358:128:::1;;;::::0;-1:-1:-1;;;48358:128:0;;6414:2:1;48358:128:0::1;::::0;::::1;6396:21:1::0;6453:2;6433:18;;;6426:30;6492:34;6472:18;;;6465:62;6563:27;6543:18;;;6536:55;6608:19;;48358:128:0::1;6212:421:1::0;48358:128:0::1;48499:41;48528:4;48534:5;48499:28;:41::i;:::-;48244:304:::0;;:::o;33652:436::-;33745:4;20511:10;33745:4;33828:25;20511:10;33845:7;33828:9;:25::i;:::-;33801:52;;33892:15;33872:16;:35;;33864:85;;;;-1:-1:-1;;;33864:85:0;;6840:2:1;33864:85:0;;;6822:21:1;6879:2;6859:18;;;6852:30;6918:34;6898:18;;;6891:62;-1:-1:-1;;;6969:18:1;;;6962:35;7014:19;;33864:85:0;6638:401:1;33864:85:0;33985:60;33994:5;34001:7;34029:15;34010:16;:34;33985:8;:60::i;30733:193::-;30812:4;20511:10;30868:28;20511:10;30885:2;30889:6;30868:9;:28::i;48752:231::-;21766:13;:11;:13::i;:::-;48912:15:::1;::::0;48869:59:::1;::::0;-1:-1:-1;;;;;48912:15:0;;::::1;::::0;48869:59;::::1;::::0;::::1;::::0;48912:15:::1;::::0;48869:59:::1;48939:15;:36:::0;;-1:-1:-1;;;;;;48939:36:0::1;-1:-1:-1::0;;;;;48939:36:0;;;::::1;::::0;;;::::1;::::0;;48752:231::o;48054:182::-;21766:13;:11;:13::i;:::-;-1:-1:-1;;;;;48139:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;48139:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48194:34;;1163:41:1;;;48194:34:0::1;::::0;1136:18:1;48194:34:0::1;;;;;;;48054:182:::0;;:::o;44670:525::-;21766:13;:11;:13::i;:::-;44790:6;44810:58:::1;44790:6:::0;44863:4:::1;44810:25;:58::i;:::-;44879:15;:34:::0;;-1:-1:-1;;;;;;44879:34:0::1;-1:-1:-1::0;;;;;44879:34:0;::::1;::::0;;::::1;::::0;;;44960:26:::1;::::0;;-1:-1:-1;;;44960:26:0;;;;:24:::1;::::0;:26:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;44879:34;44960:26:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;44942:70:0::1;;45021:4;45028:16;-1:-1:-1::0;;;;;45028:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44942:110;::::0;-1:-1:-1;;;;;;44942:110:0::1;::::0;;;;;;-1:-1:-1;;;;;7530:15:1;;;44942:110:0::1;::::0;::::1;7512:34:1::0;7582:15;;7562:18;;;7555:43;7447:18;;44942:110:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44926:13;:126:::0;;-1:-1:-1;;;;;;44926:126:0::1;-1:-1:-1::0;;;;;44926:126:0;;;::::1;::::0;;::::1;::::0;;45063:55:::1;::::0;-1:-1:-1;45063:25:0::1;:55::i;:::-;45166:13;::::0;45129:58:::1;::::0;-1:-1:-1;;;;;45166:13:0::1;::::0;45129:28:::1;:58::i;47634:412::-:0;21766:13;:11;:13::i;:::-;47785:16:::1;:32:::0;;;47828:16:::1;:32:::0;;;47871:10:::1;:20:::0;;;47884:7;47918:35:::1;47847:13:::0;47804;47918:35:::1;:::i;:::-;:48;;;;:::i;:::-;47902:13;:64:::0;;;48002:2:::1;-1:-1:-1::0;47985:19:0::1;47977:61;;;::::0;-1:-1:-1;;;47977:61:0;;7811:2:1;47977:61:0::1;::::0;::::1;7793:21:1::0;7850:2;7830:18;;;7823:30;7889:31;7869:18;;;7862:59;7938:18;;47977:61:0::1;7609:353:1::0;46588:256:0;21766:13;:11;:13::i;:::-;46728:4:::1;46720;46699:13;30317:12:::0;;;30229:108;46699:13:::1;:17;::::0;46715:1:::1;46699:17;:::i;:::-;46698:26;;;;:::i;:::-;46697:35;;;;:::i;:::-;46687:6;:45;;46665:131;;;::::0;-1:-1:-1;;;46665:131:0;;8169:2:1;46665:131:0::1;::::0;::::1;8151:21:1::0;8208:2;8188:18;;;8181:30;8247:34;8227:18;;;8220:62;-1:-1:-1;;;8298:18:1;;;8291:34;8342:19;;46665:131:0::1;7967:400:1::0;46665:131:0::1;46819:17;:6:::0;46829::::1;46819:17;:::i;:::-;46807:9;:29:::0;-1:-1:-1;46588:256:0:o;57018:181::-;21766:13;:11;:13::i;:::-;57071:4:::1;:12;:4:::0;57099:13:::1;30317:12:::0;;;30229:108;57099:13:::1;57071:42;::::0;-1:-1:-1;;;;;;57071:42:0::1;::::0;;;;;;-1:-1:-1;;;;;8564:32:1;;;57071:42:0::1;::::0;::::1;8546:51:1::0;8613:18;;;8606:34;8519:18;;57071:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;57124:4:0::1;:17;:4:::0;57157:7:::1;21953:6:::0;;-1:-1:-1;;;;;21953:6:0;;21880:87;57157:7:::1;57184:4;30474:7:::0;30501:18;;;;;;;;;;;57124:67:::1;::::0;-1:-1:-1;;;;;;57124:67:0::1;::::0;;;;;;-1:-1:-1;;;;;9159:15:1;;;57124:67:0::1;::::0;::::1;9141:34:1::0;9211:15;;;;9191:18;;;9184:43;9243:18;;;9236:34;9076:18;;57124:67:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;45800:497::-:0;45908:4;21766:13;:11;:13::i;:::-;45987:6:::1;45966:13;30317:12:::0;;;30229:108;45966:13:::1;:17;::::0;45982:1:::1;45966:17;:::i;:::-;45965:28;;;;:::i;:::-;45952:9;:41;;45930:144;;;::::0;-1:-1:-1;;;45930:144:0;;9483:2:1;45930:144:0::1;::::0;::::1;9465:21:1::0;9522:2;9502:18;;;9495:30;9561:34;9541:18;;;9534:62;-1:-1:-1;;;9612:18:1;;;9605:51;9673:19;;45930:144:0::1;9281:417:1::0;45930:144:0::1;46142:4;46121:13;30317:12:::0;;;30229:108;46121:13:::1;:17;::::0;46137:1:::1;46121:17;:::i;:::-;46120:26;;;;:::i;:::-;46107:9;:39;;46085:141;;;::::0;-1:-1:-1;;;46085:141:0;;9905:2:1;46085:141:0::1;::::0;::::1;9887:21:1::0;9944:2;9924:18;;;9917:30;9983:34;9963:18;;;9956:62;-1:-1:-1;;;10034:18:1;;;10027:50;10094:19;;46085:141:0::1;9703:416:1::0;46085:141:0::1;-1:-1:-1::0;46237:18:0::1;:30:::0;46285:4:::1;::::0;45800:497::o;30989:151::-;-1:-1:-1;;;;;31105:18:0;;;31078:7;31105:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30989:151::o;45595:135::-;45655:4;21766:13;:11;:13::i;:::-;-1:-1:-1;45672:20:0::1;:28:::0;;-1:-1:-1;;45672:28:0::1;::::0;;;45595:135;:::o;22779:201::-;21766:13;:11;:13::i;:::-;-1:-1:-1;;;;;22868:22:0;::::1;22860:73;;;::::0;-1:-1:-1;;;22860:73:0;;10326:2:1;22860:73:0::1;::::0;::::1;10308:21:1::0;10365:2;10345:18;;;10338:30;10404:34;10384:18;;;10377:62;-1:-1:-1;;;10455:18:1;;;10448:36;10501:19;;22860:73:0::1;10124:402:1::0;22860:73:0::1;22944:28;22963:8;22944:18;:28::i;37645:346::-:0;-1:-1:-1;;;;;37747:19:0;;37739:68;;;;-1:-1:-1;;;37739:68:0;;10733:2:1;37739:68:0;;;10715:21:1;10772:2;10752:18;;;10745:30;10811:34;10791:18;;;10784:62;-1:-1:-1;;;10862:18:1;;;10855:34;10906:19;;37739:68:0;10531:400:1;37739:68:0;-1:-1:-1;;;;;37826:21:0;;37818:68;;;;-1:-1:-1;;;37818:68:0;;11138:2:1;37818:68:0;;;11120:21:1;11177:2;11157:18;;;11150:30;11216:34;11196:18;;;11189:62;-1:-1:-1;;;11267:18:1;;;11260:32;11309:19;;37818:68:0;10936:398:1;37818:68:0;-1:-1:-1;;;;;37899:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37951:32;;1847:25:1;;;37951:32:0;;1820:18:1;37951:32:0;;;;;;;37645:346;;;:::o;22045:132::-;21953:6;;-1:-1:-1;;;;;21953:6:0;20511:10;22109:23;22101:68;;;;-1:-1:-1;;;22101:68:0;;11541:2:1;22101:68:0;;;11523:21:1;;;11560:18;;;11553:30;11619:34;11599:18;;;11592:62;11671:18;;22101:68:0;11339:356:1;38282:419:0;38383:24;38410:25;38420:5;38427:7;38410:9;:25::i;:::-;38383:52;;-1:-1:-1;;38450:16:0;:37;38446:248;;38532:6;38512:16;:26;;38504:68;;;;-1:-1:-1;;;38504:68:0;;11902:2:1;38504:68:0;;;11884:21:1;11941:2;11921:18;;;11914:30;11980:31;11960:18;;;11953:59;12029:18;;38504:68:0;11700:353:1;38504:68:0;38616:51;38625:5;38632:7;38660:6;38641:16;:25;38616:8;:51::i;:::-;38372:329;38282:419;;;:::o;49290:4717::-;-1:-1:-1;;;;;49422:18:0;;49414:68;;;;-1:-1:-1;;;49414:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49501:16:0;;49493:64;;;;-1:-1:-1;;;49493:64:0;;;;;;;:::i;:::-;49574:6;49584:1;49574:11;49570:93;;49602:28;49618:4;49624:2;49628:1;49602:15;:28::i;49570:93::-;49679:14;;;;49675:2487;;;21953:6;;-1:-1:-1;;;;;49732:15:0;;;21953:6;;49732:15;;;;:49;;-1:-1:-1;21953:6:0;;-1:-1:-1;;;;;49768:13:0;;;21953:6;;49768:13;;49732:49;:86;;;;-1:-1:-1;;;;;;49802:16:0;;;;49732:86;:128;;;;-1:-1:-1;;;;;;49839:21:0;;49853:6;49839:21;;49732:128;:158;;;;-1:-1:-1;49882:8:0;;-1:-1:-1;;;49882:8:0;;;;49881:9;49732:158;49710:2441;;;49930:13;;;;;;;49925:223;;-1:-1:-1;;;;;50002:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;50031:23:0;;;;;;:19;:23;;;;;;;;50002:52;49968:160;;;;-1:-1:-1;;;49968:160:0;;13070:2:1;49968:160:0;;;13052:21:1;13109:2;13089:18;;;13082:30;-1:-1:-1;;;13128:18:1;;;13121:52;13190:18;;49968:160:0;12868:346:1;49968:160:0;50304:20;;;;50300:641;;;21953:6;;-1:-1:-1;;;;;50379:13:0;;;21953:6;;50379:13;;;;:72;;-1:-1:-1;50435:15:0;;-1:-1:-1;;;;;50421:30:0;;;50435:15;;50421:30;;50379:72;:129;;;;-1:-1:-1;50494:13:0;;-1:-1:-1;;;;;50480:28:0;;;50494:13;;50480:28;;50379:129;50349:573;;;50626:9;50597:39;;;;:28;:39;;;;;;50672:12;-1:-1:-1;50559:258:0;;;;-1:-1:-1;;;50559:258:0;;13421:2:1;50559:258:0;;;13403:21:1;13460:2;13440:18;;;13433:30;13499:34;13479:18;;;13472:62;13570:34;13550:18;;;13543:62;-1:-1:-1;;;13621:19:1;;;13614:40;13671:19;;50559:258:0;13219:477:1;50559:258:0;50873:9;50844:39;;;;:28;:39;;;;;50886:12;50844:54;;50349:573;-1:-1:-1;;;;;51015:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;51072:35:0;;;;;;:31;:35;;;;;;;;51071:36;51015:92;50989:1147;;;51194:20;;51184:6;:30;;51150:169;;;;-1:-1:-1;;;51150:169:0;;13903:2:1;51150:169:0;;;13885:21:1;13942:2;13922:18;;;13915:30;13981:34;13961:18;;;13954:62;-1:-1:-1;;;14032:18:1;;;14025:51;14093:19;;51150:169:0;13701:417:1;51150:169:0;51402:9;;-1:-1:-1;;;;;30501:18:0;;30474:7;30501:18;;;;;;;;;;;51376:22;;:6;:22;:::i;:::-;:35;;51342:140;;;;-1:-1:-1;;;51342:140:0;;14325:2:1;51342:140:0;;;14307:21:1;14364:2;14344:18;;;14337:30;-1:-1:-1;;;14383:18:1;;;14376:49;14442:18;;51342:140:0;14123:343:1;51342:140:0;50989:1147;;;-1:-1:-1;;;;;51580:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;51635:37:0;;;;;;:31;:37;;;;;;;;51634:38;51580:92;51554:582;;;51759:20;;51749:6;:30;;51715:170;;;;-1:-1:-1;;;51715:170:0;;14673:2:1;51715:170:0;;;14655:21:1;14712:2;14692:18;;;14685:30;14751:34;14731:18;;;14724:62;-1:-1:-1;;;14802:18:1;;;14795:52;14864:19;;51715:170:0;14471:418:1;51554:582:0;-1:-1:-1;;;;;51916:35:0;;;;;;:31;:35;;;;;;;;51911:225;;52036:9;;-1:-1:-1;;;;;30501:18:0;;30474:7;30501:18;;;;;;;;;;;52010:22;;:6;:22;:::i;:::-;:35;;51976:140;;;;-1:-1:-1;;;51976:140:0;;14325:2:1;51976:140:0;;;14307:21:1;14364:2;14344:18;;;14337:30;-1:-1:-1;;;14383:18:1;;;14376:49;14442:18;;51976:140:0;14123:343:1;51976:140:0;52223:4;52174:28;30501:18;;;;;;;;;;;52281;;52257:42;;;;;;;52330:35;;-1:-1:-1;52354:11:0;;;;;;;52330:35;:61;;;;-1:-1:-1;52383:8:0;;-1:-1:-1;;;52383:8:0;;;;52382:9;52330:61;:110;;;;-1:-1:-1;;;;;;52409:31:0;;;;;;:25;:31;;;;;;;;52408:32;52330:110;:153;;;;-1:-1:-1;;;;;;52458:25:0;;;;;;:19;:25;;;;;;;;52457:26;52330:153;:194;;;;-1:-1:-1;;;;;;52501:23:0;;;;;;:19;:23;;;;;;;;52500:24;52330:194;52312:326;;;52551:8;:15;;-1:-1:-1;;;;52551:15:0;-1:-1:-1;;;52551:15:0;;;52583:10;:8;:10::i;:::-;52610:8;:16;;-1:-1:-1;;;;52610:16:0;;;52312:326;52666:8;;-1:-1:-1;;;;;52776:25:0;;52650:12;52776:25;;;:19;:25;;;;;;52666:8;-1:-1:-1;;;52666:8:0;;;;;52665:9;;52776:25;;:52;;-1:-1:-1;;;;;;52805:23:0;;;;;;:19;:23;;;;;;;;52776:52;52772:100;;;-1:-1:-1;52855:5:0;52772:100;52884:12;52989:7;52985:969;;;-1:-1:-1;;;;;53041:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;53090:1;53074:13;;:17;53041:50;53037:768;;;53119:34;53149:3;53119:25;53130:13;;53119:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;53112:41;;53222:13;;53202:16;;53195:4;:23;;;;:::i;:::-;53194:41;;;;:::i;:::-;53172:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;53292:13:0;;53278:10;;53271:17;;:4;:17;:::i;:::-;53270:35;;;;:::i;:::-;53254:12;;:51;;;;;;;:::i;:::-;;;;-1:-1:-1;;53374:13:0;;53354:16;;53347:23;;:4;:23;:::i;:::-;53346:41;;;;:::i;:::-;53324:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;53037:768:0;;-1:-1:-1;53037:768:0;;-1:-1:-1;;;;;53449:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;53499:1;53484:12;;:16;53449:51;53445:360;;;53528:33;53557:3;53528:24;53539:12;;53528:6;:10;;:24;;;;:::i;:33::-;53521:40;;53629:12;;53610:15;;53603:4;:22;;;;:::i;:::-;53602:39;;;;:::i;:::-;53580:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53697:12:0;;53684:9;;53677:16;;:4;:16;:::i;:::-;53676:33;;;;:::i;:::-;53660:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;53777:12:0;;53758:15;;53751:22;;:4;:22;:::i;:::-;53750:39;;;;:::i;:::-;53728:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;53445:360:0;53825:8;;53821:91;;53854:42;53870:4;53884;53891;53854:15;:42::i;:::-;53928:14;53938:4;53928:14;;:::i;:::-;;;52985:969;53966:33;53982:4;53988:2;53992:6;53966:15;:33::i;:::-;49403:4604;;;;49290:4717;;;:::o;23140:191::-;23233:6;;;-1:-1:-1;;;;;23250:17:0;;;-1:-1:-1;;;;;;23250:17:0;;;;;;;23283:40;;23233:6;;;23250:17;23233:6;;23283:40;;23214:16;;23283:40;23203:128;23140:191;:::o;48556:188::-;-1:-1:-1;;;;;48639:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;48639:39:0;;;;;;;;;;48696:40;;48639:39;;:31;48696:40;;;48556:188;;:::o;34558:806::-;-1:-1:-1;;;;;34655:18:0;;34647:68;;;;-1:-1:-1;;;34647:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34734:16:0;;34726:64;;;;-1:-1:-1;;;34726:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34876:15:0;;34854:19;34876:15;;;;;;;;;;;34910:21;;;;34902:72;;;;-1:-1:-1;;;34902:72:0;;15229:2:1;34902:72:0;;;15211:21:1;15268:2;15248:18;;;15241:30;15307:34;15287:18;;;15280:62;-1:-1:-1;;;15358:18:1;;;15351:36;15404:19;;34902:72:0;15027:402:1;34902:72:0;-1:-1:-1;;;;;35010:15:0;;;:9;:15;;;;;;;;;;;35028:20;;;35010:38;;35228:13;;;;;;;;;;:23;;;;;;35280:26;;1847:25:1;;;35228:13:0;;35280:26;;1820:18:1;35280:26:0;;;;;;;35319:37;47223:403;55141:1756;55224:4;55180:23;30501:18;;;;;;;;;;;55180:50;;55241:25;55337:12;;55303:18;;55269;;:52;;;;:::i;:::-;:80;;;;:::i;:::-;55241:108;-1:-1:-1;55360:12:0;55389:20;;;:46;;-1:-1:-1;55413:22:0;;55389:46;55385:85;;;55452:7;;;55141:1756::o;55385:85::-;55504:18;;:23;;55525:2;55504:23;:::i;:::-;55486:15;:41;55482:115;;;55562:18;;:23;;55583:2;55562:23;:::i;:::-;55544:41;;55482:115;55658:23;55771:1;55738:17;55703:18;;55685:15;:36;;;;:::i;:::-;55684:71;;;;:::i;:::-;:88;;;;:::i;:::-;55658:114;-1:-1:-1;55783:26:0;55812:36;:15;55658:114;55812:19;:36::i;:::-;55783:65;-1:-1:-1;55889:21:0;55923:36;55783:65;55923:16;:36::i;:::-;55972:18;55993:44;:21;56019:17;55993:25;:44::i;:::-;55972:65;;56050:23;56076:81;56129:17;56076:34;56091:18;;56076:10;:14;;:34;;;;:::i;:81::-;56050:107;;56168:17;56188:51;56221:17;56188:28;56203:12;;56188:10;:14;;:28;;;;:::i;:51::-;56168:71;-1:-1:-1;56252:23:0;56168:71;56278:28;56291:15;56278:10;:28;:::i;:::-;:40;;;;:::i;:::-;56352:1;56331:18;:22;;;56364:18;:22;;;56397:12;:16;;;56448:9;;56440:45;;56252:66;;-1:-1:-1;;;;;;56448:9:0;;56471;;56440:45;56352:1;56440:45;56471:9;56448;56440:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56426:59:0;;-1:-1:-1;;56502:19:0;;;;;:42;;;56543:1;56525:15;:19;56502:42;56498:278;;;56561:46;56574:15;56591;56561:12;:46::i;:::-;56731:18;;56627:137;;;15846:25:1;;;15902:2;15887:18;;15880:34;;;15930:18;;;15923:34;;;;56627:137:0;;;;;;15834:2:1;56627:137:0;;;56498:278;56810:15;;56802:87;;-1:-1:-1;;;;;56810:15:0;;;;56853:21;;56802:87;;;;56853:21;56810:15;56802:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;55141:1756:0:o;13187:98::-;13245:7;13272:5;13276:1;13272;:5;:::i;:::-;13265:12;13187:98;-1:-1:-1;;;13187:98:0:o;13586:::-;13644:7;13671:5;13675:1;13671;:5;:::i;12830:98::-;12888:7;12915:5;12919:1;12915;:5;:::i;54015:589::-;54165:16;;;54179:1;54165:16;;;;;;;;54141:21;;54165:16;;;;;;;;;;-1:-1:-1;54165:16:0;54141:40;;54210:4;54192;54197:1;54192:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54192:23:0;;;:7;;;;;;;;;;:23;;;;54236:15;;:22;;;-1:-1:-1;;;54236:22:0;;;;:15;;;;;:20;;:22;;;;;54192:7;;54236:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54226:4;54231:1;54226:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54226:32:0;;;:7;;;;;;;;;:32;54303:15;;54271:62;;54288:4;;54303:15;54321:11;54271:8;:62::i;:::-;54372:15;;:224;;-1:-1:-1;;;54372:224:0;;-1:-1:-1;;;;;54372:15:0;;;;:66;;:224;;54453:11;;54372:15;;54523:4;;54550;;54570:15;;54372:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54070:534;54015:589;:::o;54612:521::-;54792:15;;54760:62;;54777:4;;-1:-1:-1;;;;;54792:15:0;54810:11;54760:8;:62::i;:::-;54865:15;;55069;;54865:260;;-1:-1:-1;;;54865:260:0;;54937:4;54865:260;;;17558:34:1;17608:18;;;17601:34;;;54865:15:0;17651:18:1;;;17644:34;;;17694:18;;;17687:34;-1:-1:-1;;;;;55069:15:0;;;17737:19:1;;;17730:44;55099:15:0;17790:19:1;;;17783:35;54865:15:0;;;:31;;54904:9;;17492:19:1;;54865:260:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;54612:521;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1883:180::-;1942:6;1995:2;1983:9;1974:7;1970:23;1966:32;1963:52;;;2011:1;2008;2001:12;1963:52;-1:-1:-1;2034:23:1;;1883:180;-1:-1:-1;1883:180:1:o;2068:456::-;2145:6;2153;2161;2214:2;2202:9;2193:7;2189:23;2185:32;2182:52;;;2230:1;2227;2220:12;2182:52;2269:9;2256:23;2288:31;2313:5;2288:31;:::i;:::-;2338:5;-1:-1:-1;2395:2:1;2380:18;;2367:32;2408:33;2367:32;2408:33;:::i;:::-;2068:456;;2460:7;;-1:-1:-1;;;2514:2:1;2499:18;;;;2486:32;;2068:456::o;2926:118::-;3012:5;3005:13;2998:21;2991:5;2988:32;2978:60;;3034:1;3031;3024:12;3049:382;3114:6;3122;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3230:9;3217:23;3249:31;3274:5;3249:31;:::i;:::-;3299:5;-1:-1:-1;3356:2:1;3341:18;;3328:32;3369:30;3328:32;3369:30;:::i;:::-;3418:7;3408:17;;;3049:382;;;;;:::o;3436:316::-;3513:6;3521;3529;3582:2;3570:9;3561:7;3557:23;3553:32;3550:52;;;3598:1;3595;3588:12;3550:52;-1:-1:-1;;3621:23:1;;;3691:2;3676:18;;3663:32;;-1:-1:-1;3742:2:1;3727:18;;;3714:32;;3436:316;-1:-1:-1;3436:316:1:o;3757:241::-;3813:6;3866:2;3854:9;3845:7;3841:23;3837:32;3834:52;;;3882:1;3879;3872:12;3834:52;3921:9;3908:23;3940:28;3962:5;3940:28;:::i;4003:388::-;4071:6;4079;4132:2;4120:9;4111:7;4107:23;4103:32;4100:52;;;4148:1;4145;4138:12;4100:52;4187:9;4174:23;4206:31;4231:5;4206:31;:::i;:::-;4256:5;-1:-1:-1;4313:2:1;4298:18;;4285:32;4326:33;4285:32;4326:33;:::i;4396:380::-;4475:1;4471:12;;;;4518;;;4539:61;;4593:4;4585:6;4581:17;4571:27;;4539:61;4646:2;4638:6;4635:14;4615:18;4612:38;4609:161;;4692:10;4687:3;4683:20;4680:1;4673:31;4727:4;4724:1;4717:15;4755:4;4752:1;4745:15;4609:161;;4396:380;;;:::o;4781:127::-;4842:10;4837:3;4833:20;4830:1;4823:31;4873:4;4870:1;4863:15;4897:4;4894:1;4887:15;4913:168;4986:9;;;5017;;5034:15;;;5028:22;;5014:37;5004:71;;5055:18;;:::i;5086:217::-;5126:1;5152;5142:132;;5196:10;5191:3;5187:20;5184:1;5177:31;5231:4;5228:1;5221:15;5259:4;5256:1;5249:15;5142:132;-1:-1:-1;5288:9:1;;5086:217::o;5724:125::-;5789:9;;;5810:10;;;5807:36;;;5823:18;;:::i;7044:251::-;7114:6;7167:2;7155:9;7146:7;7142:23;7138:32;7135:52;;;7183:1;7180;7173:12;7135:52;7215:9;7209:16;7234:31;7259:5;7234:31;:::i;8651:245::-;8718:6;8771:2;8759:9;8750:7;8746:23;8742:32;8739:52;;;8787:1;8784;8777:12;8739:52;8819:9;8813:16;8838:28;8860:5;8838:28;:::i;12058:401::-;12260:2;12242:21;;;12299:2;12279:18;;;12272:30;12338:34;12333:2;12318:18;;12311:62;-1:-1:-1;;;12404:2:1;12389:18;;12382:35;12449:3;12434:19;;12058:401::o;12464:399::-;12666:2;12648:21;;;12705:2;12685:18;;;12678:30;12744:34;12739:2;12724:18;;12717:62;-1:-1:-1;;;12810:2:1;12795:18;;12788:33;12853:3;12838:19;;12464:399::o;14894:128::-;14961:9;;;14982:11;;;14979:37;;;14996:18;;:::i;16100:127::-;16161:10;16156:3;16152:20;16149:1;16142:31;16192:4;16189:1;16182:15;16216:4;16213:1;16206:15;16232:980;16494:4;16542:3;16531:9;16527:19;16573:6;16562:9;16555:25;16599:2;16637:6;16632:2;16621:9;16617:18;16610:34;16680:3;16675:2;16664:9;16660:18;16653:31;16704:6;16739;16733:13;16770:6;16762;16755:22;16808:3;16797:9;16793:19;16786:26;;16847:2;16839:6;16835:15;16821:29;;16868:1;16878:195;16892:6;16889:1;16886:13;16878:195;;;16957:13;;-1:-1:-1;;;;;16953:39:1;16941:52;;17048:15;;;;17013:12;;;;16989:1;16907:9;16878:195;;;-1:-1:-1;;;;;;;17129:32:1;;;;17124:2;17109:18;;17102:60;-1:-1:-1;;;17193:3:1;17178:19;17171:35;17090:3;16232:980;-1:-1:-1;;;16232:980:1:o;17829:306::-;17917:6;17925;17933;17986:2;17974:9;17965:7;17961:23;17957:32;17954:52;;;18002:1;17999;17992:12;17954:52;18031:9;18025:16;18015:26;;18081:2;18070:9;18066:18;18060:25;18050:35;;18125:2;18114:9;18110:18;18104:25;18094:35;;17829:306;;;;;:::o

Swarm Source

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