ETH Price: $3,415.06 (-0.29%)

Token

Magix (MAGX)
 

Overview

Max Total Supply

999,926.403223893 MAGX

Holders

383

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
4.395285702 MAGX

Value
$0.00
0xA14964479Ebf9cD336011ad80652b08CD83dFE3A
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:
Magix

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion
File 1 of 7 : Magix.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0;

import "@openzeppelin/contracts/GSN/Context.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import {IUniswapV2Router02, IUniswapV2Factory} from "./Interfaces.sol";

/**
 *
 * ███╗   ███╗ █████╗  ██████╗ ██╗██╗  ██╗
 * ████╗ ████║██╔══██╗██╔════╝ ██║╚██╗██╔╝
 * ██╔████╔██║███████║██║  ███╗██║ ╚███╔╝
 * ██║╚██╔╝██║██╔══██║██║   ██║██║ ██╔██╗
 * ██║ ╚═╝ ██║██║  ██║╚██████╔╝██║██╔╝ ██╗
 * ╚═╝     ╚═╝╚═╝  ╚═╝ ╚═════╝ ╚═╝╚═╝  ╚═╝
 *
 * TRI fork with a sprinkle of magic.
 * Supports:
 *  - Auto passive yield thanks to RFI mechanics
 *  - Auto liquidity generation from each tx
 *  - Magic re-balancer creating buy pressure by burning tokens and re-balancing liquidity
 */
contract Magix is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    string private _name = "Magix";
    string private _symbol = "MAGX";
    uint8 private _decimals = 9;

    uint256 private constant MAX = ~uint256(0);
    uint256 internal _tTotal = 1_000_000e9;
    uint256 internal _rTotal = (MAX - (MAX % _tTotal));

    mapping(address => uint256) internal _rOwned;
    mapping(address => uint256) internal _tOwned;
    mapping(address => mapping(address => uint256)) internal _allowances;

    mapping(address => bool) internal _noFee;
    mapping(address => bool) internal _isExcluded;
    address[] internal _excluded;

    // The tax fee contains two decimal places so 250 = 2.5%
    uint256 public _feeDecimal = 2;
    uint256 public _taxFee = 200;
    uint256 public _liquidityFee = 100;

    uint256 public taxFeeTotal;
    uint256 public liquidityFeeTotal;
    uint256 public burnFeeTotal;

    uint256 public liquidityAddedAt;
    bool public tradingEnabled = false;
    bool public swapAndLiquifyEnabled = true;
    bool private _inSwapAndLiquify;

    // Swapping fees to LP tokens
    uint256 public minTokensBeforeSwap = 500e9;
    uint256 public autoSwapCallerFee = 20e9;

    // Magic re-balancer to buy-back and burn tokens
    address public balancer;
    uint256 public lastRebalance;
    uint256 public rebalanceInterval = 30 minutes;
    uint256 public minTokensForMagic = 100e9;
    uint256 public rebalanceCallerFee = 400; // %
    uint256 public liquidityRemoveFee = 100; // %

    address constant uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    event RewardsDistributed(uint256 amount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapedTokenForEth(uint256 EthAmount, uint256 TokenAmount);
    event SwapedEthForTokens(uint256 EthAmount, uint256 TokenAmount, uint256 CallerReward, uint256 AmountBurned);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event Rebalance(uint256 tokenBurnt);
    event TradingEnabled();
    event TaxFeeUpdated(uint256 taxFee);
    event LockFeeUpdated(uint256 lockFee);
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event AutoSwapCallerFeeUpdated(uint256 autoSwapCallerFee);
    event LiquidityRemoveFeeUpdated(uint256 liquidityRemoveFee);
    event MagicCallerFeeUpdated(uint256 rebalnaceCallerFee);
    event MinTokenForMagicUpdated(uint256 minRebalanceAmount);
    event MagicIntervalUpdated(uint256 rebalanceInterval);

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

    constructor() public {
        uniswapV2Router = IUniswapV2Router02(uniswapRouter);
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());

        balancer = address(new Balancer());
        lastRebalance = block.timestamp;

        _noFee[_msgSender()] = true;
        _noFee[address(this)] = true;

        // Exclude uniswapV2Pair from taking rewards
        _isExcluded[uniswapV2Pair] = true;
        _excluded.push(uniswapV2Pair);

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

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

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

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

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

    function balanceOf(address account) public override view returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

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

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

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

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function reflectionFromToken(uint256 tokenAmount, bool deductTransferFee) public view returns (uint256) {
        require(tokenAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            return tokenAmount.mul(_getReflectionRate());
        } else {
            return tokenAmount
            .sub(tokenAmount.mul(_taxFee).div(10 ** _feeDecimal + 2))
            .mul(_getReflectionRate());
        }
    }

    function tokenFromReflection(uint256 reflectionAmount) public view returns (uint256) {
        require(reflectionAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate = _getReflectionRate();
        return reflectionAmount.div(currentRate);
    }

    function excludeAccount(address account) external onlyOwner() {
        require(account != uniswapRouter, "Magix: Uniswap router cannot be excluded.");
        require(account != address(this), 'Magix: The contract it self cannot be excluded');
        require(!_isExcluded[account], "Magix: Account is already excluded");

        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Magix: Account is already included");

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(tradingEnabled || sender == owner() || recipient == owner() ||
        _noFee[sender] || _noFee[recipient], "Trading is locked before presale.");

        // Anti-bot measures
        require(block.timestamp > liquidityAddedAt + 6 minutes || amount <= 20_000e9, "You cannot transfer more than 20000 tokens.");

        // Don't auto-swap tokens in any txs related to Uniswap to keep TX fees low and prevent circular calls
        if (swapAndLiquifyEnabled && !_inSwapAndLiquify && _msgSender() != uniswapV2Pair && _msgSender() != uniswapRouter && sender != uniswapV2Pair && sender != uniswapRouter) {
            uint256 lockedBalanceForPool = balanceOf(address(this));
            bool overMinTokenBalance = lockedBalanceForPool >= minTokensBeforeSwap;
            if (overMinTokenBalance) {
                swapAndLiquifyForEth(lockedBalanceForPool);
            }
        }

        // Transfer magic
        uint256 transferAmount = amount;
        uint256 rate = _getReflectionRate();

        if (!_noFee[sender] && !_noFee[recipient] && !_inSwapAndLiquify) {
            transferAmount = collectFee(sender, amount, rate);
        }

        _rOwned[sender] = _rOwned[sender].sub(amount.mul(rate));
        _rOwned[recipient] = _rOwned[recipient].add(transferAmount.mul(rate));

        if (_isExcluded[sender]) {
            _tOwned[sender] = _tOwned[sender].sub(amount);
        }
        if (_isExcluded[recipient]) {
            _tOwned[recipient] = _tOwned[recipient].add(transferAmount);
        }

        emit Transfer(sender, recipient, transferAmount);
    }

    function collectFee(address account, uint256 amount, uint256 rate) private returns (uint256) {
        uint256 transferAmount = amount;

        // Distribute reflection fee
        if (_taxFee != 0) {
            uint256 taxFee = amount.mul(_taxFee).div(10 ** (_feeDecimal + 2));
            transferAmount = transferAmount.sub(taxFee);
            _rTotal = _rTotal.sub(taxFee.mul(rate));
            taxFeeTotal = taxFeeTotal.add(taxFee);
            emit RewardsDistributed(taxFee);
        }

        // Collect liquidity fee
        if (_liquidityFee != 0) {
            uint256 liquidityFee = amount.mul(_liquidityFee).div(10 ** (_feeDecimal + 2));
            transferAmount = transferAmount.sub(liquidityFee);
            _rOwned[address(this)] = _rOwned[address(this)].add(liquidityFee.mul(rate));
            liquidityFeeTotal = liquidityFeeTotal.add(liquidityFee);
            emit Transfer(account, address(this), liquidityFee);
        }

        return transferAmount;
    }

    function _getReflectionRate() private view returns (uint256) {
        uint256 reflectionSupply = _rTotal;
        uint256 tokenSupply = _tTotal;

        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > reflectionSupply || _tOwned[_excluded[i]] > tokenSupply) {
                return _rTotal.div(_tTotal);
            }

            reflectionSupply = reflectionSupply.sub(_rOwned[_excluded[i]]);
            tokenSupply = tokenSupply.sub(_tOwned[_excluded[i]]);
        }

        if (reflectionSupply < _rTotal.div(_tTotal)) {
            return _rTotal.div(_tTotal);
        }
        return reflectionSupply.div(tokenSupply);
    }

    function swapAndLiquifyForEth(uint256 lockedBalanceForPool) private lockTheSwap {
        uint256 lockedForSwap = lockedBalanceForPool.sub(autoSwapCallerFee);
        uint256 half = lockedForSwap.div(2);
        uint256 otherHalf = lockedForSwap.sub(half);

        uint256 initialBalance = address(this).balance;

        swapTokensForEth(half);

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

        addLiquidityETH(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);

        _transfer(address(this), tx.origin, autoSwapCallerFee);
    }

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

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

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

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

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value : ethAmount}(
            0,
            path,
            address(balancer),
            block.timestamp
        );
    }

    function addLiquidityETH(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function removeLiquidityETH(uint256 lpAmount) private returns (uint ETHAmount) {
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), lpAmount);

        (ETHAmount) = uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            lpAmount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    function doTheMagic() public lockTheSwap {
        require(balanceOf(_msgSender()) >= minTokensForMagic, "Magix: First you have to obtain magic by owning 100 MAGIX");
        require(block.timestamp > lastRebalance + rebalanceInterval, 'Magix: Magic does not happen often, please wait');

        lastRebalance = block.timestamp;

        uint256 amountToRemove = IERC20(uniswapV2Pair).balanceOf(address(this)).mul(liquidityRemoveFee).div(10 ** (_feeDecimal + 2));
        if (amountToRemove == 0) {
            return;
        }
        uint256 initialBalance = address(this).balance;

        removeLiquidityETH(amountToRemove);
        uint256 receivedEth = address(this).balance.sub(initialBalance);

        swapEthForTokens(receivedEth);

        uint256 tNewTokenBalance = balanceOf(address(balancer));
        uint256 tRewardForCaller = tNewTokenBalance.mul(rebalanceCallerFee).div(10 ** (_feeDecimal + 2));
        uint256 tBurn = tNewTokenBalance.sub(tRewardForCaller);

        uint256 rate = _getReflectionRate();

        _rOwned[_msgSender()] = _rOwned[_msgSender()].add(tRewardForCaller.mul(rate));
        _rOwned[address(balancer)] = 0;

        // Just deduct the burn value instead of sending it to the burn address, we want to keep consistent Black Hole inflation rate
        burnFeeTotal = burnFeeTotal.add(tBurn);
        _tTotal = _tTotal.sub(tBurn);
        _rTotal = _rTotal.sub(tBurn.mul(rate));

        emit Transfer(address(balancer), _msgSender(), tRewardForCaller);
        emit Transfer(address(balancer), address(0), tBurn);
        emit Rebalance(tBurn);
    }

    function setExcludedFromFee(address account, bool excluded) public onlyOwner {
        _noFee[account] = excluded;
    }

    function setSwapAndLiquifyEnabled(bool enabled) public onlyOwner {
        swapAndLiquifyEnabled = enabled;
        emit SwapAndLiquifyEnabledUpdated(enabled);
    }

    function setTaxFee(uint256 taxFee) external onlyOwner {
        require(taxFee >= 0 && taxFee <= 5 * 10 ** _feeDecimal, 'Magix: taxFee should be in 0 - 5');
        _taxFee = taxFee;
        emit TaxFeeUpdated(taxFee);
    }

    function setLiquidityFee(uint256 fee) public onlyOwner {
        require(fee >= 0 && fee <= 5 * 10 ** _feeDecimal, 'Magix: lockFee should be in 0 - 5');
        _liquidityFee = fee;
        emit LockFeeUpdated(fee);
    }

    function setMinTokensBeforeSwap(uint256 amount) external onlyOwner() {
        require(amount >= 50e9 && amount <= 25000e9, 'Magix: minTokenBeforeSwap should be in 50e9 - 25000e9');
        require(amount > autoSwapCallerFee, 'Magix: minTokenBeforeSwap should be greater than autoSwapCallerFee');
        minTokensBeforeSwap = amount;
        emit MinTokensBeforeSwapUpdated(minTokensBeforeSwap);
    }

    function setAutoSwapCallerFee(uint256 fee) external onlyOwner() {
        require(fee >= 1e9, 'Magix: autoSwapCallerFee should be greater than 1e9');
        autoSwapCallerFee = fee;
        emit AutoSwapCallerFeeUpdated(autoSwapCallerFee);
    }

    function setLiquidityRemoveFee(uint256 fee) external onlyOwner() {
        require(fee >= 1 && fee <= 10 * 10 ** _feeDecimal, 'Magix: liquidityRemoveFee should be in 1 - 10');
        liquidityRemoveFee = fee;
        emit LiquidityRemoveFeeUpdated(liquidityRemoveFee);
    }

    function setMagicCallerFee(uint256 fee) external onlyOwner() {
        require(fee >= 1 && fee <= 15 * 10 ** _feeDecimal, 'Magix: magicCallerFee should be in 1 - 15');
        rebalanceCallerFee = fee;
        emit MagicCallerFeeUpdated(rebalanceCallerFee);
    }

    function setMagicInterval(uint256 interval) public onlyOwner() {
        rebalanceInterval = interval;
        emit MagicIntervalUpdated(rebalanceInterval);
    }

    function setMinTokenForAlchemy(uint256 amount) external onlyOwner() {
        minTokensForMagic = amount;
        emit MinTokenForMagicUpdated(minTokensForMagic);
    }

    function enableTrading() external onlyOwner() {
        liquidityAddedAt = block.timestamp;

        tradingEnabled = true;
        emit TradingEnabled();
    }

    receive() external payable {}
}

contract Balancer {
    constructor() public {
    }
}

File 2 of 7 : Interfaces.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0;

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

interface IUniswapV2Pair {
    function sync() external;
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

File 3 of 7 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        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 4 of 7 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../GSN/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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        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() public 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) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 5 of 7 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 6 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

File 7 of 7 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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);
            }
        }
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "istanbul",
  "libraries": {
    "": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "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":"uint256","name":"autoSwapCallerFee","type":"uint256"}],"name":"AutoSwapCallerFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRemoveFee","type":"uint256"}],"name":"LiquidityRemoveFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lockFee","type":"uint256"}],"name":"LockFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebalnaceCallerFee","type":"uint256"}],"name":"MagicCallerFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rebalanceInterval","type":"uint256"}],"name":"MagicIntervalUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minRebalanceAmount","type":"uint256"}],"name":"MinTokenForMagicUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","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":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"CallerReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AmountBurned","type":"uint256"}],"name":"SwapedEthForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"EthAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenAmount","type":"uint256"}],"name":"SwapedTokenForEth","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"TaxFeeUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_feeDecimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balancer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFeeTotal","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":"doTheMagic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityAddedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityRemoveFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokensForMagic","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":"rebalanceCallerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setAutoSwapCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setLiquidityRemoveFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMagicCallerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"setMagicInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokenForAlchemy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","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":"taxFeeTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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 IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600560808190526409ac2ced2f60db1b60a09081526200002891600191906200046c565b506040805180820190915260048082526309a828eb60e31b602090920191825262000056916002916200046c565b506003805460ff1916600917905566038d7ea4c68000600481905560001906196005556002600c5560c8600d556064600e8190556013805461ffff191661010017905564746a5288006014556404a817c80060155561070860185564174876e800601955610190601a55601b55348015620000d057600080fd5b506000620000dd62000468565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601c80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17908190556040805163c45a015560e01b815290516001600160a01b03929092169163c45a015591600480820192602092909190829003018186803b1580156200019357600080fd5b505afa158015620001a8573d6000803e3d6000fd5b505050506040513d6020811015620001bf57600080fd5b5051601c54604080516315ab88c960e31b815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b1580156200021257600080fd5b505afa15801562000227573d6000803e3d6000fd5b505050506040513d60208110156200023e57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200029157600080fd5b505af1158015620002a6573d6000803e3d6000fd5b505050506040513d6020811015620002bd57600080fd5b5051601d80546001600160a01b0319166001600160a01b03909216919091179055604051620002ec9062000501565b604051809103906000f08015801562000309573d6000803e3d6000fd5b50601680546001600160a01b0319166001600160a01b0392909216919091179055426017556001600960006200033e62000468565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260098452828120805486166001908117909155601d805484168352600a909552928120805490951683179094559154600b8054928301815584527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990910180546001600160a01b0319169190921617905560055490600690620003f162000468565b6001600160a01b031681526020810191909152604001600020556200041562000468565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6004546040518082815260200191505060405180910390a362000525565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620004a45760008555620004ef565b82601f10620004bf57805160ff1916838001178555620004ef565b82800160010185558215620004ef579182015b82811115620004ef578251825591602001919060010190620004d2565b50620004fd9291506200050e565b5090565b605c806200489f83390190565b5b80821115620004fd57600081556001016200050f565b61436a80620005356000396000f3fe60806040526004361061032d5760003560e01c80636ba5b8b8116101a55780639fed80ca116100ec578063cba0e99611610095578063e5d41c6b1161006f578063e5d41c6b14610a87578063f2cc0c1814610a9c578063f2fde38b14610adc578063f84354f114610b1c57610334565b8063cba0e996146109ea578063dd62ed3e14610a2a578063e563037e14610a7257610334565b8063a94917b1116100c6578063a94917b11461096a578063c4081a4c14610994578063c49b9a80146109be57610334565b80639fed80ca146108b4578063a457c2d7146108de578063a9059cbb1461092457610334565b8063887675d51161014e5780638da5cb5b116101285780638da5cb5b1461087557806390f75e561461088a57806395d89b411461089f57610334565b8063887675d51461080c5780638a8c523c146108365780638b4d0ef71461084b57610334565b806370a082311161017f57806370a08231146107a2578063715018a6146107e25780637444483e146107f757610334565b80636ba5b8b8146107635780636bc87c3a146107785780636eea27171461078d57610334565b8063313ce5671161027457806349bd5a5e1161021d5780634ccd8e5a116101f75780634ccd8e5a146106c75780634f080736146106dc5780636612e66f146107065780636a4fce601461074e57610334565b806349bd5a5e146106885780634a74bb021461069d5780634ada218b146106b257610334565b80633b124fe71161024e5780633b124fe7146106175780634549b0391461062c57806348a464731461065e57610334565b8063313ce5671461057a578063357bf15c146105a557806339509351146105d157610334565b806317519dae116102d65780631e6ee830116102b05780631e6ee830146104eb57806323b872dd146105005780632d8381191461055057610334565b806317519dae146104ac57806318160ddd146104c157806319db457d146104d657610334565b8063106b9ca111610307578063106b9ca1146104445780631694505e1461045957806316d1d9161461049757610334565b806304b645271461033957806306fdde0314610360578063095ea7b3146103ea57610334565b3661033457005b600080fd5b34801561034557600080fd5b5061034e610b5c565b60408051918252519081900360200190f35b34801561036c57600080fd5b50610375610b62565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506104306004803603604081101561040d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c16565b604080519115158252519081900360200190f35b34801561045057600080fd5b5061034e610c34565b34801561046557600080fd5b5061046e610c3a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104a357600080fd5b5061034e610c56565b3480156104b857600080fd5b5061034e610c5c565b3480156104cd57600080fd5b5061034e610c62565b3480156104e257600080fd5b5061034e610c68565b3480156104f757600080fd5b5061034e610c6e565b34801561050c57600080fd5b506104306004803603606081101561052357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c74565b34801561055c57600080fd5b5061034e6004803603602081101561057357600080fd5b5035610d15565b34801561058657600080fd5b5061058f610d91565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506105cf600480360360208110156105c857600080fd5b5035610d9a565b005b3480156105dd57600080fd5b50610430600480360360408110156105f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ec7565b34801561062357600080fd5b5061034e610f22565b34801561063857600080fd5b5061034e6004803603604081101561064f57600080fd5b50803590602001351515610f28565b34801561066a57600080fd5b506105cf6004803603602081101561068157600080fd5b5035610ffb565b34801561069457600080fd5b5061046e611191565b3480156106a957600080fd5b506104306111ad565b3480156106be57600080fd5b506104306111bb565b3480156106d357600080fd5b5061034e6111c4565b3480156106e857600080fd5b506105cf600480360360208110156106ff57600080fd5b50356111ca565b34801561071257600080fd5b506105cf6004803603604081101561072957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611304565b34801561075a57600080fd5b5061034e6113eb565b34801561076f57600080fd5b5061034e6113f1565b34801561078457600080fd5b5061034e6113f7565b34801561079957600080fd5b506105cf6113fd565b3480156107ae57600080fd5b5061034e600480360360208110156107c557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611825565b3480156107ee57600080fd5b506105cf6118ae565b34801561080357600080fd5b5061034e6119ae565b34801561081857600080fd5b506105cf6004803603602081101561082f57600080fd5b50356119b4565b34801561084257600080fd5b506105cf611a80565b34801561085757600080fd5b506105cf6004803603602081101561086e57600080fd5b5035611b6b565b34801561088157600080fd5b5061046e611c94565b34801561089657600080fd5b5061034e611cb0565b3480156108ab57600080fd5b50610375611cb6565b3480156108c057600080fd5b506105cf600480360360208110156108d757600080fd5b5035611d32565b3480156108ea57600080fd5b506104306004803603604081101561090157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e6c565b34801561093057600080fd5b506104306004803603604081101561094757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611ee1565b34801561097657600080fd5b506105cf6004803603602081101561098d57600080fd5b5035611ef5565b3480156109a057600080fd5b506105cf600480360360208110156109b757600080fd5b5035611fc1565b3480156109ca57600080fd5b506105cf600480360360208110156109e157600080fd5b50351515612104565b3480156109f657600080fd5b5061043060048036036020811015610a0d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612201565b348015610a3657600080fd5b5061034e60048036036040811015610a4d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661222c565b348015610a7e57600080fd5b5061046e612264565b348015610a9357600080fd5b5061034e612280565b348015610aa857600080fd5b506105cf60048036036020811015610abf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612286565b348015610ae857600080fd5b506105cf60048036036020811015610aff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125b2565b348015610b2857600080fd5b506105cf60048036036020811015610b3f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661273c565b60125481565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505090505b90565b6000610c2a610c23612a05565b8484612a09565b5060015b92915050565b60175481565b601c5473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b601b5481565b60045490565b600c5481565b600f5481565b6000610c81848484612b50565b610d0b84610c8d612a05565b610d068560405180606001604052806028815260200161421f6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812090610cd8612a05565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205491906131fe565b612a09565b5060019392505050565b6000600554821115610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614006602a913960400191505060405180910390fd5b6000610d7c6132af565b9050610d88838261345a565b9150505b919050565b60035460ff1690565b610da2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610e2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a600502811115610e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141a46021913960400191505060405180910390fd5b600e8190556040805182815290517fc9c3eda55e0c1d7fbf155eefd9be0dcbb00e86498e4a8c8efb530e71d390b9ad9181900360200190a150565b6000610c2a610ed4612a05565b84610d068560086000610ee5612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906134a3565b600d5481565b6000600454831115610f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610fb957610fb2610fab6132af565b8490613517565b9050610c2e565b610fb2610fc46132af565b610ff5610fee600c54600a0a600201610fe8600d548961351790919063ffffffff16565b9061345a565b869061358a565b90613517565b611003612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461108c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b640ba43b740081101580156110a757506516bcc41e90008111155b6110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140c76035913960400191505060405180910390fd5b6015548111611156576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613f506042913960600191505060405180910390fd5b60148190556040805182815290517f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009181900360200190a150565b601d5473ffffffffffffffffffffffffffffffffffffffff1681565b601354610100900460ff1681565b60135460ff1681565b60115481565b6111d2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461125b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600181101580156112745750600c54600a0a600f028111155b6112c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061430c6029913960400191505060405180910390fd5b601a8190556040805182815290517f9765f75ab2b13d6c29b74cc52404cbfe9c6485274d6b86a869014f52993ac24e9181900360200190a150565b61130c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461139557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60195481565b60105481565b600e5481565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560195461143d611438612a05565b611825565b1015611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806141e66039913960400191505060405180910390fd5b6018546017540142116114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fd7602f913960400191505060405180910390fd5b42601755600c54601b54601d54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000946115b4946002909101600a0a93610fe893919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d60208110156115ac57600080fd5b505190613517565b9050806115c157506117fb565b476115cb826135cc565b5060006115d8478361358a565b90506115e381613747565b6016546000906116089073ffffffffffffffffffffffffffffffffffffffff16611825565b9050600061162d600c54600201600a0a610fe8601a548561351790919063ffffffff16565b9050600061163b838361358a565b905060006116476132af565b905061168f6116568483613517565b60066000611662612a05565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906134a3565b6006600061169b612a05565b73ffffffffffffffffffffffffffffffffffffffff9081168252602080830193909352604091820160009081209490945560165416835260069091528120556011546116e790836134a3565b6011556004546116f7908361358a565b6004556117106117078383613517565b6005549061358a565b60055561171b612a05565b60165460408051868152905173ffffffffffffffffffffffffffffffffffffffff9384169392909216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360165460408051848152905160009273ffffffffffffffffffffffffffffffffffffffff16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a36040805183815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09181900360200190a1505050505050505b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff169055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604081205460ff161561187f575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902054610d8c565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054610c2e90610d15565b6118b6612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461193f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b601a5481565b6119bc612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611a4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60198190556040805182815290517f8374a3bea33ded453e957fa7e2b11170872937507d72670d3b848ad4bd98f9e19181900360200190a150565b611a88612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b42601255601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b611b73612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611bfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b633b9aca00811015611c59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141256033913960400191505060405180910390fd5b60158190556040805182815290517f74272e6f6c75e19c6f48bb75e2724eb55e3e1726f8b81d97f1db21d22ead93dc9181900360200190a150565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60155481565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b611d3a612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60018110158015611ddc5750600c54600a0a600a028111155b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061409a602d913960400191505060405180910390fd5b601b8190556040805182815290517f5be5e13332f5fe25d72958c9d03ce5cdb01b189670222a86673715d56e43ce2a9181900360200190a150565b6000610c2a611e79612a05565b84610d06856040518060600160405280602581526020016142e76025913960086000611ea3612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d168152925290205491906131fe565b6000610c2a611eee612a05565b8484612b50565b611efd612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611f8657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60188190556040805182815290517f8b06935304277197be5d3ccc7b672a23adfc30c675f1078e336b6204843020239181900360200190a150565b611fc9612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461205257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a6005028111156120c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d616769783a207461784665652073686f756c6420626520696e2030202d2035604482015290519081900360640190fd5b600d8190556040805182815290517faa4b71ac29531fdea0ef1650c76ef91e3771dac25f4a4dd2a561ff3e0b9a5de29181900360200190a150565b61210c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461219557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6013805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205490565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b61228e612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116737a250d5630b4cf539739df2c5dacb4c659f2488d141561239a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140fc6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116301415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806142b9602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1615612488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140786022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260066020526040902054156125095773ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409020546124e290610d15565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6125ba612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461264357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140306026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612744612a05565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146127cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1661284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613fb56022913960400191505060405180910390fd5b60005b600b54811015612a01578173ffffffffffffffffffffffffffffffffffffffff16600b828154811061287c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156129f957600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128d457fe5b600091825260209091200154600b805473ffffffffffffffffffffffffffffffffffffffff909216918390811061290757fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600782526040808220829055600a9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600b80548061299c57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612a01565b60010161284e565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806142956024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140566022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612bbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142706025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613f926023913960400191505060405180910390fd5b60008111612c81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806142476029913960400191505060405180910390fd5b60135460ff1680612cc45750612c95611c94565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612d015750612cd2611c94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d31575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b80612d61575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff165b612db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141836021913960400191505060405180910390fd5b60125461016801421180612dd057506512309ce540008111155b612e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614158602b913960400191505060405180910390fd5b601354610100900460ff168015612e45575060135462010000900460ff16155b8015612e865750601d5473ffffffffffffffffffffffffffffffffffffffff16612e6d612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612ec35750737a250d5630b4cf539739df2c5dacb4c659f2488d612eaa612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612eea5750601d5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612f20575073ffffffffffffffffffffffffffffffffffffffff8316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15612f4b576000612f3030611825565b6014549091508110801590612f4857612f4882613956565b50505b806000612f566132af565b73ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205490915060ff16158015612fb5575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612fca575060135462010000900460ff16155b15612fdd57612fda858483613a52565b91505b613016612fea8483613517565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600660205260409020549061358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600660205260409020556130756130498383613517565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260066020526040902054906134a3565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600660209081526040808320949094559188168152600a909152205460ff161561310d5773ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020546130e6908461358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16156131925773ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205461316b90836134a3565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b600081848411156132a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561326c578181015183820152602001613254565b50505050905090810190601f1680156132995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60055460045460009190825b600b5481101561341a578260066000600b84815481106132d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061335657508160076000600b848154811061332257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156133745760045460055461336a9161345a565b9350505050610c13565b6133c160066000600b848154811061338857fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061358a565b925061341060076000600b84815481106133d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061358a565b91506001016132bb565b5060045460055461342a9161345a565b821015613449576004546005546134409161345a565b92505050610c13565b613453828261345a565b9250505090565b600061349c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bb8565b9392505050565b60008282018381101561349c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261352657506000610c2e565b8282028284828161353357fe5b041461349c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141c56021913960400191505060405180910390fd5b600061349c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131fe565b601d54601c54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561364e57600080fd5b505af1158015613662573d6000803e3d6000fd5b505050506040513d602081101561367857600080fd5b5050601c54604080517faf2979eb0000000000000000000000000000000000000000000000000000000081523060048201819052602482018690526000604483018190526064830181905260848301919091524260a4830152915173ffffffffffffffffffffffffffffffffffffffff9093169263af2979eb9260c480840193602093929083900390910190829087803b15801561371557600080fd5b505af1158015613729573d6000803e3d6000fd5b505050506040513d602081101561373f57600080fd5b505192915050565b6040805160028082526060820183526000926020830190803683375050601c54604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156137d257600080fd5b505afa1580156137e6573d6000803e3d6000fd5b505050506040513d60208110156137fc57600080fd5b50518151829060009061380b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061385357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c546016546040517fb6f9de95000000000000000000000000000000000000000000000000000000008152600060048201818152928616604483018190524260648401819052608060248501908152895160848601528951969098169763b6f9de95978b9794968b9694959394909360a49091019187810191028083838b5b838110156139125781810151838201526020016138fa565b50505050905001955050505050506000604051808303818588803b15801561393957600080fd5b505af115801561394d573d6000803e3d6000fd5b50505050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560155460009061399490839061358a565b905060006139a382600261345a565b905060006139b1838361358a565b9050476139bd83613c37565b60006139c9478361358a565b90506139d58382613e64565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1613a223032601554612b50565b5050601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905550505050565b600d54600090839015613ae5576000613a82600c54600201600a0a610fe8600d548861351790919063ffffffff16565b9050613a8e828261358a565b9150613a9d6117078286613517565b600555600f54613aad90826134a3565b600f556040805182815290517f6d1c76d614228b523baa4dcd9539e2c713b54ff4ab3ff2d1627e7f6cd32be4429181900360200190a1505b600e5415613bb0576000613b10600c54600201600a0a610fe8600e548861351790919063ffffffff16565b9050613b1c828261358a565b9150613b41613b2b8286613517565b30600090815260066020526040902054906134a3565b30600090815260066020526040902055601054613b5e90826134a3565b601055604080518281529051309173ffffffffffffffffffffffffffffffffffffffff8916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505b949350505050565b60008183613c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561326c578181015183820152602001613254565b506000838581613c2d57fe5b0495945050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110613c9357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b5051815182906001908110613d4857fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152601c54613d7b9130911684612a09565b601c546040517f791ac947000000000000000000000000000000000000000000000000000000008152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a4870152875173ffffffffffffffffffffffffffffffffffffffff9097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015613e27578181015183820152602001613e0f565b505050509050019650505050505050600060405180830381600087803b158015613e5057600080fd5b505af1158015613a22573d6000803e3d6000fd5b601c54613e8990309073ffffffffffffffffffffffffffffffffffffffff1684612a09565b601c54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b158015613f1e57600080fd5b505af1158015613f32573d6000803e3d6000fd5b50505050506040513d6060811015613f4957600080fd5b5050505056fe4d616769783a206d696e546f6b656e4265666f7265537761702073686f756c642062652067726561746572207468616e206175746f5377617043616c6c657246656545524332303a207472616e7366657220746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c726561647920696e636c756465644d616769783a204d6167696320646f6573206e6f742068617070656e206f6674656e2c20706c656173652077616974416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c7265616479206578636c756465644d616769783a206c697175696469747952656d6f76654665652073686f756c6420626520696e2031202d2031304d616769783a206d696e546f6b656e4265666f7265537761702073686f756c6420626520696e2035306539202d20323530303065394d616769783a20556e697377617020726f757465722063616e6e6f74206265206578636c756465642e4d616769783a206175746f5377617043616c6c65724665652073686f756c642062652067726561746572207468616e20316539596f752063616e6e6f74207472616e73666572206d6f7265207468616e20323030303020746f6b656e732e54726164696e67206973206c6f636b6564206265666f72652070726573616c652e4d616769783a206c6f636b4665652073686f756c6420626520696e2030202d2035536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d616769783a20466972737420796f75206861766520746f206f627461696e206d61676963206279206f776e696e6720313030204d4147495845524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d616769783a2054686520636f6e74726163742069742073656c662063616e6e6f74206265206578636c7564656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4d616769783a206d6167696343616c6c65724665652073686f756c6420626520696e2031202d203135a264697066735822122040901b1e96f3d70d02ba0896570d55ea7b62de348417763890759b6c7d5cd4f464736f6c634300070600336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212209e3f4c8bfeb5b36140f7ab1ef371186a37c230fc19e47e5a8cb8a3ade91c4a6c64736f6c63430007060033

Deployed Bytecode

0x60806040526004361061032d5760003560e01c80636ba5b8b8116101a55780639fed80ca116100ec578063cba0e99611610095578063e5d41c6b1161006f578063e5d41c6b14610a87578063f2cc0c1814610a9c578063f2fde38b14610adc578063f84354f114610b1c57610334565b8063cba0e996146109ea578063dd62ed3e14610a2a578063e563037e14610a7257610334565b8063a94917b1116100c6578063a94917b11461096a578063c4081a4c14610994578063c49b9a80146109be57610334565b80639fed80ca146108b4578063a457c2d7146108de578063a9059cbb1461092457610334565b8063887675d51161014e5780638da5cb5b116101285780638da5cb5b1461087557806390f75e561461088a57806395d89b411461089f57610334565b8063887675d51461080c5780638a8c523c146108365780638b4d0ef71461084b57610334565b806370a082311161017f57806370a08231146107a2578063715018a6146107e25780637444483e146107f757610334565b80636ba5b8b8146107635780636bc87c3a146107785780636eea27171461078d57610334565b8063313ce5671161027457806349bd5a5e1161021d5780634ccd8e5a116101f75780634ccd8e5a146106c75780634f080736146106dc5780636612e66f146107065780636a4fce601461074e57610334565b806349bd5a5e146106885780634a74bb021461069d5780634ada218b146106b257610334565b80633b124fe71161024e5780633b124fe7146106175780634549b0391461062c57806348a464731461065e57610334565b8063313ce5671461057a578063357bf15c146105a557806339509351146105d157610334565b806317519dae116102d65780631e6ee830116102b05780631e6ee830146104eb57806323b872dd146105005780632d8381191461055057610334565b806317519dae146104ac57806318160ddd146104c157806319db457d146104d657610334565b8063106b9ca111610307578063106b9ca1146104445780631694505e1461045957806316d1d9161461049757610334565b806304b645271461033957806306fdde0314610360578063095ea7b3146103ea57610334565b3661033457005b600080fd5b34801561034557600080fd5b5061034e610b5c565b60408051918252519081900360200190f35b34801561036c57600080fd5b50610375610b62565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103af578181015183820152602001610397565b50505050905090810190601f1680156103dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f657600080fd5b506104306004803603604081101561040d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c16565b604080519115158252519081900360200190f35b34801561045057600080fd5b5061034e610c34565b34801561046557600080fd5b5061046e610c3a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104a357600080fd5b5061034e610c56565b3480156104b857600080fd5b5061034e610c5c565b3480156104cd57600080fd5b5061034e610c62565b3480156104e257600080fd5b5061034e610c68565b3480156104f757600080fd5b5061034e610c6e565b34801561050c57600080fd5b506104306004803603606081101561052357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610c74565b34801561055c57600080fd5b5061034e6004803603602081101561057357600080fd5b5035610d15565b34801561058657600080fd5b5061058f610d91565b6040805160ff9092168252519081900360200190f35b3480156105b157600080fd5b506105cf600480360360208110156105c857600080fd5b5035610d9a565b005b3480156105dd57600080fd5b50610430600480360360408110156105f457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ec7565b34801561062357600080fd5b5061034e610f22565b34801561063857600080fd5b5061034e6004803603604081101561064f57600080fd5b50803590602001351515610f28565b34801561066a57600080fd5b506105cf6004803603602081101561068157600080fd5b5035610ffb565b34801561069457600080fd5b5061046e611191565b3480156106a957600080fd5b506104306111ad565b3480156106be57600080fd5b506104306111bb565b3480156106d357600080fd5b5061034e6111c4565b3480156106e857600080fd5b506105cf600480360360208110156106ff57600080fd5b50356111ca565b34801561071257600080fd5b506105cf6004803603604081101561072957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515611304565b34801561075a57600080fd5b5061034e6113eb565b34801561076f57600080fd5b5061034e6113f1565b34801561078457600080fd5b5061034e6113f7565b34801561079957600080fd5b506105cf6113fd565b3480156107ae57600080fd5b5061034e600480360360208110156107c557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611825565b3480156107ee57600080fd5b506105cf6118ae565b34801561080357600080fd5b5061034e6119ae565b34801561081857600080fd5b506105cf6004803603602081101561082f57600080fd5b50356119b4565b34801561084257600080fd5b506105cf611a80565b34801561085757600080fd5b506105cf6004803603602081101561086e57600080fd5b5035611b6b565b34801561088157600080fd5b5061046e611c94565b34801561089657600080fd5b5061034e611cb0565b3480156108ab57600080fd5b50610375611cb6565b3480156108c057600080fd5b506105cf600480360360208110156108d757600080fd5b5035611d32565b3480156108ea57600080fd5b506104306004803603604081101561090157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e6c565b34801561093057600080fd5b506104306004803603604081101561094757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611ee1565b34801561097657600080fd5b506105cf6004803603602081101561098d57600080fd5b5035611ef5565b3480156109a057600080fd5b506105cf600480360360208110156109b757600080fd5b5035611fc1565b3480156109ca57600080fd5b506105cf600480360360208110156109e157600080fd5b50351515612104565b3480156109f657600080fd5b5061043060048036036020811015610a0d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612201565b348015610a3657600080fd5b5061034e60048036036040811015610a4d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661222c565b348015610a7e57600080fd5b5061046e612264565b348015610a9357600080fd5b5061034e612280565b348015610aa857600080fd5b506105cf60048036036020811015610abf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612286565b348015610ae857600080fd5b506105cf60048036036020811015610aff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125b2565b348015610b2857600080fd5b506105cf60048036036020811015610b3f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661273c565b60125481565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b820191906000526020600020905b815481529060010190602001808311610bee57829003601f168201915b505050505090505b90565b6000610c2a610c23612a05565b8484612a09565b5060015b92915050565b60175481565b601c5473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b601b5481565b60045490565b600c5481565b600f5481565b6000610c81848484612b50565b610d0b84610c8d612a05565b610d068560405180606001604052806028815260200161421f6028913973ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812090610cd8612a05565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205491906131fe565b612a09565b5060019392505050565b6000600554821115610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614006602a913960400191505060405180910390fd5b6000610d7c6132af565b9050610d88838261345a565b9150505b919050565b60035460ff1690565b610da2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610e2b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a600502811115610e8c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141a46021913960400191505060405180910390fd5b600e8190556040805182815290517fc9c3eda55e0c1d7fbf155eefd9be0dcbb00e86498e4a8c8efb530e71d390b9ad9181900360200190a150565b6000610c2a610ed4612a05565b84610d068560086000610ee5612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c1681529252902054906134a3565b600d5481565b6000600454831115610f9b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610fb957610fb2610fab6132af565b8490613517565b9050610c2e565b610fb2610fc46132af565b610ff5610fee600c54600a0a600201610fe8600d548961351790919063ffffffff16565b9061345a565b869061358a565b90613517565b611003612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461108c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b640ba43b740081101580156110a757506516bcc41e90008111155b6110fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806140c76035913960400191505060405180910390fd5b6015548111611156576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526042815260200180613f506042913960600191505060405180910390fd5b60148190556040805182815290517f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009181900360200190a150565b601d5473ffffffffffffffffffffffffffffffffffffffff1681565b601354610100900460ff1681565b60135460ff1681565b60115481565b6111d2612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461125b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600181101580156112745750600c54600a0a600f028111155b6112c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061430c6029913960400191505060405180910390fd5b601a8190556040805182815290517f9765f75ab2b13d6c29b74cc52404cbfe9c6485274d6b86a869014f52993ac24e9181900360200190a150565b61130c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461139557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60195481565b60105481565b600e5481565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560195461143d611438612a05565b611825565b1015611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260398152602001806141e66039913960400191505060405180910390fd5b6018546017540142116114f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613fd7602f913960400191505060405180910390fd5b42601755600c54601b54601d54604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000946115b4946002909101600a0a93610fe893919273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561158257600080fd5b505afa158015611596573d6000803e3d6000fd5b505050506040513d60208110156115ac57600080fd5b505190613517565b9050806115c157506117fb565b476115cb826135cc565b5060006115d8478361358a565b90506115e381613747565b6016546000906116089073ffffffffffffffffffffffffffffffffffffffff16611825565b9050600061162d600c54600201600a0a610fe8601a548561351790919063ffffffff16565b9050600061163b838361358a565b905060006116476132af565b905061168f6116568483613517565b60066000611662612a05565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002054906134a3565b6006600061169b612a05565b73ffffffffffffffffffffffffffffffffffffffff9081168252602080830193909352604091820160009081209490945560165416835260069091528120556011546116e790836134a3565b6011556004546116f7908361358a565b6004556117106117078383613517565b6005549061358a565b60055561171b612a05565b60165460408051868152905173ffffffffffffffffffffffffffffffffffffffff9384169392909216917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a360165460408051848152905160009273ffffffffffffffffffffffffffffffffffffffff16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a36040805183815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09181900360200190a1505050505050505b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff169055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604081205460ff161561187f575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020526040902054610d8c565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054610c2e90610d15565b6118b6612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461193f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b601a5481565b6119bc612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611a4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60198190556040805182815290517f8374a3bea33ded453e957fa7e2b11170872937507d72670d3b848ad4bd98f9e19181900360200190a150565b611a88612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611b1157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b42601255601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b611b73612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611bfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b633b9aca00811015611c59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806141256033913960400191505060405180910390fd5b60158190556040805182815290517f74272e6f6c75e19c6f48bb75e2724eb55e3e1726f8b81d97f1db21d22ead93dc9181900360200190a150565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60155481565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610c0b5780601f10610be057610100808354040283529160200191610c0b565b611d3a612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611dc357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60018110158015611ddc5750600c54600a0a600a028111155b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061409a602d913960400191505060405180910390fd5b601b8190556040805182815290517f5be5e13332f5fe25d72958c9d03ce5cdb01b189670222a86673715d56e43ce2a9181900360200190a150565b6000610c2a611e79612a05565b84610d06856040518060600160405280602581526020016142e76025913960086000611ea3612a05565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d168152925290205491906131fe565b6000610c2a611eee612a05565b8484612b50565b611efd612a05565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614611f8657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60188190556040805182815290517f8b06935304277197be5d3ccc7b672a23adfc30c675f1078e336b6204843020239181900360200190a150565b611fc9612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461205257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600c54600a0a6005028111156120c957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4d616769783a207461784665652073686f756c6420626520696e2030202d2035604482015290519081900360640190fd5b600d8190556040805182815290517faa4b71ac29531fdea0ef1650c76ef91e3771dac25f4a4dd2a561ff3e0b9a5de29181900360200190a150565b61210c612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461219557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6013805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599181900360200190a150565b73ffffffffffffffffffffffffffffffffffffffff166000908152600a602052604090205460ff1690565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260086020908152604080832093909416825291909152205490565b60165473ffffffffffffffffffffffffffffffffffffffff1681565b60145481565b61228e612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116737a250d5630b4cf539739df2c5dacb4c659f2488d141561239a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140fc6029913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116301415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806142b9602e913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1615612488576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140786022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260066020526040902054156125095773ffffffffffffffffffffffffffffffffffffffff81166000908152600660205260409020546124e290610d15565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff166000818152600a6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b6125ba612a05565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461264357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166126af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140306026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612744612a05565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146127cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a602052604090205460ff1661284b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613fb56022913960400191505060405180910390fd5b60005b600b54811015612a01578173ffffffffffffffffffffffffffffffffffffffff16600b828154811061287c57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156129f957600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106128d457fe5b600091825260209091200154600b805473ffffffffffffffffffffffffffffffffffffffff909216918390811061290757fe5b600091825260208083209190910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9485161790559184168152600782526040808220829055600a9092522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600b80548061299c57fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612a01565b60010161284e565b5050565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316612a75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806142956024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612ae1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140566022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316612bbc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806142706025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216612c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613f926023913960400191505060405180910390fd5b60008111612c81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806142476029913960400191505060405180910390fd5b60135460ff1680612cc45750612c95611c94565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612d015750612cd2611c94565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d31575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b80612d61575073ffffffffffffffffffffffffffffffffffffffff821660009081526009602052604090205460ff165b612db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141836021913960400191505060405180910390fd5b60125461016801421180612dd057506512309ce540008111155b612e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614158602b913960400191505060405180910390fd5b601354610100900460ff168015612e45575060135462010000900460ff16155b8015612e865750601d5473ffffffffffffffffffffffffffffffffffffffff16612e6d612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612ec35750737a250d5630b4cf539739df2c5dacb4c659f2488d612eaa612a05565b73ffffffffffffffffffffffffffffffffffffffff1614155b8015612eea5750601d5473ffffffffffffffffffffffffffffffffffffffff848116911614155b8015612f20575073ffffffffffffffffffffffffffffffffffffffff8316737a250d5630b4cf539739df2c5dacb4c659f2488d14155b15612f4b576000612f3030611825565b6014549091508110801590612f4857612f4882613956565b50505b806000612f566132af565b73ffffffffffffffffffffffffffffffffffffffff861660009081526009602052604090205490915060ff16158015612fb5575073ffffffffffffffffffffffffffffffffffffffff841660009081526009602052604090205460ff16155b8015612fca575060135462010000900460ff16155b15612fdd57612fda858483613a52565b91505b613016612fea8483613517565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600660205260409020549061358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600660205260409020556130756130498383613517565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260066020526040902054906134a3565b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600660209081526040808320949094559188168152600a909152205460ff161561310d5773ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020546130e6908461358a565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600760205260409020555b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16156131925773ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205461316b90836134a3565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600760205260409020555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35050505050565b600081848411156132a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561326c578181015183820152602001613254565b50505050905090810190601f1680156132995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60055460045460009190825b600b5481101561341a578260066000600b84815481106132d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054118061335657508160076000600b848154811061332257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b156133745760045460055461336a9161345a565b9350505050610c13565b6133c160066000600b848154811061338857fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054849061358a565b925061341060076000600b84815481106133d757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054839061358a565b91506001016132bb565b5060045460055461342a9161345a565b821015613449576004546005546134409161345a565b92505050610c13565b613453828261345a565b9250505090565b600061349c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613bb8565b9392505050565b60008282018381101561349c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261352657506000610c2e565b8282028284828161353357fe5b041461349c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141c56021913960400191505060405180910390fd5b600061349c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506131fe565b601d54601c54604080517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283166004820152602481018590529051600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561364e57600080fd5b505af1158015613662573d6000803e3d6000fd5b505050506040513d602081101561367857600080fd5b5050601c54604080517faf2979eb0000000000000000000000000000000000000000000000000000000081523060048201819052602482018690526000604483018190526064830181905260848301919091524260a4830152915173ffffffffffffffffffffffffffffffffffffffff9093169263af2979eb9260c480840193602093929083900390910190829087803b15801561371557600080fd5b505af1158015613729573d6000803e3d6000fd5b505050506040513d602081101561373f57600080fd5b505192915050565b6040805160028082526060820183526000926020830190803683375050601c54604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905193945073ffffffffffffffffffffffffffffffffffffffff9091169263ad5c464892506004808301926020929190829003018186803b1580156137d257600080fd5b505afa1580156137e6573d6000803e3d6000fd5b505050506040513d60208110156137fc57600080fd5b50518151829060009061380b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050308160018151811061385357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c546016546040517fb6f9de95000000000000000000000000000000000000000000000000000000008152600060048201818152928616604483018190524260648401819052608060248501908152895160848601528951969098169763b6f9de95978b9794968b9694959394909360a49091019187810191028083838b5b838110156139125781810151838201526020016138fa565b50505050905001955050505050506000604051808303818588803b15801561393957600080fd5b505af115801561394d573d6000803e3d6000fd5b50505050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000017905560155460009061399490839061358a565b905060006139a382600261345a565b905060006139b1838361358a565b9050476139bd83613c37565b60006139c9478361358a565b90506139d58382613e64565b604080518581526020810183905280820185905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1613a223032601554612b50565b5050601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16905550505050565b600d54600090839015613ae5576000613a82600c54600201600a0a610fe8600d548861351790919063ffffffff16565b9050613a8e828261358a565b9150613a9d6117078286613517565b600555600f54613aad90826134a3565b600f556040805182815290517f6d1c76d614228b523baa4dcd9539e2c713b54ff4ab3ff2d1627e7f6cd32be4429181900360200190a1505b600e5415613bb0576000613b10600c54600201600a0a610fe8600e548861351790919063ffffffff16565b9050613b1c828261358a565b9150613b41613b2b8286613517565b30600090815260066020526040902054906134a3565b30600090815260066020526040902055601054613b5e90826134a3565b601055604080518281529051309173ffffffffffffffffffffffffffffffffffffffff8916917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505b949350505050565b60008183613c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561326c578181015183820152602001613254565b506000838581613c2d57fe5b0495945050505050565b601380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790556040805160028082526060820183526000926020830190803683370190505090503081600081518110613c9357fe5b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152601c54604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c4648926004808301939192829003018186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d6020811015613d3757600080fd5b5051815182906001908110613d4857fe5b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152601c54613d7b9130911684612a09565b601c546040517f791ac947000000000000000000000000000000000000000000000000000000008152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a4870152875173ffffffffffffffffffffffffffffffffffffffff9097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b83811015613e27578181015183820152602001613e0f565b505050509050019650505050505050600060405180830381600087803b158015613e5057600080fd5b505af1158015613a22573d6000803e3d6000fd5b601c54613e8990309073ffffffffffffffffffffffffffffffffffffffff1684612a09565b601c54604080517ff305d719000000000000000000000000000000000000000000000000000000008152306004820181905260248201869052600060448301819052606483015260848201524260a4820152905173ffffffffffffffffffffffffffffffffffffffff9092169163f305d71991849160c480830192606092919082900301818588803b158015613f1e57600080fd5b505af1158015613f32573d6000803e3d6000fd5b50505050506040513d6060811015613f4957600080fd5b5050505056fe4d616769783a206d696e546f6b656e4265666f7265537761702073686f756c642062652067726561746572207468616e206175746f5377617043616c6c657246656545524332303a207472616e7366657220746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c726561647920696e636c756465644d616769783a204d6167696320646f6573206e6f742068617070656e206f6674656e2c20706c656173652077616974416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734d616769783a204163636f756e7420697320616c7265616479206578636c756465644d616769783a206c697175696469747952656d6f76654665652073686f756c6420626520696e2031202d2031304d616769783a206d696e546f6b656e4265666f7265537761702073686f756c6420626520696e2035306539202d20323530303065394d616769783a20556e697377617020726f757465722063616e6e6f74206265206578636c756465642e4d616769783a206175746f5377617043616c6c65724665652073686f756c642062652067726561746572207468616e20316539596f752063616e6e6f74207472616e73666572206d6f7265207468616e20323030303020746f6b656e732e54726164696e67206973206c6f636b6564206265666f72652070726573616c652e4d616769783a206c6f636b4665652073686f756c6420626520696e2030202d2035536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774d616769783a20466972737420796f75206861766520746f206f627461696e206d61676963206279206f776e696e6720313030204d4147495845524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734d616769783a2054686520636f6e74726163742069742073656c662063616e6e6f74206265206578636c7564656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4d616769783a206d6167696343616c6c65724665652073686f756c6420626520696e2031202d203135a264697066735822122040901b1e96f3d70d02ba0896570d55ea7b62de348417763890759b6c7d5cd4f464736f6c63430007060033

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.