ETH Price: $3,331.80 (-1.85%)
Gas: 34 Gwei

Token

Ryoshi's Joker (5150🔥)
 

Overview

Max Total Supply

1,000,000 5150🔥

Holders

60

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
589.110358392 5150🔥

Value
$0.00
0xf5011c911d29796358ff57d6e99b6adbd8421a5d
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:
RyoshisJoker

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : 5150.sol
// https://t.me/StraitJackets

pragma solidity ^0.8.17;

// SPDX-License-Identifier: Apache-2.0

import "./SafeMath.sol";
import "./Address.sol";
import "./RewardsToken.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Router.sol";
import "./IUniswapV2Pair.sol";
import "./IRewardsTracker.sol";


contract RyoshisJoker is RewardsToken {
    using SafeMath for uint256;
    using Address for address;
    
    
    uint256 private constant REWARDS_TRACKER_IDENTIFIER = 99; 
    uint256 private constant TOTAL_SUPPLY = 1000000 * (10**9);

    uint256 public maxTxAmount = TOTAL_SUPPLY.mul(2).div(1000); 

    uint256 private platformFee = 100; 
    uint256 private _previousPlatformFee = platformFee;

    uint256 public devFee = 1400; 
    uint256 public sellDevFee = 1400; 
    uint256 private _previousDevFee = devFee;
    
    uint256 public rewardsFee = 0; 
    uint256 public sellRewardsFee = 0; 
    uint256 private _previousRewardsFee = rewardsFee;

    uint256 public launchSellFee = 0; 
    uint256 private _previousLaunchSellFee = launchSellFee;
    
    mapping(address => bool) public uniswapv2contracts;

    address payable private _platformWalletAddress =
        payable(0x3B4E4F7827857830243a4cef28DfB81A864b22Aa); 
    address payable private _devWalletAddress =
        payable(0x62bB06D9229f4F1f31669B472907ebae96CcbBA1); 

    uint256 public blacklistDeadline = 0;
    uint256 public launchSellFeeDeadline = 0;

    IRewardsTracker private _rewardsTracker;

   
    bool public useGenericTransfer = true;

   
    bool private preparedForLaunch = false;

    
    mapping(address => bool) public isBlacklisted;
    
    
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTx;
    
    
    IUniswapV2Router public uniswapV2Router;
    address public uniswapV2Pair;

    bool currentlySwapping; 
    bool public swapAndRedirectEthFeesEnabled = true;

    uint256 private minTokensBeforeSwap = 5000 * 10**9;

    
     
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndRedirectEthFeesUpdated(bool enabled);
    event OnSwapAndRedirectEthFees(
        uint256 tokensSwapped,
        uint256 ethToDevWallet
    );
    event MaxTxAmountUpdated(uint256 maxTxAmount);
    event GenericTransferChanged(bool useGenericTransfer);
    event ExcludeFromFees(address wallet);
    event IncludeInFees(address wallet);
    event DevWalletUpdated(address newDevWallet);
    event RewardsTrackerUpdated(address newRewardsTracker);
    event RouterUpdated(address newRouterAddress);
    event FeesChanged(
        uint256 newDevFee,
        uint256 newSellDevFee,
        uint256 newRewardsFee,
        uint256 newSellRewardsFee
    );
    event LaunchFeeUpdated(uint256 newLaunchSellFee);

    modifier lockTheSwap() {
        currentlySwapping = true;
        _;
        currentlySwapping = false;
    }

    constructor() ERC20("Ryoshi's Joker", unicode"5150🔥") {
        IUniswapV2Router _uniswapV2Router = IUniswapV2Router(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D 
        );

        
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());

        
        uniswapV2Router = _uniswapV2Router;
        
       
        _mint(owner(), TOTAL_SUPPLY);

        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        
        _isExcludedFromMaxTx[owner()] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        
        
        excludeFromRewards(address(this));
        excludeFromRewards(owner());
        excludeFromRewards(address(0xdead));
        excludeFromRewards(uniswapV2Pair);

        
        uniswapv2contracts[uniswapV2Pair] = true;
    }

    
    
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        require(preparedForLaunch || _msgSender() == owner(), "Contract has not been prepared for launch and user is not owner");
        
        require(
            !isBlacklisted[from] && !isBlacklisted[to],
            "Blacklisted address"
        );

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

        if (!uniswapv2contracts[from] && !uniswapv2contracts[to]) {
            super._transfer(from, to, amount);
            return;
        }

        if (
            !_isExcludedFromMaxTx[from] &&
            !_isExcludedFromMaxTx[to]
        ) {
            require(
                amount <= maxTxAmount,
                "Transfer amount exceeds the maxTxAmount"
            );
        }

        
        uint256 baseRewardsFee = rewardsFee;
        uint256 baseDevFee = devFee; 
        if (to == uniswapV2Pair) {
            devFee = sellDevFee;
            rewardsFee = sellRewardsFee;

            if (launchSellFeeDeadline >= block.timestamp) {
                devFee = devFee.add(launchSellFee);
            }
        }


        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= minTokensBeforeSwap; 
        if (
            overMinTokenBalance &&
            !currentlySwapping &&
            from != uniswapV2Pair &&
            swapAndRedirectEthFeesEnabled
        ) {
            
            swapAndRedirectEthFees(contractTokenBalance);
        }

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            removeAllFee();
        }


        
    (uint256 tTransferAmount, uint256 tFee) = _getValues(amount);
        _balances[from] = _balances[from].sub(amount);
        _balances[to] = _balances[to].add(tTransferAmount);



        _takeFee(tFee);

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            restoreAllFee();
        }
        
        
        devFee = baseDevFee;
        rewardsFee = baseRewardsFee;
        emit Transfer(from, to, tTransferAmount);
    }

    
    receive() external payable {}

    function _getValues(uint256 tAmount)
        private
        view
        returns (uint256, uint256)
    {
        uint256 tFee = calculateFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _takeFee(uint256 fee) private {
        _balances[address(this)] = _balances[address(this)].add(fee);
    }

    function calculateFee(uint256 _amount)
        private
        view
        returns (uint256)
    {
        uint256 totalFee = devFee.add(rewardsFee).add(platformFee); 
        return _amount.mul(totalFee).div(10000);
    }

    function removeAllFee() private {
        if (devFee == 0 && rewardsFee == 0 && platformFee == 0) return;

        _previousPlatformFee = platformFee;
        _previousDevFee = devFee;
        _previousRewardsFee = rewardsFee;
        platformFee = 0;
        devFee = 0;
        rewardsFee = 0;
    }

    function restoreAllFee() private {
        platformFee = _previousPlatformFee;
        devFee = _previousDevFee;
        rewardsFee = _previousRewardsFee;
    }

    function swapAndRedirectEthFees(uint256 contractTokenBalance)
        private
        lockTheSwap
    {
        uint256 totalRedirectFee = devFee.add(rewardsFee).add(platformFee);
        if (totalRedirectFee == 0) return;
        
       
        uint256 initialBalance = address(this).balance; 

        
        swapTokensForEth(contractTokenBalance);

        uint256 newBalance = address(this).balance.sub(initialBalance);

        if (newBalance > 0) {
            
            uint256 platformBalance = newBalance.mul(platformFee).div(totalRedirectFee);
            sendEthToWallet(_platformWalletAddress, platformBalance);

            
            uint256 rewardsBalance = newBalance.mul(rewardsFee).div(totalRedirectFee);
            if (rewardsBalance > 0 && address(_rewardsTracker) != address(0)) {
                try _rewardsTracker.addAllocation{value: rewardsBalance}(REWARDS_TRACKER_IDENTIFIER) {} catch {}
            }
            
            
            uint256 devBalance = newBalance.mul(devFee).div(totalRedirectFee);
            sendEthToWallet(_devWalletAddress, devBalance);

            emit OnSwapAndRedirectEthFees(contractTokenBalance, newBalance);
        }
    }

    function sendEthToWallet(address wallet, uint256 amount) private {
        if (amount > 0) {
            payable(wallet).transfer(amount);
        }
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, 
            path,
            address(this),
            block.timestamp
        );
    }

    function prepareForLaunch() external onlyOwner {
        require(!preparedForLaunch, "Already prepared for launch");

        
        preparedForLaunch = true;

        
        blacklistDeadline = block.timestamp + 24 hours;

        
        launchSellFeeDeadline = block.timestamp + 3 days;
    }

    function setUseGenericTransfer(bool genericTransfer) external onlyOwner {
        useGenericTransfer = genericTransfer;
        emit GenericTransferChanged(genericTransfer);
    }

    function blacklistAddress(address account, bool value) public onlyOwner {
        if (value) {
            require(block.timestamp < blacklistDeadline, "The ability to blacklist accounts has been disabled.");
        }
        isBlacklisted[account] = value;
    }

    
    
    function setMaxTxPercent(uint256 newMaxTx) external onlyOwner {
        require(newMaxTx >= 5, "Max TX should be above 0.5%");
        maxTxAmount = TOTAL_SUPPLY.mul(newMaxTx).div(1000);
        emit MaxTxAmountUpdated(maxTxAmount);
    }
    
    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

     function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
        emit ExcludeFromFees(account);
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
        emit IncludeInFees(account);
    }
    function setFees(
        uint256 newPlatformFee,
        uint256 newDevFee,
        uint256 newSellDevFee,
        uint256 newRewardsFee,
        uint256 newSellRewardsFee
    ) external onlyOwner {
        require(
            newPlatformFee <= 2000 &&
            newDevFee <= 2000 &&
            newSellDevFee <= 2000 &&
            newRewardsFee <= 2000 &&
            newSellRewardsFee <= 2000,
            "Fees exceed maximum allowed value"
        );
        platformFee = newPlatformFee;
        devFee = newDevFee;
        sellDevFee = newSellDevFee;
        rewardsFee = newRewardsFee;
        sellRewardsFee = newSellRewardsFee;
        emit FeesChanged(newDevFee, newSellDevFee, newRewardsFee, newSellRewardsFee);
    }

    function setLaunchSellFee(uint256 newLaunchSellFee) external onlyOwner {
        require(newLaunchSellFee <= 2500, "Maximum launch sell fee is 25%");
        launchSellFee = newLaunchSellFee;
        emit LaunchFeeUpdated(newLaunchSellFee);
    }

    function setDevWallet(address payable newDevWallet)
        external
        onlyOwner
    {
        _devWalletAddress = newDevWallet;
        emit DevWalletUpdated(newDevWallet);
    }

    function setPlatformWallet(address payable newPlatformWallet)
        external
        onlyOwner
    {
        _platformWalletAddress = newPlatformWallet;
    }
    
    function setRewardsTracker(address payable newRewardsTracker)
        external
        onlyOwner
    {
        _rewardsTracker = IRewardsTracker(newRewardsTracker);
        emit RewardsTrackerUpdated(newRewardsTracker);
    }

    function setRouterAddress(address newRouter) external onlyOwner {
        IUniswapV2Router _newUniswapRouter = IUniswapV2Router(newRouter);
        uniswapV2Pair = IUniswapV2Factory(_newUniswapRouter.factory())
            .createPair(address(this), _newUniswapRouter.WETH());
        uniswapV2Router = _newUniswapRouter;
    }

    function setSwapAndRedirectEthFeesEnabled(bool enabled) external onlyOwner {
        swapAndRedirectEthFeesEnabled = enabled;
        emit SwapAndRedirectEthFeesUpdated(enabled);
    }

    function setMinTokensBeforeSwap(uint256 minTokens) external onlyOwner {
        minTokensBeforeSwap = minTokens * 10**9;
        emit MinTokensBeforeSwapUpdated(minTokens);
    }
    
    
    function manualSwap() external onlyOwner {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }

    function manualSend() external onlyOwner {
        uint256 contractEthBalance = address(this).balance;
        sendEthToWallet(_devWalletAddress, contractEthBalance);
    } 

    
    function addPairAddress(address _newPair, bool value) public onlyOwner{
        uniswapv2contracts[_newPair] = value;
    }


}

File 2 of 13 : IRewardsTracker.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: Apache-2.0

interface IRewardsTracker {
    
    function addAllocation(uint identifier) external payable;
}

File 3 of 13 : IUniswapV2Pair.sol
// SPDX-License-Identifier: Apache-2.0

pragma solidity >=0.8.17;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 4 of 13 : IUniswapV2Router.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

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

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

File 5 of 13 : IUniswapV2Factory.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

interface IUniswapV2Factory {

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

File 6 of 13 : RewardsToken.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: Apache-2.0

import "./ERC20.sol";
import "./Ownable.sol";

abstract contract RewardsToken is ERC20, Ownable {

    address[] private excludedFromRewards;
    mapping(address => bool) private isAddressExcluded;
    
    event ExcludeFromRewards(address wallet);
    event IncludeInRewards(address wallet);
    
    function deleteExcluded(uint index) internal {
        require(index < excludedFromRewards.length, "Index is greater than array length");
        excludedFromRewards[index] = excludedFromRewards[excludedFromRewards.length - 1];
        excludedFromRewards.pop();
    }
    
    function getExcludedBalances() internal view returns (uint256) {
        uint256 totalExcludedHoldings = 0;
        for (uint i = 0; i < excludedFromRewards.length; i++) {
            totalExcludedHoldings += balanceOf(excludedFromRewards[i]);
        }
        return totalExcludedHoldings;
    }
    
    function excludeFromRewards(address wallet) public onlyOwner {
        require(!isAddressExcluded[wallet], "Address is already excluded from rewards");
        excludedFromRewards.push(wallet);
        isAddressExcluded[wallet] = true;
        emit ExcludeFromRewards(wallet);
    }
    
    function includeInRewards(address wallet) external onlyOwner {
        require(isAddressExcluded[wallet], "Address is not excluded from rewards");
        for (uint i = 0; i < excludedFromRewards.length; i++) {
            if (excludedFromRewards[i] == wallet) {
                isAddressExcluded[wallet] = false;
                deleteExcluded(i);
                break;
            }
        }
        emit IncludeInRewards(wallet);
    }
    
    function isExcludedFromRewards(address wallet) external view returns (bool) {
        return isAddressExcluded[wallet];
    }
    
    function getAllExcludedFromRewards() external view returns (address[] memory) {
        return excludedFromRewards;
    }
    
    function getRewardsSupply() public view returns (uint256) {
        return _totalSupply - getExcludedBalances();
    }
}

File 7 of 13 : Address.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(
            data
        );
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 8 of 13 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.17;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 9 of 13 : Ownable.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

import "./Context.sol";

/**
 * @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.
 */
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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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) external virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 10 of 13 : ERC20.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";
import "./SafeMath.sol";
import "./Address.sol";

/**
 * @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.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of 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 {
    using SafeMath for uint256;
    using Address for address;

    mapping(address => uint256) internal _balances;

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

    uint256 internal _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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 = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(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);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(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 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 to 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 {}
}

File 11 of 13 : Context.sol
pragma solidity ^0.8.4;

// SPDX-License-Identifier: MIT

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 12 of 13 : IERC20Metadata.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

import "./IERC20.sol";

/**
 * @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 13 of 13 : IERC20.sol
pragma solidity ^0.8.17;

// SPDX-License-Identifier: MIT

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"DevWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"ExcludeFromRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newSellRewardsFee","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"useGenericTransfer","type":"bool"}],"name":"GenericTransferChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"IncludeInRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLaunchSellFee","type":"uint256"}],"name":"LaunchFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethToDevWallet","type":"uint256"}],"name":"OnSwapAndRedirectEthFees","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":false,"internalType":"address","name":"newRewardsTracker","type":"address"}],"name":"RewardsTrackerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndRedirectEthFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"addPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blacklistDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"excludeFromRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllExcludedFromRewards","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"includeInRewards","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":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchSellFeeDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxAmount","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":"prepareForLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPlatformFee","type":"uint256"},{"internalType":"uint256","name":"newDevFee","type":"uint256"},{"internalType":"uint256","name":"newSellDevFee","type":"uint256"},{"internalType":"uint256","name":"newRewardsFee","type":"uint256"},{"internalType":"uint256","name":"newSellRewardsFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLaunchSellFee","type":"uint256"}],"name":"setLaunchSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newPlatformWallet","type":"address"}],"name":"setPlatformWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newRewardsTracker","type":"address"}],"name":"setRewardsTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndRedirectEthFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"genericTransfer","type":"bool"}],"name":"setUseGenericTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndRedirectEthFeesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"uniswapv2contracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useGenericTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000416103e86200002d600266038d7ea4c680006200077960201b62002da91790919060201c565b6200079160201b62002dbf1790919060201c565b6008556064600955600954600a55610578600b55610578600c55600b54600d556000600e556000600f55600e546010556000601155601154601255733b4e4f7827857830243a4cef28dfb81a864b22aa601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507362bb06d9229f4f1f31669b472907ebae96ccbba1601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060165560006017556001601860146101000a81548160ff0219169083151502179055506000601860156101000a81548160ff0219169083151502179055506001601d60156101000a81548160ff02191690831515021790555065048c27395000601e553480156200019857600080fd5b506040518060400160405280600e81526020017f52796f7368692773204a6f6b65720000000000000000000000000000000000008152506040518060400160405280600881526020017f35313530f09f94a5000000000000000000000000000000000000000000000000815250816003908162000216919062000e49565b50806004908162000228919062000e49565b50505060006200023d620007a960201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000341573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000367919062000f9a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f5919062000f9a565b6040518363ffffffff1660e01b81526004016200041492919062000fdd565b6020604051808303816000875af115801562000434573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045a919062000f9a565b601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000503620004ef620007b160201b60201c565b66038d7ea4c68000620007db60201b60201c565b6001601a600062000519620007b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601a60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b6000620005d8620007b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000692306200098960201b60201c565b620006b2620006a6620007b160201b60201c565b6200098960201b60201c565b620006c561dead6200098960201b60201c565b620006f8601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166200098960201b60201c565b600160136000601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050620012fe565b6000818362000789919062001039565b905092915050565b60008183620007a19190620010b3565b905092915050565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000844906200114c565b60405180910390fd5b620008616000838362000bb260201b60201c565b6200087d8160025462000bb760201b62002dd51790919060201c565b600281905550620008db816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000bb760201b62002dd51790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200097d91906200117f565b60405180910390a35050565b62000999620007a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a2290620011ec565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161562000abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ab29062001284565b60405180910390fd5b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd68160405162000ba79190620012a6565b60405180910390a150565b505050565b6000818362000bc79190620012c3565b905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c5157607f821691505b60208210810362000c675762000c6662000c09565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000cd17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c92565b62000cdd868362000c92565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d2a62000d2462000d1e8462000cf5565b62000cff565b62000cf5565b9050919050565b6000819050919050565b62000d468362000d09565b62000d5e62000d558262000d31565b84845462000c9f565b825550505050565b600090565b62000d7562000d66565b62000d8281848462000d3b565b505050565b5b8181101562000daa5762000d9e60008262000d6b565b60018101905062000d88565b5050565b601f82111562000df95762000dc38162000c6d565b62000dce8462000c82565b8101602085101562000dde578190505b62000df662000ded8562000c82565b83018262000d87565b50505b505050565b600082821c905092915050565b600062000e1e6000198460080262000dfe565b1980831691505092915050565b600062000e39838362000e0b565b9150826002028217905092915050565b62000e548262000bcf565b67ffffffffffffffff81111562000e705762000e6f62000bda565b5b62000e7c825462000c38565b62000e8982828562000dae565b600060209050601f83116001811462000ec1576000841562000eac578287015190505b62000eb8858262000e2b565b86555062000f28565b601f19841662000ed18662000c6d565b60005b8281101562000efb5784890151825560018201915060208501945060208101905062000ed4565b8683101562000f1b578489015162000f17601f89168262000e0b565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000f628262000f35565b9050919050565b62000f748162000f55565b811462000f8057600080fd5b50565b60008151905062000f948162000f69565b92915050565b60006020828403121562000fb35762000fb262000f30565b5b600062000fc38482850162000f83565b91505092915050565b62000fd78162000f55565b82525050565b600060408201905062000ff4600083018562000fcc565b62001003602083018462000fcc565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010468262000cf5565b9150620010538362000cf5565b9250828202620010638162000cf5565b915082820484148315176200107d576200107c6200100a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620010c08262000cf5565b9150620010cd8362000cf5565b925082620010e057620010df62001084565b5b828204905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062001134601f83620010eb565b91506200114182620010fc565b602082019050919050565b60006020820190508181036000830152620011678162001125565b9050919050565b620011798162000cf5565b82525050565b60006020820190506200119660008301846200116e565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011d4602083620010eb565b9150620011e1826200119c565b602082019050919050565b600060208201905081810360008301526200120781620011c5565b9050919050565b7f4164647265737320697320616c7265616479206578636c756465642066726f6d60008201527f2072657761726473000000000000000000000000000000000000000000000000602082015250565b60006200126c602883620010eb565b915062001279826200120e565b604082019050919050565b600060208201905081810360008301526200129f816200125d565b9050919050565b6000602082019050620012bd600083018462000fcc565b92915050565b6000620012d08262000cf5565b9150620012dd8362000cf5565b9250828201905080821115620012f857620012f76200100a565b5b92915050565b6156dd806200130e6000396000f3fe6080604052600436106102e85760003560e01c806370a0823111610190578063af01f2b2116100dc578063dd62ed3e11610095578063f2fde38b1161006f578063f2fde38b14610b31578063f429389014610b5a578063fe575a8714610b71578063fffa1dd914610bae576102ef565b8063dd62ed3e14610aa2578063e89bcca214610adf578063ea2f0b3714610b08576102ef565b8063af01f2b2146109a6578063b609995e146109d1578063ba385abb146109fa578063bb8d513114610a23578063cf0c018b14610a4e578063d543dbeb14610a79576102ef565b806395d89b4111610149578063a1ab19a311610123578063a1ab19a3146108ea578063a457c2d714610901578063a9059cbb1461093e578063ada46d0a1461097b576102ef565b806395d89b411461086957806398850b6414610894578063a0d82dc5146108bf576102ef565b806370a082311461076d578063715018a6146107aa5780638421b507146107c15780638831e9cf146107ea5780638c0b5e22146108135780638da5cb5b1461083e576102ef565b8063313ce5671161024f578063455a43961161020857806351bc3c85116101e257806351bc3c85146106c35780635342acb4146106da57806354959363146107175780636827e76414610742576102ef565b8063455a43961461064657806348a464731461066f57806349bd5a5e14610698576102ef565b8063313ce56714610526578063393344b614610551578063395093511461057a57806341cb87fc146105b75780634337ac5b146105e0578063437823ec1461061d576102ef565b80631694505e116102a15780631694505e1461041657806318160ddd146104415780631f53ac021461046c57806323b872dd1461049557806326b6308d146104d25780632bb14e1d146104fb576102ef565b806304a66b48146102f457806306fdde031461031d578063095ea7b3146103485780630e83227314610385578063111e0376146103c2578063113201fa146103eb576102ef565b366102ef57005b600080fd5b34801561030057600080fd5b5061031b60048036038101906103169190614351565b610bd9565b005b34801561032957600080fd5b50610332610d54565b60405161033f919061445c565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a91906144dc565b610de6565b60405161037c9190614537565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190614552565b610e04565b6040516103b99190614537565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190614552565b610e5a565b005b3480156103f757600080fd5b50610400611073565b60405161040d9190614537565b60405180910390f35b34801561042257600080fd5b5061042b611086565b60405161043891906145de565b60405180910390f35b34801561044d57600080fd5b506104566110ac565b6040516104639190614608565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614661565b6110b6565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061468e565b6111c8565b6040516104c99190614537565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f4919061470d565b6112a1565b005b34801561050757600080fd5b5061051061138c565b60405161051d9190614608565b60405180910390f35b34801561053257600080fd5b5061053b611392565b6040516105489190614756565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190614771565b61139b565b005b34801561058657600080fd5b506105a1600480360381019061059c91906144dc565b61148d565b6040516105ae9190614537565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190614552565b611540565b005b3480156105ec57600080fd5b5061060760048036038101906106029190614552565b6117bb565b6040516106149190614537565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190614552565b6117db565b005b34801561065257600080fd5b5061066d60048036038101906106689190614771565b611904565b005b34801561067b57600080fd5b50610696600480360381019061069191906147b1565b611a41565b005b3480156106a457600080fd5b506106ad611b28565b6040516106ba91906147ed565b60405180910390f35b3480156106cf57600080fd5b506106d8611b4e565b005b3480156106e657600080fd5b5061070160048036038101906106fc9190614552565b611bfe565b60405161070e9190614537565b60405180910390f35b34801561072357600080fd5b5061072c611c54565b6040516107399190614608565b60405180910390f35b34801561074e57600080fd5b50610757611c5a565b6040516107649190614608565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190614552565b611c60565b6040516107a19190614608565b60405180910390f35b3480156107b657600080fd5b506107bf611ca8565b005b3480156107cd57600080fd5b506107e860048036038101906107e391906147b1565b611e00565b005b3480156107f657600080fd5b50610811600480360381019061080c9190614661565b611f1d565b005b34801561081f57600080fd5b50610828611ff8565b6040516108359190614608565b60405180910390f35b34801561084a57600080fd5b50610853611ffe565b60405161086091906147ed565b60405180910390f35b34801561087557600080fd5b5061087e612028565b60405161088b919061445c565b60405180910390f35b3480156108a057600080fd5b506108a96120ba565b6040516108b69190614537565b60405180910390f35b3480156108cb57600080fd5b506108d46120cd565b6040516108e19190614608565b60405180910390f35b3480156108f657600080fd5b506108ff6120d3565b005b34801561090d57600080fd5b50610928600480360381019061092391906144dc565b612201565b6040516109359190614537565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906144dc565b6122ce565b6040516109729190614537565b60405180910390f35b34801561098757600080fd5b506109906122ec565b60405161099d91906148c6565b60405180910390f35b3480156109b257600080fd5b506109bb61237a565b6040516109c89190614608565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190614552565b612380565b005b348015610a0657600080fd5b50610a216004803603810190610a1c9190614661565b6125d8565b005b348015610a2f57600080fd5b50610a386126ea565b604051610a459190614608565b60405180910390f35b348015610a5a57600080fd5b50610a636126f0565b604051610a709190614608565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b91906147b1565b6126f6565b005b348015610aae57600080fd5b50610ac96004803603810190610ac491906148e8565b612841565b604051610ad69190614608565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061470d565b6128c8565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190614552565b6129b3565b005b348015610b3d57600080fd5b50610b586004803603810190610b539190614552565b612adc565b005b348015610b6657600080fd5b50610b6f612ca2565b005b348015610b7d57600080fd5b50610b986004803603810190610b939190614552565b612d6d565b604051610ba59190614537565b60405180910390f35b348015610bba57600080fd5b50610bc3612d8d565b604051610bd09190614608565b60405180910390f35b610be1612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790614974565b60405180910390fd5b6107d08511158015610c8457506107d08411155b8015610c9257506107d08311155b8015610ca057506107d08211155b8015610cae57506107d08111155b610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490614a06565b60405180910390fd5b8460098190555083600b8190555082600c8190555081600e8190555080600f819055507f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca584848484604051610d459493929190614a26565b60405180910390a15050505050565b606060038054610d6390614a9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f90614a9a565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b5050505050905090565b6000610dfa610df3612deb565b8484612df3565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610e62612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890614974565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614b3d565b60405180910390fd5b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd68160405161106891906147ed565b60405180910390a150565b601d60159054906101000a900460ff1681565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6110be612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490614974565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb816040516111bd9190614b7e565b60405180910390a150565b60006111d5848484612fbc565b611296846111e1612deb565b6112918560405180606001604052806028815260200161565b60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611247612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b612df3565b600190509392505050565b6112a9612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90614974565b60405180910390fd5b80601d60156101000a81548160ff0219169083151502179055507fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b9816040516113819190614537565b60405180910390a150565b600e5481565b60006009905090565b6113a3612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614974565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061153661149a612deb565b8461153185600160006114ab612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b612df3565b6001905092915050565b611548612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90614974565b60405180910390fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614bae565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190614bae565b6040518363ffffffff1660e01b81526004016116f3929190614bdb565b6020604051808303816000875af1158015611712573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117369190614bae565b601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6117e3612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614974565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d936816040516118f991906147ed565b60405180910390a150565b61190c612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614974565b60405180910390fd5b80156119e65760165442106119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90614c76565b60405180910390fd5b5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a49612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90614974565b60405180910390fd5b633b9aca0081611ae89190614cc5565b601e819055507f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0081604051611b1d9190614608565b60405180910390a150565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b56612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614974565b60405180910390fd5b6000611bf030611c60565b9050611bfb816137bf565b50565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cb0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614974565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e08612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8e90614974565b60405180910390fd5b6109c4811115611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390614d53565b60405180910390fd5b806011819055507fc799be5eb19a1a6d6ba7368d21e2bc367c8a335e4a07cd3d954482e6f714d3c581604051611f129190614608565b60405180910390a150565b611f25612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90614974565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461203790614a9a565b80601f016020809104026020016040519081016040528092919081815260200182805461206390614a9a565b80156120b05780601f10612085576101008083540402835291602001916120b0565b820191906000526020600020905b81548152906001019060200180831161209357829003601f168201915b5050505050905090565b601860149054906101000a900460ff1681565b600c5481565b6120db612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190614974565b60405180910390fd5b601860159054906101000a900460ff16156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614dbf565b60405180910390fd5b6001601860156101000a81548160ff02191690831515021790555062015180426121e49190614ddf565b6016819055506203f480426121f99190614ddf565b601781905550565b60006122c461220e612deb565b846122bf856040518060600160405280602581526020016156836025913960016000612238612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b612df3565b6001905092915050565b60006122e26122db612deb565b8484612fbc565b6001905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561237057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612326575b5050505050905090565b60175481565b612388612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90614974565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a90614e85565b60405180910390fd5b60005b60068054905081101561259d578173ffffffffffffffffffffffffffffffffffffffff16600682815481106124de576124dd614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361258a576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061258581613a02565b61259d565b808061259590614ed4565b9150506124a6565b507f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d589594334816040516125cd91906147ed565b60405180910390a150565b6125e0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266690614974565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a816040516126df9190614b7e565b60405180910390a150565b600f5481565b60165481565b6126fe612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490614974565b60405180910390fd5b60058110156127d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c890614f68565b60405180910390fd5b6127ff6103e86127f18366038d7ea4c68000612da990919063ffffffff16565b612dbf90919063ffffffff16565b6008819055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6008546040516128369190614608565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128d0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690614974565b60405180910390fd5b80601860146101000a81548160ff0219169083151502179055507f7d952115fd41bb443db2ae9cde6670e8dd72fefb507b7a4e0156c57e439afaf5816040516129a89190614537565b60405180910390a150565b6129bb612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614974565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d81604051612ad191906147ed565b60405180910390a150565b612ae4612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a90614974565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd990614ffa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612caa612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3090614974565b60405180910390fd5b6000479050612d6a601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b50565b60196020528060005260406000206000915054906101000a900460ff1681565b6000612d97613b94565b600254612da4919061501a565b905090565b60008183612db79190614cc5565b905092915050565b60008183612dcd919061507d565b905092915050565b60008183612de39190614ddf565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5990615120565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec8906151b2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612faf9190614608565b60405180910390a3505050565b601860159054906101000a900460ff16806130105750612fda611ffe565b73ffffffffffffffffffffffffffffffffffffffff16612ff8612deb565b73ffffffffffffffffffffffffffffffffffffffff16145b61304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690615244565b60405180910390fd5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130f35750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613129906152b0565b60405180910390fd5b601860149054906101000a900460ff161561315757613152838383613c1a565b613765565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156131fb5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132105761320b838383613c1a565b613765565b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132b45750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132ff576008548111156132fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f590615342565b60405180910390fd5b5b6000600e5490506000600b549050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361339c57600c54600b81905550600f54600e81905550426017541061339b57613394601154600b54612dd590919063ffffffff16565b600b819055505b5b60006133a730611c60565b90506000601e5482101590508080156133cd5750601d60149054906101000a900460ff16155b80156134275750601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801561343f5750601d60159054906101000a900460ff165b1561344e5761344d82613ead565b5b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134ef5750601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156134fd576134fc614159565b5b600080613509876141b5565b9150915061355e876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141e990919063ffffffff16565b6000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f1826000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061363c816141ff565b601a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806136dd5750601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136eb576136ea614295565b5b84600b8190555085600e819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137569190614608565b60405180910390a35050505050505b505050565b60008383111582906137b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a9919061445c565b60405180910390fd5b5082840390509392505050565b6000600267ffffffffffffffff8111156137dc576137db615362565b5b60405190808252806020026020018201604052801561380a5781602001602082028036833780820191505090505b509050308160008151811061382257613821614ea5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ed9190614bae565b8160018151811061390157613900614ea5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061396830601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612df3565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139cc9594939291906153cc565b600060405180830381600087803b1580156139e657600080fd5b505af11580156139fa573d6000803e3d6000fd5b505050505050565b6006805490508110613a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4090615498565b60405180910390fd5b60066001600680549050613a5d919061501a565b81548110613a6e57613a6d614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110613aad57613aac614ea5565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480613b0757613b066154b8565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b6000811115613b90578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613b8e573d6000803e3d6000fd5b505b5050565b6000806000905060005b600680549050811015613c1257613bf260068281548110613bc257613bc1614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c60565b82613bfd9190614ddf565b91508080613c0a90614ed4565b915050613b9e565b508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8090615559565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cef906155eb565b60405180910390fd5b613d038383836142b2565b613d6e81604051806060016040528060268152602001615635602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e01816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613ea09190614608565b60405180910390a3505050565b6001601d60146101000a81548160ff0219169083151502179055506000613ef5600954613ee7600e54600b54612dd590919063ffffffff16565b612dd590919063ffffffff16565b905060008103613f05575061413b565b6000479050613f13836137bf565b6000613f2882476141e990919063ffffffff16565b90506000811115614137576000613f5c84613f4e60095485612da990919063ffffffff16565b612dbf90919063ffffffff16565b9050613f8a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b6000613fb385613fa5600e5486612da990919063ffffffff16565b612dbf90919063ffffffff16565b90506000811180156140145750600073ffffffffffffffffffffffffffffffffffffffff16601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156140a357601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febd221b8260636040518363ffffffff1660e01b81526004016140769190614608565b6000604051808303818588803b15801561408f57600080fd5b505af1935050505080156140a1575060015b505b60006140cc866140be600b5487612da990919063ffffffff16565b612dbf90919063ffffffff16565b90506140fa601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b7f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7878560405161412b92919061560b565b60405180910390a15050505b5050505b6000601d60146101000a81548160ff02191690831515021790555050565b6000600b5414801561416d57506000600e54145b801561417b57506000600954145b6141b357600954600a81905550600b54600d81905550600e5460108190555060006009819055506000600b819055506000600e819055505b565b60008060006141c3846142b7565b905060006141da82866141e990919063ffffffff16565b90508082935093505050915091565b600081836141f7919061501a565b905092915050565b614250816000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600a54600981905550600d54600b81905550601054600e81905550565b505050565b6000806142e56009546142d7600e54600b54612dd590919063ffffffff16565b612dd590919063ffffffff16565b905061430e6127106143008386612da990919063ffffffff16565b612dbf90919063ffffffff16565b915050919050565b600080fd5b6000819050919050565b61432e8161431b565b811461433957600080fd5b50565b60008135905061434b81614325565b92915050565b600080600080600060a0868803121561436d5761436c614316565b5b600061437b8882890161433c565b955050602061438c8882890161433c565b945050604061439d8882890161433c565b93505060606143ae8882890161433c565b92505060806143bf8882890161433c565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b838110156144065780820151818401526020810190506143eb565b60008484015250505050565b6000601f19601f8301169050919050565b600061442e826143cc565b61443881856143d7565b93506144488185602086016143e8565b61445181614412565b840191505092915050565b600060208201905081810360008301526144768184614423565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144a98261447e565b9050919050565b6144b98161449e565b81146144c457600080fd5b50565b6000813590506144d6816144b0565b92915050565b600080604083850312156144f3576144f2614316565b5b6000614501858286016144c7565b92505060206145128582860161433c565b9150509250929050565b60008115159050919050565b6145318161451c565b82525050565b600060208201905061454c6000830184614528565b92915050565b60006020828403121561456857614567614316565b5b6000614576848285016144c7565b91505092915050565b6000819050919050565b60006145a461459f61459a8461447e565b61457f565b61447e565b9050919050565b60006145b682614589565b9050919050565b60006145c8826145ab565b9050919050565b6145d8816145bd565b82525050565b60006020820190506145f360008301846145cf565b92915050565b6146028161431b565b82525050565b600060208201905061461d60008301846145f9565b92915050565b600061462e8261447e565b9050919050565b61463e81614623565b811461464957600080fd5b50565b60008135905061465b81614635565b92915050565b60006020828403121561467757614676614316565b5b60006146858482850161464c565b91505092915050565b6000806000606084860312156146a7576146a6614316565b5b60006146b5868287016144c7565b93505060206146c6868287016144c7565b92505060406146d78682870161433c565b9150509250925092565b6146ea8161451c565b81146146f557600080fd5b50565b600081359050614707816146e1565b92915050565b60006020828403121561472357614722614316565b5b6000614731848285016146f8565b91505092915050565b600060ff82169050919050565b6147508161473a565b82525050565b600060208201905061476b6000830184614747565b92915050565b6000806040838503121561478857614787614316565b5b6000614796858286016144c7565b92505060206147a7858286016146f8565b9150509250929050565b6000602082840312156147c7576147c6614316565b5b60006147d58482850161433c565b91505092915050565b6147e78161449e565b82525050565b600060208201905061480260008301846147de565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61483d8161449e565b82525050565b600061484f8383614834565b60208301905092915050565b6000602082019050919050565b600061487382614808565b61487d8185614813565b935061488883614824565b8060005b838110156148b95781516148a08882614843565b97506148ab8361485b565b92505060018101905061488c565b5085935050505092915050565b600060208201905081810360008301526148e08184614868565b905092915050565b600080604083850312156148ff576148fe614316565b5b600061490d858286016144c7565b925050602061491e858286016144c7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061495e6020836143d7565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006149f06021836143d7565b91506149fb82614994565b604082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b6000608082019050614a3b60008301876145f9565b614a4860208301866145f9565b614a5560408301856145f9565b614a6260608301846145f9565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ab257607f821691505b602082108103614ac557614ac4614a6b565b5b50919050565b7f4164647265737320697320616c7265616479206578636c756465642066726f6d60008201527f2072657761726473000000000000000000000000000000000000000000000000602082015250565b6000614b276028836143d7565b9150614b3282614acb565b604082019050919050565b60006020820190508181036000830152614b5681614b1a565b9050919050565b6000614b68826145ab565b9050919050565b614b7881614b5d565b82525050565b6000602082019050614b936000830184614b6f565b92915050565b600081519050614ba8816144b0565b92915050565b600060208284031215614bc457614bc3614316565b5b6000614bd284828501614b99565b91505092915050565b6000604082019050614bf060008301856147de565b614bfd60208301846147de565b9392505050565b7f546865206162696c69747920746f20626c61636b6c697374206163636f756e7460008201527f7320686173206265656e2064697361626c65642e000000000000000000000000602082015250565b6000614c606034836143d7565b9150614c6b82614c04565b604082019050919050565b60006020820190508181036000830152614c8f81614c53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd08261431b565b9150614cdb8361431b565b9250828202614ce98161431b565b91508282048414831517614d0057614cff614c96565b5b5092915050565b7f4d6178696d756d206c61756e63682073656c6c20666565206973203235250000600082015250565b6000614d3d601e836143d7565b9150614d4882614d07565b602082019050919050565b60006020820190508181036000830152614d6c81614d30565b9050919050565b7f416c726561647920707265706172656420666f72206c61756e63680000000000600082015250565b6000614da9601b836143d7565b9150614db482614d73565b602082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b6000614dea8261431b565b9150614df58361431b565b9250828201905080821115614e0d57614e0c614c96565b5b92915050565b7f41646472657373206973206e6f74206578636c756465642066726f6d2072657760008201527f6172647300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6f6024836143d7565b9150614e7a82614e13565b604082019050919050565b60006020820190508181036000830152614e9e81614e62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614edf8261431b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1157614f10614c96565b5b600182019050919050565b7f4d61782054582073686f756c642062652061626f766520302e35250000000000600082015250565b6000614f52601b836143d7565b9150614f5d82614f1c565b602082019050919050565b60006020820190508181036000830152614f8181614f45565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fe46026836143d7565b9150614fef82614f88565b604082019050919050565b6000602082019050818103600083015261501381614fd7565b9050919050565b60006150258261431b565b91506150308361431b565b925082820390508181111561504857615047614c96565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150888261431b565b91506150938361431b565b9250826150a3576150a261504e565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061510a6024836143d7565b9150615115826150ae565b604082019050919050565b60006020820190508181036000830152615139816150fd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061519c6022836143d7565b91506151a782615140565b604082019050919050565b600060208201905081810360008301526151cb8161518f565b9050919050565b7f436f6e747261637420686173206e6f74206265656e207072657061726564206660008201527f6f72206c61756e636820616e642075736572206973206e6f74206f776e657200602082015250565b600061522e603f836143d7565b9150615239826151d2565b604082019050919050565b6000602082019050818103600083015261525d81615221565b9050919050565b7f426c61636b6c6973746564206164647265737300000000000000000000000000600082015250565b600061529a6013836143d7565b91506152a582615264565b602082019050919050565b600060208201905081810360008301526152c98161528d565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e7400000000000000000000000000000000000000000000000000602082015250565b600061532c6027836143d7565b9150615337826152d0565b604082019050919050565b6000602082019050818103600083015261535b8161531f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b60006153b66153b16153ac84615391565b61457f565b61431b565b9050919050565b6153c68161539b565b82525050565b600060a0820190506153e160008301886145f9565b6153ee60208301876153bd565b81810360408301526154008186614868565b905061540f60608301856147de565b61541c60808301846145f9565b9695505050505050565b7f496e6465782069732067726561746572207468616e206172726179206c656e6760008201527f7468000000000000000000000000000000000000000000000000000000000000602082015250565b60006154826022836143d7565b915061548d82615426565b604082019050919050565b600060208201905081810360008301526154b181615475565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006155436025836143d7565b915061554e826154e7565b604082019050919050565b6000602082019050818103600083015261557281615536565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155d56023836143d7565b91506155e082615579565b604082019050919050565b60006020820190508181036000830152615604816155c8565b9050919050565b600060408201905061562060008301856145f9565b61562d60208301846145f9565b939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a2bbea0d72d99c1190b89986a2f91ef540de2f137901a201e830a56f28e0709d64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102e85760003560e01c806370a0823111610190578063af01f2b2116100dc578063dd62ed3e11610095578063f2fde38b1161006f578063f2fde38b14610b31578063f429389014610b5a578063fe575a8714610b71578063fffa1dd914610bae576102ef565b8063dd62ed3e14610aa2578063e89bcca214610adf578063ea2f0b3714610b08576102ef565b8063af01f2b2146109a6578063b609995e146109d1578063ba385abb146109fa578063bb8d513114610a23578063cf0c018b14610a4e578063d543dbeb14610a79576102ef565b806395d89b4111610149578063a1ab19a311610123578063a1ab19a3146108ea578063a457c2d714610901578063a9059cbb1461093e578063ada46d0a1461097b576102ef565b806395d89b411461086957806398850b6414610894578063a0d82dc5146108bf576102ef565b806370a082311461076d578063715018a6146107aa5780638421b507146107c15780638831e9cf146107ea5780638c0b5e22146108135780638da5cb5b1461083e576102ef565b8063313ce5671161024f578063455a43961161020857806351bc3c85116101e257806351bc3c85146106c35780635342acb4146106da57806354959363146107175780636827e76414610742576102ef565b8063455a43961461064657806348a464731461066f57806349bd5a5e14610698576102ef565b8063313ce56714610526578063393344b614610551578063395093511461057a57806341cb87fc146105b75780634337ac5b146105e0578063437823ec1461061d576102ef565b80631694505e116102a15780631694505e1461041657806318160ddd146104415780631f53ac021461046c57806323b872dd1461049557806326b6308d146104d25780632bb14e1d146104fb576102ef565b806304a66b48146102f457806306fdde031461031d578063095ea7b3146103485780630e83227314610385578063111e0376146103c2578063113201fa146103eb576102ef565b366102ef57005b600080fd5b34801561030057600080fd5b5061031b60048036038101906103169190614351565b610bd9565b005b34801561032957600080fd5b50610332610d54565b60405161033f919061445c565b60405180910390f35b34801561035457600080fd5b5061036f600480360381019061036a91906144dc565b610de6565b60405161037c9190614537565b60405180910390f35b34801561039157600080fd5b506103ac60048036038101906103a79190614552565b610e04565b6040516103b99190614537565b60405180910390f35b3480156103ce57600080fd5b506103e960048036038101906103e49190614552565b610e5a565b005b3480156103f757600080fd5b50610400611073565b60405161040d9190614537565b60405180910390f35b34801561042257600080fd5b5061042b611086565b60405161043891906145de565b60405180910390f35b34801561044d57600080fd5b506104566110ac565b6040516104639190614608565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190614661565b6110b6565b005b3480156104a157600080fd5b506104bc60048036038101906104b7919061468e565b6111c8565b6040516104c99190614537565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f4919061470d565b6112a1565b005b34801561050757600080fd5b5061051061138c565b60405161051d9190614608565b60405180910390f35b34801561053257600080fd5b5061053b611392565b6040516105489190614756565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190614771565b61139b565b005b34801561058657600080fd5b506105a1600480360381019061059c91906144dc565b61148d565b6040516105ae9190614537565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190614552565b611540565b005b3480156105ec57600080fd5b5061060760048036038101906106029190614552565b6117bb565b6040516106149190614537565b60405180910390f35b34801561062957600080fd5b50610644600480360381019061063f9190614552565b6117db565b005b34801561065257600080fd5b5061066d60048036038101906106689190614771565b611904565b005b34801561067b57600080fd5b50610696600480360381019061069191906147b1565b611a41565b005b3480156106a457600080fd5b506106ad611b28565b6040516106ba91906147ed565b60405180910390f35b3480156106cf57600080fd5b506106d8611b4e565b005b3480156106e657600080fd5b5061070160048036038101906106fc9190614552565b611bfe565b60405161070e9190614537565b60405180910390f35b34801561072357600080fd5b5061072c611c54565b6040516107399190614608565b60405180910390f35b34801561074e57600080fd5b50610757611c5a565b6040516107649190614608565b60405180910390f35b34801561077957600080fd5b50610794600480360381019061078f9190614552565b611c60565b6040516107a19190614608565b60405180910390f35b3480156107b657600080fd5b506107bf611ca8565b005b3480156107cd57600080fd5b506107e860048036038101906107e391906147b1565b611e00565b005b3480156107f657600080fd5b50610811600480360381019061080c9190614661565b611f1d565b005b34801561081f57600080fd5b50610828611ff8565b6040516108359190614608565b60405180910390f35b34801561084a57600080fd5b50610853611ffe565b60405161086091906147ed565b60405180910390f35b34801561087557600080fd5b5061087e612028565b60405161088b919061445c565b60405180910390f35b3480156108a057600080fd5b506108a96120ba565b6040516108b69190614537565b60405180910390f35b3480156108cb57600080fd5b506108d46120cd565b6040516108e19190614608565b60405180910390f35b3480156108f657600080fd5b506108ff6120d3565b005b34801561090d57600080fd5b50610928600480360381019061092391906144dc565b612201565b6040516109359190614537565b60405180910390f35b34801561094a57600080fd5b50610965600480360381019061096091906144dc565b6122ce565b6040516109729190614537565b60405180910390f35b34801561098757600080fd5b506109906122ec565b60405161099d91906148c6565b60405180910390f35b3480156109b257600080fd5b506109bb61237a565b6040516109c89190614608565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190614552565b612380565b005b348015610a0657600080fd5b50610a216004803603810190610a1c9190614661565b6125d8565b005b348015610a2f57600080fd5b50610a386126ea565b604051610a459190614608565b60405180910390f35b348015610a5a57600080fd5b50610a636126f0565b604051610a709190614608565b60405180910390f35b348015610a8557600080fd5b50610aa06004803603810190610a9b91906147b1565b6126f6565b005b348015610aae57600080fd5b50610ac96004803603810190610ac491906148e8565b612841565b604051610ad69190614608565b60405180910390f35b348015610aeb57600080fd5b50610b066004803603810190610b01919061470d565b6128c8565b005b348015610b1457600080fd5b50610b2f6004803603810190610b2a9190614552565b6129b3565b005b348015610b3d57600080fd5b50610b586004803603810190610b539190614552565b612adc565b005b348015610b6657600080fd5b50610b6f612ca2565b005b348015610b7d57600080fd5b50610b986004803603810190610b939190614552565b612d6d565b604051610ba59190614537565b60405180910390f35b348015610bba57600080fd5b50610bc3612d8d565b604051610bd09190614608565b60405180910390f35b610be1612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6790614974565b60405180910390fd5b6107d08511158015610c8457506107d08411155b8015610c9257506107d08311155b8015610ca057506107d08211155b8015610cae57506107d08111155b610ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce490614a06565b60405180910390fd5b8460098190555083600b8190555082600c8190555081600e8190555080600f819055507f7027e29faa2460f22e800d92db38d4795b668c7104da6b87afaeaf502a269ca584848484604051610d459493929190614a26565b60405180910390a15050505050565b606060038054610d6390614a9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8f90614a9a565b8015610ddc5780601f10610db157610100808354040283529160200191610ddc565b820191906000526020600020905b815481529060010190602001808311610dbf57829003601f168201915b5050505050905090565b6000610dfa610df3612deb565b8484612df3565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610e62612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890614974565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7590614b3d565b60405180910390fd5b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f9dc0c5d829ba95d4a3aa3e40791b3e0ff125f876788532b9f7f6eb543d8dfbd68160405161106891906147ed565b60405180910390a150565b601d60159054906101000a900460ff1681565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6110be612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114490614974565b60405180910390fd5b80601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f31bb1993faff4f8409d7baad771f861e093ef4ce2c92c6e0cb10b82d1c7324cb816040516111bd9190614b7e565b60405180910390a150565b60006111d5848484612fbc565b611296846111e1612deb565b6112918560405180606001604052806028815260200161565b60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611247612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b612df3565b600190509392505050565b6112a9612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f90614974565b60405180910390fd5b80601d60156101000a81548160ff0219169083151502179055507fd9fca2a469120637ae54e43ab68dfdcd9354db52d615dea3d3a66a085e6f41b9816040516113819190614537565b60405180910390a150565b600e5481565b60006009905090565b6113a3612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614974565b60405180910390fd5b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600061153661149a612deb565b8461153185600160006114ab612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b612df3565b6001905092915050565b611548612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90614974565b60405180910390fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614bae565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190614bae565b6040518363ffffffff1660e01b81526004016116f3929190614bdb565b6020604051808303816000875af1158015611712573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117369190614bae565b601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60136020528060005260406000206000915054906101000a900460ff1681565b6117e3612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186990614974565b60405180910390fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d936816040516118f991906147ed565b60405180910390a150565b61190c612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199290614974565b60405180910390fd5b80156119e65760165442106119e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dc90614c76565b60405180910390fd5b5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611a49612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acf90614974565b60405180910390fd5b633b9aca0081611ae89190614cc5565b601e819055507f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0081604051611b1d9190614608565b60405180910390a150565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611b56612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdc90614974565b60405180910390fd5b6000611bf030611c60565b9050611bfb816137bf565b50565b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60115481565b600b5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cb0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690614974565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611e08612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8e90614974565b60405180910390fd5b6109c4811115611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390614d53565b60405180910390fd5b806011819055507fc799be5eb19a1a6d6ba7368d21e2bc367c8a335e4a07cd3d954482e6f714d3c581604051611f129190614608565b60405180910390a150565b611f25612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fab90614974565b60405180910390fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461203790614a9a565b80601f016020809104026020016040519081016040528092919081815260200182805461206390614a9a565b80156120b05780601f10612085576101008083540402835291602001916120b0565b820191906000526020600020905b81548152906001019060200180831161209357829003601f168201915b5050505050905090565b601860149054906101000a900460ff1681565b600c5481565b6120db612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190614974565b60405180910390fd5b601860159054906101000a900460ff16156121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614dbf565b60405180910390fd5b6001601860156101000a81548160ff02191690831515021790555062015180426121e49190614ddf565b6016819055506203f480426121f99190614ddf565b601781905550565b60006122c461220e612deb565b846122bf856040518060600160405280602581526020016156836025913960016000612238612deb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b612df3565b6001905092915050565b60006122e26122db612deb565b8484612fbc565b6001905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561237057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612326575b5050505050905090565b60175481565b612388612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240e90614974565b60405180910390fd5b600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a90614e85565b60405180910390fd5b60005b60068054905081101561259d578173ffffffffffffffffffffffffffffffffffffffff16600682815481106124de576124dd614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361258a576000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061258581613a02565b61259d565b808061259590614ed4565b9150506124a6565b507f87434094d24a90fbd9a8ffcf2be9818d237c06a12d126296bc1ea7d589594334816040516125cd91906147ed565b60405180910390a150565b6125e0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461266f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266690614974565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f535be0bbc71c839ded01277ab57f29f2e810c1ff0255bb938d7cb8e96ac8ca1a816040516126df9190614b7e565b60405180910390a150565b600f5481565b60165481565b6126fe612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461278d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278490614974565b60405180910390fd5b60058110156127d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c890614f68565b60405180910390fd5b6127ff6103e86127f18366038d7ea4c68000612da990919063ffffffff16565b612dbf90919063ffffffff16565b6008819055507f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf6008546040516128369190614608565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6128d0612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295690614974565b60405180910390fd5b80601860146101000a81548160ff0219169083151502179055507f7d952115fd41bb443db2ae9cde6670e8dd72fefb507b7a4e0156c57e439afaf5816040516129a89190614537565b60405180910390a150565b6129bb612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614974565b60405180910390fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d81604051612ad191906147ed565b60405180910390a150565b612ae4612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6a90614974565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd990614ffa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612caa612deb565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3090614974565b60405180910390fd5b6000479050612d6a601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b50565b60196020528060005260406000206000915054906101000a900460ff1681565b6000612d97613b94565b600254612da4919061501a565b905090565b60008183612db79190614cc5565b905092915050565b60008183612dcd919061507d565b905092915050565b60008183612de39190614ddf565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5990615120565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec8906151b2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612faf9190614608565b60405180910390a3505050565b601860159054906101000a900460ff16806130105750612fda611ffe565b73ffffffffffffffffffffffffffffffffffffffff16612ff8612deb565b73ffffffffffffffffffffffffffffffffffffffff16145b61304f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304690615244565b60405180910390fd5b601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156130f35750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b613132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613129906152b0565b60405180910390fd5b601860149054906101000a900460ff161561315757613152838383613c1a565b613765565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156131fb5750601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132105761320b838383613c1a565b613765565b601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156132b45750601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132ff576008548111156132fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f590615342565b60405180910390fd5b5b6000600e5490506000600b549050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361339c57600c54600b81905550600f54600e81905550426017541061339b57613394601154600b54612dd590919063ffffffff16565b600b819055505b5b60006133a730611c60565b90506000601e5482101590508080156133cd5750601d60149054906101000a900460ff16155b80156134275750601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b801561343f5750601d60159054906101000a900460ff165b1561344e5761344d82613ead565b5b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134ef5750601a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156134fd576134fc614159565b5b600080613509876141b5565b9150915061355e876000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546141e990919063ffffffff16565b6000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506135f1826000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061363c816141ff565b601a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806136dd5750601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136eb576136ea614295565b5b84600b8190555085600e819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516137569190614608565b60405180910390a35050505050505b505050565b60008383111582906137b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a9919061445c565b60405180910390fd5b5082840390509392505050565b6000600267ffffffffffffffff8111156137dc576137db615362565b5b60405190808252806020026020018201604052801561380a5781602001602082028036833780820191505090505b509050308160008151811061382257613821614ea5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ed9190614bae565b8160018151811061390157613900614ea5565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061396830601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612df3565b601c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016139cc9594939291906153cc565b600060405180830381600087803b1580156139e657600080fd5b505af11580156139fa573d6000803e3d6000fd5b505050505050565b6006805490508110613a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a4090615498565b60405180910390fd5b60066001600680549050613a5d919061501a565b81548110613a6e57613a6d614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660068281548110613aad57613aac614ea5565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480613b0757613b066154b8565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905550565b6000811115613b90578173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613b8e573d6000803e3d6000fd5b505b5050565b6000806000905060005b600680549050811015613c1257613bf260068281548110613bc257613bc1614ea5565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c60565b82613bfd9190614ddf565b91508080613c0a90614ed4565b915050613b9e565b508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8090615559565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cef906155eb565b60405180910390fd5b613d038383836142b2565b613d6e81604051806060016040528060268152602001615635602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461376a9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e01816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613ea09190614608565b60405180910390a3505050565b6001601d60146101000a81548160ff0219169083151502179055506000613ef5600954613ee7600e54600b54612dd590919063ffffffff16565b612dd590919063ffffffff16565b905060008103613f05575061413b565b6000479050613f13836137bf565b6000613f2882476141e990919063ffffffff16565b90506000811115614137576000613f5c84613f4e60095485612da990919063ffffffff16565b612dbf90919063ffffffff16565b9050613f8a601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b6000613fb385613fa5600e5486612da990919063ffffffff16565b612dbf90919063ffffffff16565b90506000811180156140145750600073ffffffffffffffffffffffffffffffffffffffff16601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156140a357601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663febd221b8260636040518363ffffffff1660e01b81526004016140769190614608565b6000604051808303818588803b15801561408f57600080fd5b505af1935050505080156140a1575060015b505b60006140cc866140be600b5487612da990919063ffffffff16565b612dbf90919063ffffffff16565b90506140fa601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613b3f565b7f3736f4ec17d19b9b4f0fbeeb377db969da082d70e2e16221f77d5b321570e8c7878560405161412b92919061560b565b60405180910390a15050505b5050505b6000601d60146101000a81548160ff02191690831515021790555050565b6000600b5414801561416d57506000600e54145b801561417b57506000600954145b6141b357600954600a81905550600b54600d81905550600e5460108190555060006009819055506000600b819055506000600e819055505b565b60008060006141c3846142b7565b905060006141da82866141e990919063ffffffff16565b90508082935093505050915091565b600081836141f7919061501a565b905092915050565b614250816000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd590919063ffffffff16565b6000803073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600a54600981905550600d54600b81905550601054600e81905550565b505050565b6000806142e56009546142d7600e54600b54612dd590919063ffffffff16565b612dd590919063ffffffff16565b905061430e6127106143008386612da990919063ffffffff16565b612dbf90919063ffffffff16565b915050919050565b600080fd5b6000819050919050565b61432e8161431b565b811461433957600080fd5b50565b60008135905061434b81614325565b92915050565b600080600080600060a0868803121561436d5761436c614316565b5b600061437b8882890161433c565b955050602061438c8882890161433c565b945050604061439d8882890161433c565b93505060606143ae8882890161433c565b92505060806143bf8882890161433c565b9150509295509295909350565b600081519050919050565b600082825260208201905092915050565b60005b838110156144065780820151818401526020810190506143eb565b60008484015250505050565b6000601f19601f8301169050919050565b600061442e826143cc565b61443881856143d7565b93506144488185602086016143e8565b61445181614412565b840191505092915050565b600060208201905081810360008301526144768184614423565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006144a98261447e565b9050919050565b6144b98161449e565b81146144c457600080fd5b50565b6000813590506144d6816144b0565b92915050565b600080604083850312156144f3576144f2614316565b5b6000614501858286016144c7565b92505060206145128582860161433c565b9150509250929050565b60008115159050919050565b6145318161451c565b82525050565b600060208201905061454c6000830184614528565b92915050565b60006020828403121561456857614567614316565b5b6000614576848285016144c7565b91505092915050565b6000819050919050565b60006145a461459f61459a8461447e565b61457f565b61447e565b9050919050565b60006145b682614589565b9050919050565b60006145c8826145ab565b9050919050565b6145d8816145bd565b82525050565b60006020820190506145f360008301846145cf565b92915050565b6146028161431b565b82525050565b600060208201905061461d60008301846145f9565b92915050565b600061462e8261447e565b9050919050565b61463e81614623565b811461464957600080fd5b50565b60008135905061465b81614635565b92915050565b60006020828403121561467757614676614316565b5b60006146858482850161464c565b91505092915050565b6000806000606084860312156146a7576146a6614316565b5b60006146b5868287016144c7565b93505060206146c6868287016144c7565b92505060406146d78682870161433c565b9150509250925092565b6146ea8161451c565b81146146f557600080fd5b50565b600081359050614707816146e1565b92915050565b60006020828403121561472357614722614316565b5b6000614731848285016146f8565b91505092915050565b600060ff82169050919050565b6147508161473a565b82525050565b600060208201905061476b6000830184614747565b92915050565b6000806040838503121561478857614787614316565b5b6000614796858286016144c7565b92505060206147a7858286016146f8565b9150509250929050565b6000602082840312156147c7576147c6614316565b5b60006147d58482850161433c565b91505092915050565b6147e78161449e565b82525050565b600060208201905061480260008301846147de565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61483d8161449e565b82525050565b600061484f8383614834565b60208301905092915050565b6000602082019050919050565b600061487382614808565b61487d8185614813565b935061488883614824565b8060005b838110156148b95781516148a08882614843565b97506148ab8361485b565b92505060018101905061488c565b5085935050505092915050565b600060208201905081810360008301526148e08184614868565b905092915050565b600080604083850312156148ff576148fe614316565b5b600061490d858286016144c7565b925050602061491e858286016144c7565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061495e6020836143d7565b915061496982614928565b602082019050919050565b6000602082019050818103600083015261498d81614951565b9050919050565b7f4665657320657863656564206d6178696d756d20616c6c6f7765642076616c7560008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006149f06021836143d7565b91506149fb82614994565b604082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b6000608082019050614a3b60008301876145f9565b614a4860208301866145f9565b614a5560408301856145f9565b614a6260608301846145f9565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ab257607f821691505b602082108103614ac557614ac4614a6b565b5b50919050565b7f4164647265737320697320616c7265616479206578636c756465642066726f6d60008201527f2072657761726473000000000000000000000000000000000000000000000000602082015250565b6000614b276028836143d7565b9150614b3282614acb565b604082019050919050565b60006020820190508181036000830152614b5681614b1a565b9050919050565b6000614b68826145ab565b9050919050565b614b7881614b5d565b82525050565b6000602082019050614b936000830184614b6f565b92915050565b600081519050614ba8816144b0565b92915050565b600060208284031215614bc457614bc3614316565b5b6000614bd284828501614b99565b91505092915050565b6000604082019050614bf060008301856147de565b614bfd60208301846147de565b9392505050565b7f546865206162696c69747920746f20626c61636b6c697374206163636f756e7460008201527f7320686173206265656e2064697361626c65642e000000000000000000000000602082015250565b6000614c606034836143d7565b9150614c6b82614c04565b604082019050919050565b60006020820190508181036000830152614c8f81614c53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614cd08261431b565b9150614cdb8361431b565b9250828202614ce98161431b565b91508282048414831517614d0057614cff614c96565b5b5092915050565b7f4d6178696d756d206c61756e63682073656c6c20666565206973203235250000600082015250565b6000614d3d601e836143d7565b9150614d4882614d07565b602082019050919050565b60006020820190508181036000830152614d6c81614d30565b9050919050565b7f416c726561647920707265706172656420666f72206c61756e63680000000000600082015250565b6000614da9601b836143d7565b9150614db482614d73565b602082019050919050565b60006020820190508181036000830152614dd881614d9c565b9050919050565b6000614dea8261431b565b9150614df58361431b565b9250828201905080821115614e0d57614e0c614c96565b5b92915050565b7f41646472657373206973206e6f74206578636c756465642066726f6d2072657760008201527f6172647300000000000000000000000000000000000000000000000000000000602082015250565b6000614e6f6024836143d7565b9150614e7a82614e13565b604082019050919050565b60006020820190508181036000830152614e9e81614e62565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614edf8261431b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f1157614f10614c96565b5b600182019050919050565b7f4d61782054582073686f756c642062652061626f766520302e35250000000000600082015250565b6000614f52601b836143d7565b9150614f5d82614f1c565b602082019050919050565b60006020820190508181036000830152614f8181614f45565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614fe46026836143d7565b9150614fef82614f88565b604082019050919050565b6000602082019050818103600083015261501381614fd7565b9050919050565b60006150258261431b565b91506150308361431b565b925082820390508181111561504857615047614c96565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150888261431b565b91506150938361431b565b9250826150a3576150a261504e565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061510a6024836143d7565b9150615115826150ae565b604082019050919050565b60006020820190508181036000830152615139816150fd565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061519c6022836143d7565b91506151a782615140565b604082019050919050565b600060208201905081810360008301526151cb8161518f565b9050919050565b7f436f6e747261637420686173206e6f74206265656e207072657061726564206660008201527f6f72206c61756e636820616e642075736572206973206e6f74206f776e657200602082015250565b600061522e603f836143d7565b9150615239826151d2565b604082019050919050565b6000602082019050818103600083015261525d81615221565b9050919050565b7f426c61636b6c6973746564206164647265737300000000000000000000000000600082015250565b600061529a6013836143d7565b91506152a582615264565b602082019050919050565b600060208201905081810360008301526152c98161528d565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e7400000000000000000000000000000000000000000000000000602082015250565b600061532c6027836143d7565b9150615337826152d0565b604082019050919050565b6000602082019050818103600083015261535b8161531f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000819050919050565b60006153b66153b16153ac84615391565b61457f565b61431b565b9050919050565b6153c68161539b565b82525050565b600060a0820190506153e160008301886145f9565b6153ee60208301876153bd565b81810360408301526154008186614868565b905061540f60608301856147de565b61541c60808301846145f9565b9695505050505050565b7f496e6465782069732067726561746572207468616e206172726179206c656e6760008201527f7468000000000000000000000000000000000000000000000000000000000000602082015250565b60006154826022836143d7565b915061548d82615426565b604082019050919050565b600060208201905081810360008301526154b181615475565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006155436025836143d7565b915061554e826154e7565b604082019050919050565b6000602082019050818103600083015261557281615536565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006155d56023836143d7565b91506155e082615579565b604082019050919050565b60006020820190508181036000830152615604816155c8565b9050919050565b600060408201905061562060008301856145f9565b61562d60208301846145f9565b939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a2bbea0d72d99c1190b89986a2f91ef540de2f137901a201e830a56f28e0709d64736f6c63430008110033

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.