false
false
0

Contract Address Details

0x72353c66003993433B1a4882880Ae656b2F6BaA6

Token
DeFiTitans (TITANS)
Creator
0x281c67–5f18ae at 0x76bdfd–a7aa31
Balance
0 METIS ( )
Tokens
Fetching tokens...
Transactions
24 Transactions
Transfers
42 Transfers
Gas Used
975,267
Last Balance Update
13663612
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DeFiTitans




Optimization enabled
true
Compiler version
v0.8.0+commit.c7dfd78e




Optimization runs
200
EVM Version
default




Verified at
2022-04-13T18:14:05.223420Z

Contract source code

// SPDX-License-Identifier: MIT

/**

Introducing the DeFi Titans on Metis. Contract rewards in Tethys.


*/

pragma solidity ^0.8.0;

/**
 * SAFEMATH LIBRARY
 */

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if(a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

}  

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;// excluded dividend
        uint256 totalRealised;
    }

    IERC20 EP = IERC20(0x69fdb77064ec5c84FA2F21072973eB28441F43F3); //Tethys
    address WETH = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;
    IUniswapV2Router02 router;

    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;// to be used in the dashboard
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 1 hours;
    uint256 public minDistribution = 10 * (10 ** 18);

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
        ? IUniswapV2Router02(_router)
        : IUniswapV2Router02(0x81b9FA50D5f5155Ee17817C21702C3AE4780AD09);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = EP.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(EP);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = EP.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
        && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            EP.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }

    function claimDividend() external {
        distributeDividend(msg.sender);
    }
/*
returns the  unpaid earnings
*/
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

contract DeFiTitans is Context, IERC20, Ownable {
    using SafeMath for uint256;

    uint256 public constant MASK = type(uint128).max;
    address EP = 0x69fdb77064ec5c84FA2F21072973eB28441F43F3; // Tethys
    address public WETH = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEAD_NON_CHECKSUM = 0x000000000000000000000000000000000000dEaD;

    string constant _name = "DeFiTitans";
    string constant _symbol = "TITANS";
    uint8 constant _decimals = 6;

    uint256 _totalSupply = 1_000_000_000_000_000 * (10 ** _decimals);
    uint256 public _maxTxAmount = _totalSupply.div(1); //
    uint256 public _maxWallet = _totalSupply.div(1); // 

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

    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isDividendExempt;
    mapping (address => bool) public _isFree;

    uint256 liquidityFee = 300;
    uint256 buybackFee = 0;
    uint256 reflectionFee = 600;
    uint256 marketingFee = 500;
    uint256 totalFee = 1400;
    uint256 feeDenominator = 10000;

    address public autoLiquidityReceiver=0x281C67d60D40268D37DbEc4252A0B5d95D5F18aE;
    address public marketingFeeReceiver=0xA745A9115530c25bAa17a2759fB5703A60886ab6;

    uint256 targetLiquidity = 10;
    uint256 targetLiquidityDenominator = 100;

    IUniswapV2Router02 public router;
    address public pair;

    uint256 public launchedAt;
    uint256 public launchedAtTimestamp;

    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool public autoBuybackEnabled = false;
    mapping (address => bool) buyBacker;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    address public distributorAddress;

    uint256 distributorGas = 500000;

    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply / 5000;
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () {
        address _router = 0x81b9FA50D5f5155Ee17817C21702C3AE4780AD09;
        router = IUniswapV2Router02(_router);
        pair = IUniswapV2Factory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = _totalSupply;
        WETH = router.WETH();
        distributor = new DividendDistributor(_router);
        distributorAddress = address(distributor);

        isFeeExempt[msg.sender] = true;
        isTxLimitExempt[msg.sender] = true;
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        buyBacker[msg.sender] = true;

        autoLiquidityReceiver = msg.sender;

        approve(_router, _totalSupply);
        approve(address(pair), _totalSupply);
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
    

    receive() external payable { }

    function totalSupply() public view override returns (uint256) { return _totalSupply; }
    function decimals() public pure returns (uint8) { return _decimals; }
    function symbol() public pure returns (string memory) { return _symbol; }
    function name() public pure returns (string memory) { return _name; }
    modifier onlyBuybacker() { require(buyBacker[msg.sender] == true, ""); _; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, _totalSupply);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != _totalSupply){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }
         
        // Max  tx check
        address routerAddress = 0x81b9FA50D5f5155Ee17817C21702C3AE4780AD09;

        bool isSell=recipient== pair|| recipient == routerAddress;
        
        checkTxLimit(sender, amount);
        
        // Max wallet check excluding pair and router
        if (!isSell && !_isFree[recipient]){
            require((_balances[recipient] + amount) < _maxWallet, "Max wallet has been triggered");
        }
        
        // No swapping on buy and tx
        if (isSell) {
            if(shouldSwapBack()){ swapBack(); }
            if(shouldAutoBuyback()){ triggerAutoBuyback(); }
        }
        //        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;

        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(!isDividendExempt[sender]){ try distributor.setShare(sender, _balances[sender]) {} catch {} }
        if(!isDividendExempt[recipient]){ try distributor.setShare(recipient, _balances[recipient]) {} catch {} }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
//        emit Transfer(sender, recipient, amount);
        return true;
    }



    function checkTxLimit(address sender, uint256 amount) internal view {
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + 1 >= block.number){ return totalFee; }
        if(selling){ return totalFee; }
        return totalFee;
    }

    function getMultipliedFee() public view returns (uint256) {
        /**
         * if (launchedAtTimestamp + 1 days > block.timestamp) {
            return totalFee.mul(18000).div(feeDenominator);
        } else if (buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp) {
            uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
            uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
            return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
        }
        */
        return totalFee;
    }

    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance.sub(balanceBefore);

        uint256 totalETHFee = totalFee.sub(dynamicLiquidityFee.div(2));

        uint256 amountETHLiquidity = amountETH.mul(dynamicLiquidityFee).div(totalETHFee).div(2);
        uint256 amountETHReflection = amountETH.mul(reflectionFee).div(totalETHFee);
        uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalETHFee);

        try distributor.deposit{value: amountETHReflection}() {} catch {}
        payable(marketingFeeReceiver).transfer(amountETHMarketing);
            
        

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountETHLiquidity, amountToLiquify);
        }
    }

    function shouldAutoBuyback() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && autoBuybackEnabled
        && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number // After N blocks from last buyback
        && address(this).balance >= autoBuybackAmount;
    }

    function triggerZeusBuyback(uint256 amount, bool triggerBuybackMultiplier) external onlyOwner {
        buyTokens(amount, DEAD);
        if(triggerBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
    }

    function clearBuybackMultiplier() external onlyOwner {
        buybackMultiplierTriggeredAt = 0;
    }

    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }
    
    function Sweep() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }


    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external onlyOwner {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
    }

    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external onlyOwner {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
    }

    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    function launch() public onlyOwner {
        require(launchedAt == 0, "Already launched boi");
        launchedAt = block.number;
        launchedAtTimestamp = block.timestamp;
    }
    
    function setMaxWallet(uint256 amount) external onlyOwner {
        require(amount >= _totalSupply / 1000);
        _maxWallet = amount;
    }

    function setTxLimit(uint256 amount) external onlyOwner {
        require(amount >= _totalSupply / 1000);
        _maxTxAmount = amount;
    }

    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setIsTxLimitExempt(address holder, bool exempt) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }
    
    function setFree(address holder) public onlyOwner {
        _isFree[holder] = true;
    }
    
    function unSetFree(address holder) public onlyOwner {
        _isFree[holder] = false;
    }
    
    function checkFree(address holder) public view onlyOwner returns(bool){
        return _isFree[holder];
    }

    function setFees(uint256 _liquidityFee, uint256 _buybackFee, uint256 _reflectionFee, uint256 _marketingFee, uint256 _feeDenominator) external onlyOwner {
        liquidityFee = _liquidityFee;
        buybackFee = _buybackFee;
        reflectionFee = _reflectionFee;
        marketingFee = _marketingFee;
        totalFee = _liquidityFee.add(_buybackFee).add(_reflectionFee).add(_marketingFee);
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator/4);
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external onlyOwner {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyOwner {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }

    function setTargetLiquidity(uint256 _target, uint256 _denominator) external onlyOwner {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }

    function setDistributorSettings(uint256 gas) external onlyOwner {
        require(gas < 750000);
        distributorGas = gas;
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

    event AutoLiquify(uint256 amountETH, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoLiquify","inputs":[{"type":"uint256","name":"amountETH","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountBOG","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuybackMultiplierActive","inputs":[{"type":"uint256","name":"duration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MASK","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"Sweep","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_isFree","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"autoBuybackEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"autoLiquidityReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"clearBuybackMultiplier","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"distributorAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLiquidityBacking","inputs":[{"type":"uint256","name":"accuracy","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMultipliedFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"selling","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOverLiquified","inputs":[{"type":"uint256","name":"target","internalType":"uint256"},{"type":"uint256","name":"accuracy","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"launch","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAtTimestamp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"marketingFeeReceiver","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoBuybackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_cap","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_period","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuybackMultiplierSettings","inputs":[{"type":"uint256","name":"numerator","internalType":"uint256"},{"type":"uint256","name":"denominator","internalType":"uint256"},{"type":"uint256","name":"length","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityReceiver","internalType":"address"},{"type":"address","name":"_marketingFeeReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_buybackFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_feeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxWallet","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTargetLiquidity","inputs":[{"type":"uint256","name":"_target","internalType":"uint256"},{"type":"uint256","name":"_denominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"triggerZeusBuyback","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bool","name":"triggerBuybackMultiplier","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unSetFree","inputs":[{"type":"address","name":"holder","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x6080604052600280546001600160a01b03199081167369fdb77064ec5c84fa2f21072973eb28441f43f31790915560038054821673deaddeaddeaddeaddeaddeaddeaddeaddead000017905560048054821661dead9081179091556005805483169055600680549092161781556200007990600a620007a3565b6200008c9066038d7ea4c680006200088e565b600755620000ac60016007546200056b60201b620015341790919060201c565b600855620000cc60016007546200056b60201b620015341790919060201c565b60095561012c60105560006011556102586012556101f4601355610578601455612710601555601680546001600160a01b031990811673281c67d60d40268d37dbec4252a0b5d95d5f18ae179091556017805490911673a745a9115530c25baa17a2759fb5703a60886ab6179055600a6018556064601981905560c8601e55601f556107086021556022805460ff199081169091556207a120602b55602c8054909116600117905560075462000186906113889062000735565b602d553480156200019657600080fd5b506000620001a3620005bc565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601a80546001600160a01b0319167381b9fa50d5f5155ee17817c21702c3ae4780ad09908117918290556040805163c45a015560e01b8152905191926001600160a01b03169163c45a015591600480820192602092909190829003018186803b1580156200025a57600080fd5b505afa1580156200026f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029591906200067f565b6003546040516364e329cb60e11b81526001600160a01b039283169263c9c6539692620002ca929116903090600401620006bc565b602060405180830381600087803b158015620002e557600080fd5b505af1158015620002fa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032091906200067f565b601b80546001600160a01b0319166001600160a01b03928316179055600754306000908152600b60209081526040808320601a8054871685529083529281902093909355905482516315ab88c960e31b8152925193169263ad5c4648926004808201939291829003018186803b1580156200039a57600080fd5b505afa158015620003af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003d591906200067f565b600380546001600160a01b0319166001600160a01b03929092169190911790556040518190620004059062000671565b620004119190620006a8565b604051809103906000f0801580156200042e573d6000803e3d6000fd5b50602980546001600160a01b039283166001600160a01b03199182161791829055602a8054821692841692909217909155336000818152600c60209081526040808320805460ff199081166001908117909255600d84528285208054821683179055601b5488168552600e845282852080548216831790553085528285208054821683179055600454909716845281842080548816821790558484526023909252909120805490941617909255601680549091169091179055600754620004f7908290620005c0565b50601b5460075462000513916001600160a01b031690620005c0565b50600754336000818152600a602052604080822084905551919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200055c916200072c565b60405180910390a350620008c6565b6000620005b583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200062c60201b60201c565b9392505050565b3390565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906200061b9086906200072c565b60405180910390a350600192915050565b60008183620006595760405162461bcd60e51b8152600401620006509190620006d6565b60405180910390fd5b50600062000668848662000735565b95945050505050565b611114806200307683390190565b60006020828403121562000691578081fd5b81516001600160a01b0381168114620005b5578182fd5b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6000602080835283518082850152825b818110156200070457858101830151858201604001528201620006e6565b81811115620007165783604083870101525b50601f01601f1916929092016040019392505050565b90815260200190565b6000826200075157634e487b7160e01b81526012600452602481fd5b500490565b80825b60018086116200076a57506200079a565b8187048211156200077f576200077f620008b0565b808616156200078d57918102915b9490941c93800262000759565b94509492505050565b6000620005b560001960ff851684600082620007c257506001620005b5565b81620007d157506000620005b5565b8160018114620007ea5760028114620007f55762000829565b6001915050620005b5565b60ff841115620008095762000809620008b0565b6001841b915084821115620008225762000822620008b0565b50620005b5565b5060208310610133831016604e8410600b841016171562000861575081810a838111156200085b576200085b620008b0565b620005b5565b62000870848484600162000756565b808604821115620008855762000885620008b0565b02949350505050565b6000816000190483118215151615620008ab57620008ab620008b0565b500290565b634e487b7160e01b600052601160045260246000fd5b6127a080620008d66000396000f3fe6080604052600436106103035760003560e01c80637d1db4a511610190578063c6d2577d116100dc578063e91f214e11610095578063f5cfec0a1161006f578063f5cfec0a14610853578063f708a64f14610873578063f84ba65d14610893578063f887ea40146108b35761030a565b8063e91f214e14610809578063e96fada21461081e578063f1f3bca3146108335761030a565b8063c6d2577d1461076a578063ca33e64c1461077f578063d51ed1c814610794578063d806d12f146107b4578063dd62ed3e146107c9578063df20fd49146107e95761030a565b8063a4b45c0011610149578063a9059cbb11610123578063a9059cbb1461070b578063ad5c46481461072b578063b210b06d14610740578063bf56b371146107555761030a565b8063a4b45c00146106c1578063a51af4c5146106e1578063a8aa1b31146106f65761030a565b80637d1db4a51461062057806382247ec01461063557806389ef69f61461064a5780638da5cb5b1461066a57806395d89b411461068c5780639d1944f5146106a15761030a565b80632b112e491161024f5780635c85974f116102085780636ddd1713116101e25780636ddd1713146105c15780637088fb7f146105d657806370a08231146105eb578063715018a61461060b5761030a565b80635c85974f146105615780635d0044ca14610581578063658d4b7f146105a15761030a565b80632b112e49146104b55780632d48e896146104ca578063313ce567146104ea5780633425c0011461050c5780633bb8a8d41461052c578063571ac8b0146105415761030a565b8063095ea7b3116102bc578063201e799111610296578063201e7991146104355780632375ce401461045557806323b872dd14610475578063296020e7146104955761030a565b8063095ea7b3146103e05780631161ae391461040057806318160ddd146104205761030a565b806301339c211461030f5780630445b66714610326578063048c7baf1461035157806304a66b481461037157806306fdde031461039157806307c89fe8146103b35761030a565b3661030a57005b600080fd5b34801561031b57600080fd5b506103246108c8565b005b34801561033257600080fd5b5061033b610930565b6040516103489190612685565b60405180910390f35b34801561035d57600080fd5b5061032461036c3660046122e5565b610936565b34801561037d57600080fd5b5061032461038c3660046123d0565b610994565b34801561039d57600080fd5b506103a6610a1a565b60405161034891906124f5565b3480156103bf57600080fd5b506103d36103ce3660046121d7565b610a3e565b60405161034891906124b5565b3480156103ec57600080fd5b506103d36103fb366004612287565b610a98565b34801561040c57600080fd5b506103d361041b366004612357565b610b03565b34801561042c57600080fd5b5061033b610b17565b34801561044157600080fd5b50610324610450366004612357565b610b1d565b34801561046157600080fd5b50610324610470366004612378565b610b5d565b34801561048157600080fd5b506103d3610490366004612223565b610bc2565b3480156104a157600080fd5b506103d36104b03660046121d7565b610c86565b3480156104c157600080fd5b5061033b610c9b565b3480156104d657600080fd5b506103246104e5366004612357565b610ce4565b3480156104f657600080fd5b506104ff610d81565b60405161034891906126d8565b34801561051857600080fd5b506103246105273660046121d7565b610d86565b34801561053857600080fd5b506103d3610ddc565b34801561054d57600080fd5b506103d361055c3660046121d7565b610de5565b34801561056d57600080fd5b5061032461057c36600461231d565b610df3565b34801561058d57600080fd5b5061032461059c36600461231d565b610e49565b3480156105ad57600080fd5b506103246105bc36600461225e565b610e9f565b3480156105cd57600080fd5b506103d3610eff565b3480156105e257600080fd5b50610324610f08565b3480156105f757600080fd5b5061033b6106063660046121d7565b610f70565b34801561061757600080fd5b50610324610f8b565b34801561062c57600080fd5b5061033b61100a565b34801561064157600080fd5b5061033b611010565b34801561065657600080fd5b506103246106653660046121d7565b611016565b34801561067657600080fd5b5061067f61106f565b604051610348919061244d565b34801561069857600080fd5b506103a661107e565b3480156106ad57600080fd5b506103246106bc36600461231d565b61109e565b3480156106cd57600080fd5b506103246106dc3660046121f1565b6110e7565b3480156106ed57600080fd5b5061067f61114a565b34801561070257600080fd5b5061067f611159565b34801561071757600080fd5b506103d3610726366004612287565b611168565b34801561073757600080fd5b5061067f611175565b34801561074c57600080fd5b50610324611184565b34801561076157600080fd5b5061033b6111c0565b34801561077657600080fd5b5061033b6111c6565b34801561078b57600080fd5b5061067f6111cc565b3480156107a057600080fd5b5061033b6107af36600461231d565b6111db565b3480156107c057600080fd5b5061033b61121b565b3480156107d557600080fd5b5061033b6107e43660046121f1565b611221565b3480156107f557600080fd5b506103246108043660046122ca565b61124c565b34801561081557600080fd5b5061033b611298565b34801561082a57600080fd5b5061067f6112ac565b34801561083f57600080fd5b5061033b61084e3660046122b0565b6112bb565b34801561085f57600080fd5b5061032461086e366004612335565b6112f2565b34801561087f57600080fd5b5061032461088e36600461225e565b611385565b34801561089f57600080fd5b506103246108ae36600461225e565b6114c5565b3480156108bf57600080fd5b5061067f611525565b6108d0611576565b6000546001600160a01b039081169116146109065760405162461bcd60e51b81526004016108fd90612622565b60405180910390fd5b601c54156109265760405162461bcd60e51b81526004016108fd90612657565b43601c5542601d55565b602d5481565b61093e611576565b6000546001600160a01b0390811691161461096b5760405162461bcd60e51b81526004016108fd90612622565b6022805460ff191694151594909417909355602491909155600060255560265560275543602855565b61099c611576565b6000546001600160a01b039081169116146109c95760405162461bcd60e51b81526004016108fd90612622565b60108590556011849055601283905560138290556109f3826109ed8581898961157a565b9061157a565b6014556015819055610a066004826126fe565b60145410610a1357600080fd5b5050505050565b60408051808201909152600a81526944654669546974616e7360b01b602082015290565b6000610a48611576565b6000546001600160a01b03908116911614610a755760405162461bcd60e51b81526004016108fd90612622565b506001600160a01b0381166000908152600f602052604090205460ff165b919050565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610af1908690612685565b60405180910390a35060015b92915050565b600082610b0f836111db565b119392505050565b60075490565b610b25611576565b6000546001600160a01b03908116911614610b525760405162461bcd60e51b81526004016108fd90612622565b601891909155601955565b610b65611576565b6000546001600160a01b03908116911614610b925760405162461bcd60e51b81526004016108fd90612622565b6002610b9e83856126fe565b11158015610bab57508183115b610bb457600080fd5b601e92909255601f55602155565b6007546001600160a01b0384166000908152600b60209081526040808320338452909152812054909114610c71576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c4c9184906115a9565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610c7c8484846115e3565b90505b9392505050565b600f6020526000908152604090205460ff1681565b600554600090610cdf90610cb7906001600160a01b0316610f70565b600454610cd990610cd0906001600160a01b0316610f70565b60075490611994565b90611994565b905090565b610cec611576565b6000546001600160a01b03908116911614610d195760405162461bcd60e51b81526004016108fd90612622565b6029546040516316a4744b60e11b81526001600160a01b0390911690632d48e89690610d4b90859085906004016126ca565b600060405180830381600087803b158015610d6557600080fd5b505af1158015610d79573d6000803e3d6000fd5b505050505050565b600690565b610d8e611576565b6000546001600160a01b03908116911614610dbb5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60225460ff1681565b6000610afd82600754610a98565b610dfb611576565b6000546001600160a01b03908116911614610e285760405162461bcd60e51b81526004016108fd90612622565b6103e8600754610e3891906126fe565b811015610e4457600080fd5b600855565b610e51611576565b6000546001600160a01b03908116911614610e7e5760405162461bcd60e51b81526004016108fd90612622565b6103e8600754610e8e91906126fe565b811015610e9a57600080fd5b600955565b610ea7611576565b6000546001600160a01b03908116911614610ed45760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b602c5460ff1681565b610f10611576565b6000546001600160a01b03908116911614610f3d5760405162461bcd60e51b81526004016108fd90612622565b6040514790339082156108fc029083906000818181858888f19350505050158015610f6c573d6000803e3d6000fd5b5050565b6001600160a01b03166000908152600a602052604090205490565b610f93611576565b6000546001600160a01b03908116911614610fc05760405162461bcd60e51b81526004016108fd90612622565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60085481565b60095481565b61101e611576565b6000546001600160a01b0390811691161461104b5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000546001600160a01b031690565b604080518082019091526006815265544954414e5360d01b602082015290565b6110a6611576565b6000546001600160a01b039081169116146110d35760405162461bcd60e51b81526004016108fd90612622565b620b71b081106110e257600080fd5b602b55565b6110ef611576565b6000546001600160a01b0390811691161461111c5760405162461bcd60e51b81526004016108fd90612622565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b602a546001600160a01b031681565b601b546001600160a01b031681565b6000610c7f3384846115e3565b6003546001600160a01b031681565b61118c611576565b6000546001600160a01b039081169116146111b95760405162461bcd60e51b81526004016108fd90612622565b6000602055565b601c5481565b601d5481565b6016546001600160a01b031681565b6000610afd6111e8610c9b565b601b546112159061120e90600290611208906001600160a01b0316610f70565b906119d6565b85906119d6565b90611534565b60145490565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b611254611576565b6000546001600160a01b039081169116146112815760405162461bcd60e51b81526004016108fd90612622565b602c805460ff191692151592909217909155602d55565b6fffffffffffffffffffffffffffffffff81565b6017546001600160a01b031681565b600043601c5460016112cd91906126e6565b106112db5750601454610a93565b81156112ea5750601454610a93565b505060145490565b6112fa611576565b6000546001600160a01b039081169116146113275760405162461bcd60e51b81526004016108fd90612622565b60045461133e9083906001600160a01b0316611a1b565b8015610f6c57426020556021546040517f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9161137991612685565b60405180910390a15050565b61138d611576565b6000546001600160a01b039081169116146113ba5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03821630148015906113e15750601b546001600160a01b03838116911614155b6113ea57600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561148157602954604051630a5b654b60e11b81526001600160a01b03909116906314b6ca969061144a908590600090600401612461565b600060405180830381600087803b15801561146457600080fd5b505af1158015611478573d6000803e3d6000fd5b50505050610f6c565b6029546001600160a01b038381166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691610d4b918691600401612461565b6114cd611576565b6000546001600160a01b039081169116146114fa5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b601a546001600160a01b031681565b6000610c7f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b40565b3390565b60008061158783856126e6565b905083811015610c7f5760405162461bcd60e51b81526004016108fd906125aa565b600081848411156115cd5760405162461bcd60e51b81526004016108fd91906124f5565b5060006115da848661273d565b95945050505050565b602e5460009060ff1615611603576115fc848484611b6e565b9050610c7f565b601b547381b9fa50d5f5155ee17817c21702c3ae4780ad09906000906001600160a01b03868116911614806116495750816001600160a01b0316856001600160a01b0316145b90506116558685611c11565b8015801561167c57506001600160a01b0385166000908152600f602052604090205460ff16155b156116c5576009546001600160a01b0386166000908152600a60205260409020546116a89086906126e6565b106116c55760405162461bcd60e51b81526004016108fd90612573565b80156116f5576116d3611c56565b156116e0576116e0611ca5565b6116e861203f565b156116f5576116f561209a565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600a90915291909120546117479186906115a9565b6001600160a01b0387166000908152600a602052604081209190915561176c876120e1565b6117765784611781565b611781878787612100565b6001600160a01b0387166000908152600a60205260409020549091506117a7908261157a565b6001600160a01b038088166000908152600a6020908152604080832094909455918a168152600e909152205460ff1661184b576029546001600160a01b038881166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca969161181e918b91600401612461565b600060405180830381600087803b15801561183857600080fd5b505af1925050508015611849575060015b505b6001600160a01b0386166000908152600e602052604090205460ff166118dc576029546001600160a01b038781166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca96916118af918a91600401612461565b600060405180830381600087803b1580156118c957600080fd5b505af19250505080156118da575060015b505b602954602b546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161191091600401612685565b600060405180830381600087803b15801561192a57600080fd5b505af192505050801561193b575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161197f9190612685565b60405180910390a35060019695505050505050565b6000610c7f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115a9565b6000826119e557506000610afd565b60006119f1838561271e565b9050826119fe85836126fe565b14610c7f5760405162461bcd60e51b81526004016108fd906125e1565b602e805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b031691839150600090611a7757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ab957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a5460405163b6f9de9560e01b815291169063b6f9de95908590611aff906000908690889042906004016124c0565b6000604051808303818588803b158015611b1857600080fd5b505af1158015611b2c573d6000803e3d6000fd5b5050602e805460ff19169055505050505050565b60008183611b615760405162461bcd60e51b81526004016108fd91906124f5565b5060006115da84866126fe565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a90915291822054611bbf9184906115a9565b6001600160a01b038086166000908152600a60205260408082209390935590851681522054611bee908361157a565b6001600160a01b0384166000908152600a60205260409020555060019392505050565b60085481111580611c3a57506001600160a01b0382166000908152600d602052604090205460ff165b610f6c5760405162461bcd60e51b81526004016108fd90612548565b601b546000906001600160a01b03163314801590611c775750602e5460ff16155b8015611c855750602c5460ff165b8015610cdf575050602d54306000908152600a6020526040902054101590565b602e805460ff19166001179055601854601954600091611cc491610b03565b611cd057601054611cd3565b60005b90506000611cf7600261121560145461121586602d546119d690919063ffffffff16565b90506000611d1082602d5461199490919063ffffffff16565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611d5857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600354825191169082906001908110611d9757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a5460405163791ac94760e01b81524792919091169063791ac94790611de190869060009087903090429060040161268e565b600060405180830381600087803b158015611dfb57600080fd5b505af1158015611e0f573d6000803e3d6000fd5b505050506000611e28824761199490919063ffffffff16565b90506000611e43611e3a886002611534565b60145490611994565b90506000611e5860026112158481878d6119d6565b90506000611e7583611215601254876119d690919063ffffffff16565b90506000611e9284611215601354886119d690919063ffffffff16565b9050602960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee457600080fd5b505af193505050508015611ef6575060015b506017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611f31573d6000803e3d6000fd5b50881561202957601a60009054906101000a90046001600160a01b03166001600160a01b031663f305d71984308c600080601660009054906101000a90046001600160a01b0316426040518863ffffffff1660e01b8152600401611f9a9695949392919061247a565b6060604051808303818588803b158015611fb357600080fd5b505af1158015611fc7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fec91906123a3565b5050507f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506838a6040516120209291906126ca565b60405180910390a15b5050602e805460ff191690555050505050505050565b601b546000906001600160a01b031633148015906120605750602e5460ff16155b801561206e575060225460ff165b801561208957504360275460285461208691906126e6565b11155b8015610cdf57505060265447101590565b6026546004546120b391906001600160a01b0316611a1b565b436028556026546025546120c69161157a565b602581905560245410156120df576022805460ff191690555b565b6001600160a01b03166000908152600c602052604090205460ff161590565b601554601b54600091829161213291906112159061212b906001600160a01b038981169116146112bb565b86906119d6565b306000908152600a602052604090205490915061214f908261157a565b306000818152600a6020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061219e908590612685565b60405180910390a36115da8382611994565b80356001600160a01b0381168114610a9357600080fd5b80358015158114610a9357600080fd5b6000602082840312156121e8578081fd5b610c7f826121b0565b60008060408385031215612203578081fd5b61220c836121b0565b915061221a602084016121b0565b90509250929050565b600080600060608486031215612237578081fd5b612240846121b0565b925061224e602085016121b0565b9150604084013590509250925092565b60008060408385031215612270578182fd5b612279836121b0565b915061221a602084016121c7565b60008060408385031215612299578182fd5b6122a2836121b0565b946020939093013593505050565b6000602082840312156122c1578081fd5b610c7f826121c7565b600080604083850312156122dc578182fd5b6122a2836121c7565b600080600080608085870312156122fa578081fd5b612303856121c7565b966020860135965060408601359560600135945092505050565b60006020828403121561232e578081fd5b5035919050565b60008060408385031215612347578182fd5b8235915061221a602084016121c7565b60008060408385031215612369578182fd5b50508035926020909101359150565b60008060006060848603121561238c578283fd5b505081359360208301359350604090920135919050565b6000806000606084860312156123b7578283fd5b8351925060208401519150604084015190509250925092565b600080600080600060a086880312156123e7578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260208085019450808401835b838110156124425781516001600160a01b03168752958201959082019060010161241d565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000858252608060208301526124d9608083018661240a565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561252157858101830151858201604001528201612505565b818111156125325783604083870101525b50601f01601f1916929092016040019392505050565b602080825260119082015270151608131a5b5a5d08115e18d959591959607a1b604082015260600190565b6020808252601d908201527f4d61782077616c6c657420686173206265656e20747269676765726564000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273416c7265616479206c61756e6368656420626f6960601b604082015260600190565b90815260200190565b600086825285602083015260a060408301526126ad60a083018661240a565b6001600160a01b0394909416606083015250608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b600082198211156126f9576126f9612754565b500190565b60008261271957634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561273857612738612754565b500290565b60008282101561274f5761274f612754565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220609e9d18a53b7f370593073da3abeb5b718ae2511cc8918e6573cfb81257a54764736f6c634300080000336080604052600180546001600160a01b03199081167369fdb77064ec5c84fa2f21072973eb28441f43f3179091556002805490911673deaddeaddeaddeaddeaddeaddeaddeaddead00001790556ec097ce7bc90715b34b9f1000000000600c55610e10600d55678ac7230489e80000600e5534801561007d57600080fd5b5060405161111438038061111483398101604081905261009c916100f6565b6001600160a01b0381166100c4577381b9fa50d5f5155ee17817c21702c3ae4780ad096100c6565b805b600380546001600160a01b03929092166001600160a01b0319928316179055600080549091163317905550610124565b600060208284031215610107578081fd5b81516001600160a01b038116811461011d578182fd5b9392505050565b610fe1806101336000396000f3fe6080604052600436106100dd5760003560e01c8063ce7c2ac21161007f578063efca2eed11610059578063efca2eed146101fa578063f0fc6bca1461020f578063ffb2c47914610224578063ffd49c8414610244576100dd565b8063ce7c2ac2146101ae578063d0e30db0146101dd578063e2d2e219146101e5576100dd565b80632d48e896116100bb5780632d48e8961461014f5780633a98ef391461016f5780634fab0ae814610184578063997664d714610199576100dd565b806311ce023d146100e257806314b6ca961461010d57806328fd31981461012f575b600080fd5b3480156100ee57600080fd5b506100f7610259565b6040516101049190610eed565b60405180910390f35b34801561011957600080fd5b5061012d610128366004610cf2565b61025f565b005b34801561013b57600080fd5b506100f761014a366004610cd8565b610384565b34801561015b57600080fd5b5061012d61016a366004610d6b565b610410565b34801561017b57600080fd5b506100f7610432565b34801561019057600080fd5b506100f7610438565b3480156101a557600080fd5b506100f761043e565b3480156101ba57600080fd5b506101ce6101c9366004610cd8565b610444565b60405161010493929190610ef6565b61012d610465565b3480156101f157600080fd5b506100f76106d8565b34801561020657600080fd5b506100f76106de565b34801561021b57600080fd5b5061012d6106e4565b34801561023057600080fd5b5061012d61023f366004610d3b565b6106ef565b34801561025057600080fd5b506100f761080e565b600c5481565b6000546001600160a01b0316331461027657600080fd5b6001600160a01b0382166000908152600760205260409020541561029d5761029d82610814565b6000811180156102c357506001600160a01b038216600090815260076020526040902054155b156102d6576102d18261093f565b610309565b801580156102fb57506001600160a01b03821660009081526007602052604090205415155b1561030957610309826109a0565b6001600160a01b03821660009081526007602052604090205460085461033a91839161033491610aed565b90610b38565b6008556001600160a01b038216600090815260076020526040902081905561036181610b70565b6001600160a01b0390921660009081526007602052604090206001019190915550565b6001600160a01b0381166000908152600760205260408120546103a95750600061040b565b6001600160a01b0382166000908152600760205260408120546103cb90610b70565b6001600160a01b0384166000908152600760205260409020600101549091508082116103fc5760009250505061040b565b6104068282610aed565b925050505b919050565b6000546001600160a01b0316331461042757600080fd5b600d91909155600e55565b60085481565b600e5481565b60095481565b60076020526000908152604090208054600182015460029092015490919083565b6000546001600160a01b0316331461047c57600080fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a08231906104ad903090600401610d8c565b60206040518083038186803b1580156104c557600080fd5b505afa1580156104d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fd9190610d53565b6040805160028082526060820183529293506000929091602083019080368337505060025482519293506001600160a01b03169183915060009061055157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600180548351921691839190811061058f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de959034906105d590600090869030904290600401610db9565b6000604051808303818588803b1580156105ee57600080fd5b505af1158015610602573d6000803e3d6000fd5b50506001546040516370a0823160e01b81526000945061069693508692506001600160a01b03909116906370a0823190610640903090600401610d8c565b60206040518083038186803b15801561065857600080fd5b505afa15801561066c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106909190610d53565b90610aed565b6009549091506106a69082610b38565b600955600854600c546106d0916106c7916106c19085610b8d565b90610bd2565b600b5490610b38565b600b55505050565b600b5481565b600a5481565b6106ed33610814565b565b6000546001600160a01b0316331461070657600080fd5b60045480610714575061080b565b6000805a905060005b848310801561072b57508381105b156108065783600f541061073f576000600f555b61077f6004600f548154811061076557634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610c14565b156107c4576107c46004600f54815481106107aa57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610814565b6107d96107d25a8490610aed565b8490610b38565b92505a600f805491935060006107ee83610f7a565b919050555080806107fe90610f7a565b91505061071d565b505050505b50565b600d5481565b6001600160a01b0381166000908152600760205260409020546108365761080b565b600061084182610384565b9050801561093b57600a546108569082610b38565b600a5560015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061088b9085908590600401610da0565b602060405180830381600087803b1580156108a557600080fd5b505af11580156108b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108dd9190610d1b565b506001600160a01b038216600090815260066020908152604080832042905560079091529020600201546109119082610b38565b6001600160a01b038316600090815260076020526040902060028101919091555461036190610b70565b5050565b600480546001600160a01b039092166000818152600560205260408120849055600184018355919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90910180546001600160a01b0319169091179055565b600480546109b090600190610f63565b815481106109ce57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0384811684526005909252604090922054600480549290931692918110610a1a57634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260059182905260408120546004805491939291610a6690600190610f63565b81548110610a8457634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610ac857634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610b2f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c59565b90505b92915050565b600080610b458385610f0c565b905083811015610b2f5760405162461bcd60e51b8152600401610b6790610e75565b60405180910390fd5b6000610b32600c546106c1600b5485610b8d90919063ffffffff16565b600082610b9c57506000610b32565b6000610ba88385610f44565b905082610bb58583610f24565b14610b2f5760405162461bcd60e51b8152600401610b6790610eac565b6000610b2f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610c93565b600d546001600160a01b03821660009081526006602052604081205490914291610c3e9190610f0c565b108015610b325750600e54610c5283610384565b1192915050565b60008184841115610c7d5760405162461bcd60e51b8152600401610b679190610e22565b506000610c8a8486610f63565b95945050505050565b60008183610cb45760405162461bcd60e51b8152600401610b679190610e22565b506000610c8a8486610f24565b80356001600160a01b038116811461040b57600080fd5b600060208284031215610ce9578081fd5b610b2f82610cc1565b60008060408385031215610d04578081fd5b610d0d83610cc1565b946020939093013593505050565b600060208284031215610d2c578081fd5b81518015158114610b2f578182fd5b600060208284031215610d4c578081fd5b5035919050565b600060208284031215610d64578081fd5b5051919050565b60008060408385031215610d7d578182fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060808201868352602060808185015281875180845260a0860191508289019350845b81811015610e025784516001600160a01b031683529383019391830191600101610ddd565b50506001600160a01b039690961660408501525050506060015292915050565b6000602080835283518082850152825b81811015610e4e57858101830151858201604001528201610e32565b81811115610e5f5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b90815260200190565b9283526020830191909152604082015260600190565b60008219821115610f1f57610f1f610f95565b500190565b600082610f3f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615610f5e57610f5e610f95565b500290565b600082821015610f7557610f75610f95565b500390565b6000600019821415610f8e57610f8e610f95565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212200a3103ef84874a74d21299c46dc8705f055b283477630aa0fd6f38218bf7cfdd64736f6c63430008000033

Deployed ByteCode

0x6080604052600436106103035760003560e01c80637d1db4a511610190578063c6d2577d116100dc578063e91f214e11610095578063f5cfec0a1161006f578063f5cfec0a14610853578063f708a64f14610873578063f84ba65d14610893578063f887ea40146108b35761030a565b8063e91f214e14610809578063e96fada21461081e578063f1f3bca3146108335761030a565b8063c6d2577d1461076a578063ca33e64c1461077f578063d51ed1c814610794578063d806d12f146107b4578063dd62ed3e146107c9578063df20fd49146107e95761030a565b8063a4b45c0011610149578063a9059cbb11610123578063a9059cbb1461070b578063ad5c46481461072b578063b210b06d14610740578063bf56b371146107555761030a565b8063a4b45c00146106c1578063a51af4c5146106e1578063a8aa1b31146106f65761030a565b80637d1db4a51461062057806382247ec01461063557806389ef69f61461064a5780638da5cb5b1461066a57806395d89b411461068c5780639d1944f5146106a15761030a565b80632b112e491161024f5780635c85974f116102085780636ddd1713116101e25780636ddd1713146105c15780637088fb7f146105d657806370a08231146105eb578063715018a61461060b5761030a565b80635c85974f146105615780635d0044ca14610581578063658d4b7f146105a15761030a565b80632b112e49146104b55780632d48e896146104ca578063313ce567146104ea5780633425c0011461050c5780633bb8a8d41461052c578063571ac8b0146105415761030a565b8063095ea7b3116102bc578063201e799111610296578063201e7991146104355780632375ce401461045557806323b872dd14610475578063296020e7146104955761030a565b8063095ea7b3146103e05780631161ae391461040057806318160ddd146104205761030a565b806301339c211461030f5780630445b66714610326578063048c7baf1461035157806304a66b481461037157806306fdde031461039157806307c89fe8146103b35761030a565b3661030a57005b600080fd5b34801561031b57600080fd5b506103246108c8565b005b34801561033257600080fd5b5061033b610930565b6040516103489190612685565b60405180910390f35b34801561035d57600080fd5b5061032461036c3660046122e5565b610936565b34801561037d57600080fd5b5061032461038c3660046123d0565b610994565b34801561039d57600080fd5b506103a6610a1a565b60405161034891906124f5565b3480156103bf57600080fd5b506103d36103ce3660046121d7565b610a3e565b60405161034891906124b5565b3480156103ec57600080fd5b506103d36103fb366004612287565b610a98565b34801561040c57600080fd5b506103d361041b366004612357565b610b03565b34801561042c57600080fd5b5061033b610b17565b34801561044157600080fd5b50610324610450366004612357565b610b1d565b34801561046157600080fd5b50610324610470366004612378565b610b5d565b34801561048157600080fd5b506103d3610490366004612223565b610bc2565b3480156104a157600080fd5b506103d36104b03660046121d7565b610c86565b3480156104c157600080fd5b5061033b610c9b565b3480156104d657600080fd5b506103246104e5366004612357565b610ce4565b3480156104f657600080fd5b506104ff610d81565b60405161034891906126d8565b34801561051857600080fd5b506103246105273660046121d7565b610d86565b34801561053857600080fd5b506103d3610ddc565b34801561054d57600080fd5b506103d361055c3660046121d7565b610de5565b34801561056d57600080fd5b5061032461057c36600461231d565b610df3565b34801561058d57600080fd5b5061032461059c36600461231d565b610e49565b3480156105ad57600080fd5b506103246105bc36600461225e565b610e9f565b3480156105cd57600080fd5b506103d3610eff565b3480156105e257600080fd5b50610324610f08565b3480156105f757600080fd5b5061033b6106063660046121d7565b610f70565b34801561061757600080fd5b50610324610f8b565b34801561062c57600080fd5b5061033b61100a565b34801561064157600080fd5b5061033b611010565b34801561065657600080fd5b506103246106653660046121d7565b611016565b34801561067657600080fd5b5061067f61106f565b604051610348919061244d565b34801561069857600080fd5b506103a661107e565b3480156106ad57600080fd5b506103246106bc36600461231d565b61109e565b3480156106cd57600080fd5b506103246106dc3660046121f1565b6110e7565b3480156106ed57600080fd5b5061067f61114a565b34801561070257600080fd5b5061067f611159565b34801561071757600080fd5b506103d3610726366004612287565b611168565b34801561073757600080fd5b5061067f611175565b34801561074c57600080fd5b50610324611184565b34801561076157600080fd5b5061033b6111c0565b34801561077657600080fd5b5061033b6111c6565b34801561078b57600080fd5b5061067f6111cc565b3480156107a057600080fd5b5061033b6107af36600461231d565b6111db565b3480156107c057600080fd5b5061033b61121b565b3480156107d557600080fd5b5061033b6107e43660046121f1565b611221565b3480156107f557600080fd5b506103246108043660046122ca565b61124c565b34801561081557600080fd5b5061033b611298565b34801561082a57600080fd5b5061067f6112ac565b34801561083f57600080fd5b5061033b61084e3660046122b0565b6112bb565b34801561085f57600080fd5b5061032461086e366004612335565b6112f2565b34801561087f57600080fd5b5061032461088e36600461225e565b611385565b34801561089f57600080fd5b506103246108ae36600461225e565b6114c5565b3480156108bf57600080fd5b5061067f611525565b6108d0611576565b6000546001600160a01b039081169116146109065760405162461bcd60e51b81526004016108fd90612622565b60405180910390fd5b601c54156109265760405162461bcd60e51b81526004016108fd90612657565b43601c5542601d55565b602d5481565b61093e611576565b6000546001600160a01b0390811691161461096b5760405162461bcd60e51b81526004016108fd90612622565b6022805460ff191694151594909417909355602491909155600060255560265560275543602855565b61099c611576565b6000546001600160a01b039081169116146109c95760405162461bcd60e51b81526004016108fd90612622565b60108590556011849055601283905560138290556109f3826109ed8581898961157a565b9061157a565b6014556015819055610a066004826126fe565b60145410610a1357600080fd5b5050505050565b60408051808201909152600a81526944654669546974616e7360b01b602082015290565b6000610a48611576565b6000546001600160a01b03908116911614610a755760405162461bcd60e51b81526004016108fd90612622565b506001600160a01b0381166000908152600f602052604090205460ff165b919050565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610af1908690612685565b60405180910390a35060015b92915050565b600082610b0f836111db565b119392505050565b60075490565b610b25611576565b6000546001600160a01b03908116911614610b525760405162461bcd60e51b81526004016108fd90612622565b601891909155601955565b610b65611576565b6000546001600160a01b03908116911614610b925760405162461bcd60e51b81526004016108fd90612622565b6002610b9e83856126fe565b11158015610bab57508183115b610bb457600080fd5b601e92909255601f55602155565b6007546001600160a01b0384166000908152600b60209081526040808320338452909152812054909114610c71576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600b82528381203382529091529190912054610c4c9184906115a9565b6001600160a01b0385166000908152600b602090815260408083203384529091529020555b610c7c8484846115e3565b90505b9392505050565b600f6020526000908152604090205460ff1681565b600554600090610cdf90610cb7906001600160a01b0316610f70565b600454610cd990610cd0906001600160a01b0316610f70565b60075490611994565b90611994565b905090565b610cec611576565b6000546001600160a01b03908116911614610d195760405162461bcd60e51b81526004016108fd90612622565b6029546040516316a4744b60e11b81526001600160a01b0390911690632d48e89690610d4b90859085906004016126ca565b600060405180830381600087803b158015610d6557600080fd5b505af1158015610d79573d6000803e3d6000fd5b505050505050565b600690565b610d8e611576565b6000546001600160a01b03908116911614610dbb5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60225460ff1681565b6000610afd82600754610a98565b610dfb611576565b6000546001600160a01b03908116911614610e285760405162461bcd60e51b81526004016108fd90612622565b6103e8600754610e3891906126fe565b811015610e4457600080fd5b600855565b610e51611576565b6000546001600160a01b03908116911614610e7e5760405162461bcd60e51b81526004016108fd90612622565b6103e8600754610e8e91906126fe565b811015610e9a57600080fd5b600955565b610ea7611576565b6000546001600160a01b03908116911614610ed45760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b602c5460ff1681565b610f10611576565b6000546001600160a01b03908116911614610f3d5760405162461bcd60e51b81526004016108fd90612622565b6040514790339082156108fc029083906000818181858888f19350505050158015610f6c573d6000803e3d6000fd5b5050565b6001600160a01b03166000908152600a602052604090205490565b610f93611576565b6000546001600160a01b03908116911614610fc05760405162461bcd60e51b81526004016108fd90612622565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60085481565b60095481565b61101e611576565b6000546001600160a01b0390811691161461104b5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000546001600160a01b031690565b604080518082019091526006815265544954414e5360d01b602082015290565b6110a6611576565b6000546001600160a01b039081169116146110d35760405162461bcd60e51b81526004016108fd90612622565b620b71b081106110e257600080fd5b602b55565b6110ef611576565b6000546001600160a01b0390811691161461111c5760405162461bcd60e51b81526004016108fd90612622565b601680546001600160a01b039384166001600160a01b03199182161790915560178054929093169116179055565b602a546001600160a01b031681565b601b546001600160a01b031681565b6000610c7f3384846115e3565b6003546001600160a01b031681565b61118c611576565b6000546001600160a01b039081169116146111b95760405162461bcd60e51b81526004016108fd90612622565b6000602055565b601c5481565b601d5481565b6016546001600160a01b031681565b6000610afd6111e8610c9b565b601b546112159061120e90600290611208906001600160a01b0316610f70565b906119d6565b85906119d6565b90611534565b60145490565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b611254611576565b6000546001600160a01b039081169116146112815760405162461bcd60e51b81526004016108fd90612622565b602c805460ff191692151592909217909155602d55565b6fffffffffffffffffffffffffffffffff81565b6017546001600160a01b031681565b600043601c5460016112cd91906126e6565b106112db5750601454610a93565b81156112ea5750601454610a93565b505060145490565b6112fa611576565b6000546001600160a01b039081169116146113275760405162461bcd60e51b81526004016108fd90612622565b60045461133e9083906001600160a01b0316611a1b565b8015610f6c57426020556021546040517f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9161137991612685565b60405180910390a15050565b61138d611576565b6000546001600160a01b039081169116146113ba5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03821630148015906113e15750601b546001600160a01b03838116911614155b6113ea57600080fd5b6001600160a01b0382166000908152600e60205260409020805460ff1916821580159190911790915561148157602954604051630a5b654b60e11b81526001600160a01b03909116906314b6ca969061144a908590600090600401612461565b600060405180830381600087803b15801561146457600080fd5b505af1158015611478573d6000803e3d6000fd5b50505050610f6c565b6029546001600160a01b038381166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca9691610d4b918691600401612461565b6114cd611576565b6000546001600160a01b039081169116146114fa5760405162461bcd60e51b81526004016108fd90612622565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b601a546001600160a01b031681565b6000610c7f83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611b40565b3390565b60008061158783856126e6565b905083811015610c7f5760405162461bcd60e51b81526004016108fd906125aa565b600081848411156115cd5760405162461bcd60e51b81526004016108fd91906124f5565b5060006115da848661273d565b95945050505050565b602e5460009060ff1615611603576115fc848484611b6e565b9050610c7f565b601b547381b9fa50d5f5155ee17817c21702c3ae4780ad09906000906001600160a01b03868116911614806116495750816001600160a01b0316856001600160a01b0316145b90506116558685611c11565b8015801561167c57506001600160a01b0385166000908152600f602052604090205460ff16155b156116c5576009546001600160a01b0386166000908152600a60205260409020546116a89086906126e6565b106116c55760405162461bcd60e51b81526004016108fd90612573565b80156116f5576116d3611c56565b156116e0576116e0611ca5565b6116e861203f565b156116f5576116f561209a565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600a90915291909120546117479186906115a9565b6001600160a01b0387166000908152600a602052604081209190915561176c876120e1565b6117765784611781565b611781878787612100565b6001600160a01b0387166000908152600a60205260409020549091506117a7908261157a565b6001600160a01b038088166000908152600a6020908152604080832094909455918a168152600e909152205460ff1661184b576029546001600160a01b038881166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca969161181e918b91600401612461565b600060405180830381600087803b15801561183857600080fd5b505af1925050508015611849575060015b505b6001600160a01b0386166000908152600e602052604090205460ff166118dc576029546001600160a01b038781166000908152600a602052604090819020549051630a5b654b60e11b815291909216916314b6ca96916118af918a91600401612461565b600060405180830381600087803b1580156118c957600080fd5b505af19250505080156118da575060015b505b602954602b546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c4799161191091600401612685565b600060405180830381600087803b15801561192a57600080fd5b505af192505050801561193b575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161197f9190612685565b60405180910390a35060019695505050505050565b6000610c7f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115a9565b6000826119e557506000610afd565b60006119f1838561271e565b9050826119fe85836126fe565b14610c7f5760405162461bcd60e51b81526004016108fd906125e1565b602e805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b031691839150600090611a7757634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110611ab957634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a5460405163b6f9de9560e01b815291169063b6f9de95908590611aff906000908690889042906004016124c0565b6000604051808303818588803b158015611b1857600080fd5b505af1158015611b2c573d6000803e3d6000fd5b5050602e805460ff19169055505050505050565b60008183611b615760405162461bcd60e51b81526004016108fd91906124f5565b5060006115da84866126fe565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600a90915291822054611bbf9184906115a9565b6001600160a01b038086166000908152600a60205260408082209390935590851681522054611bee908361157a565b6001600160a01b0384166000908152600a60205260409020555060019392505050565b60085481111580611c3a57506001600160a01b0382166000908152600d602052604090205460ff165b610f6c5760405162461bcd60e51b81526004016108fd90612548565b601b546000906001600160a01b03163314801590611c775750602e5460ff16155b8015611c855750602c5460ff165b8015610cdf575050602d54306000908152600a6020526040902054101590565b602e805460ff19166001179055601854601954600091611cc491610b03565b611cd057601054611cd3565b60005b90506000611cf7600261121560145461121586602d546119d690919063ffffffff16565b90506000611d1082602d5461199490919063ffffffff16565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611d5857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600354825191169082906001908110611d9757634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601a5460405163791ac94760e01b81524792919091169063791ac94790611de190869060009087903090429060040161268e565b600060405180830381600087803b158015611dfb57600080fd5b505af1158015611e0f573d6000803e3d6000fd5b505050506000611e28824761199490919063ffffffff16565b90506000611e43611e3a886002611534565b60145490611994565b90506000611e5860026112158481878d6119d6565b90506000611e7583611215601254876119d690919063ffffffff16565b90506000611e9284611215601354886119d690919063ffffffff16565b9050602960009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ee457600080fd5b505af193505050508015611ef6575060015b506017546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015611f31573d6000803e3d6000fd5b50881561202957601a60009054906101000a90046001600160a01b03166001600160a01b031663f305d71984308c600080601660009054906101000a90046001600160a01b0316426040518863ffffffff1660e01b8152600401611f9a9695949392919061247a565b6060604051808303818588803b158015611fb357600080fd5b505af1158015611fc7573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fec91906123a3565b5050507f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506838a6040516120209291906126ca565b60405180910390a15b5050602e805460ff191690555050505050505050565b601b546000906001600160a01b031633148015906120605750602e5460ff16155b801561206e575060225460ff165b801561208957504360275460285461208691906126e6565b11155b8015610cdf57505060265447101590565b6026546004546120b391906001600160a01b0316611a1b565b436028556026546025546120c69161157a565b602581905560245410156120df576022805460ff191690555b565b6001600160a01b03166000908152600c602052604090205460ff161590565b601554601b54600091829161213291906112159061212b906001600160a01b038981169116146112bb565b86906119d6565b306000908152600a602052604090205490915061214f908261157a565b306000818152600a6020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061219e908590612685565b60405180910390a36115da8382611994565b80356001600160a01b0381168114610a9357600080fd5b80358015158114610a9357600080fd5b6000602082840312156121e8578081fd5b610c7f826121b0565b60008060408385031215612203578081fd5b61220c836121b0565b915061221a602084016121b0565b90509250929050565b600080600060608486031215612237578081fd5b612240846121b0565b925061224e602085016121b0565b9150604084013590509250925092565b60008060408385031215612270578182fd5b612279836121b0565b915061221a602084016121c7565b60008060408385031215612299578182fd5b6122a2836121b0565b946020939093013593505050565b6000602082840312156122c1578081fd5b610c7f826121c7565b600080604083850312156122dc578182fd5b6122a2836121c7565b600080600080608085870312156122fa578081fd5b612303856121c7565b966020860135965060408601359560600135945092505050565b60006020828403121561232e578081fd5b5035919050565b60008060408385031215612347578182fd5b8235915061221a602084016121c7565b60008060408385031215612369578182fd5b50508035926020909101359150565b60008060006060848603121561238c578283fd5b505081359360208301359350604090920135919050565b6000806000606084860312156123b7578283fd5b8351925060208401519150604084015190509250925092565b600080600080600060a086880312156123e7578081fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000815180845260208085019450808401835b838110156124425781516001600160a01b03168752958201959082019060010161241d565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000858252608060208301526124d9608083018661240a565b6001600160a01b03949094166040830152506060015292915050565b6000602080835283518082850152825b8181101561252157858101830151858201604001528201612505565b818111156125325783604083870101525b50601f01601f1916929092016040019392505050565b602080825260119082015270151608131a5b5a5d08115e18d959591959607a1b604082015260600190565b6020808252601d908201527f4d61782077616c6c657420686173206265656e20747269676765726564000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260149082015273416c7265616479206c61756e6368656420626f6960601b604082015260600190565b90815260200190565b600086825285602083015260a060408301526126ad60a083018661240a565b6001600160a01b0394909416606083015250608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b600082198211156126f9576126f9612754565b500190565b60008261271957634e487b7160e01b81526012600452602481fd5b500490565b600081600019048311821515161561273857612738612754565b500290565b60008282101561274f5761274f612754565b500390565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220609e9d18a53b7f370593073da3abeb5b718ae2511cc8918e6573cfb81257a54764736f6c63430008000033