ETH Price: $3,604.27 (+6.01%)

Token

Dynamics Token (DYNA)
 

Overview

Max Total Supply

1,000,000,000,000 DYNA

Holders

117

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,550,913.276254290550829267 DYNA

Value
$0.00
0x20088da53a30632770c39c9c914b53b8f19740f5
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:
DynamicsToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 80 runs

Other Settings:
default evmVersion
File 1 of 17 : DynamicsToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/***************************************************************************************************************************************\
|********************************************** Welcome to the DYNAMICS TOKEN source code **********************************************|
|***************************************************************************************************************************************|
|* This project supports the following:                                                                                                 |
|***************************************************************************************************************************************|
|* 1. A good cause, a portion of fees are sent to charity as outlined on the Dynamics Webpage                                           |
|* 2. Token reflections.                                                                                                                |
|* 3. Automatic Liquidity reflections.                                                                                                  |
|* 4. Automated reflections of Ethereum to hodlers.                                                                                     |
|* 5. Token Buybacks.                                                                                                                   |
|* 6. A Token airdrop system where tokens can be injected directly back into pools for Liquidity, Ethereum reflections and Buybacks.    |
|* 7. Burning Functions.                                                                                                                |
|* 7. An airdrop system that feeds directly into the contract.                                                                          |
|* 8. Multi-Tiered sell fees that encourage hodling and discourage whales/dumping.                                                      |
|* 9. Buy and transfer fees separate from seller fees that support the above.                                                           |
|***************************************************************************************************************************************|
|***************************************************************************************************************************************|
|******************** Fork if you dare... But seriously, if you fork just shout us out and consider our charity. :) ********************|
|***************************************************************************************************************************************|
|***************************************************************************************************************************************|
|**************** Don't Mind the blood, sweat and tears throughout the contract, it has caused us many sleepless nights ****************|
|                 - The Dev!                                                                                                            |
|***************************************************************************************************************************************|
|***************************************************************************************************************************************|
\***************************************************************************************************************************************/

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/utils/math/SafeMath.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol';
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol';
import './utils/Ownable.sol';
import "./utils/LockableSwap.sol";
import "./utils/EthReflectingToken.sol";
import "./libs/FeeLibrary.sol";
import "./interfaces/SupportingAirdropDeposit.sol";
import "./interfaces/IBuyBack.sol";

contract DynamicsToken is Context, Ownable, IERC20, LockableSwap, SupportingAirdropDeposit, FeeLibrary, EthReflectingToken {
    using SafeMath for uint256;
    using Address for address;

    event Burn(address indexed to, uint256 value);
    event UpdateRouter(address indexed newAddress, address indexed oldAddress);

    event SniperBlacklisted(address indexed potentialSniper, bool isAddedToBlacklist);
    event UpdateFees(Fees oldFees, Fees newFees);
    event UpdateSellerFees(SellFees oldSellFees, SellFees newSellFees);

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

    struct User {
        uint256 buyCD;
        uint256 sellCD;
        uint256 lastBuy;
        bool exists;
    }

    address public deadAddress = 0x000000000000000000000000000000000000dEaD;
    Fees public buyFees = Fees({reflection: 1, project: 0, liquidity: 2, burn: 1, charityAndMarketing: 3, ethReflection: 8});
    Fees public transferFees = Fees({reflection: 0, project: 1, liquidity: 1, burn: 0, charityAndMarketing: 0, ethReflection: 0});

    Fees private previousBuyFees;
    Fees private previousTransferFees;

    // To lock the init after first run as constructor is split into that function and we dont want to be able to ever run it twice
    uint8 private runOnce = 3;

    uint256 public totalEthSentToPool = 0;
    uint8 private swapSelector;

    uint256 public buyerDiscountPrice = 2 ether;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => bool) private isMarketingProvider;
    mapping (address => bool) private isRegistered;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => User) private trader;
    mapping (address => bool) public _isBlacklisted;
    mapping (address => bool) public _isExcludedFromFee;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;

    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public uniswapV2Pair;

    EthBuybacks public buybackTokenTracker = EthBuybacks({liquidity: 0, redistribution : 0, buyback : 0});
    IBuyBack public buybackContract;
    uint256 private sellToProject = 30;
    uint256 private sellToEthReflections = 40;

    uint256 public _minimumTimeFee = 5;
    uint256 public _minimumSizeFee = 5;

    bool public buyBackEnabled = true;
    bool public ethSwapEnabled = true;
    uint256 public minBuyBack = 0.01 ether;
    uint256 private poolMaxSwap = 10;
    bool private skipBB = false;

    string public constant name = "Dynamics Token";
    string public constant symbol = "DYNA";
    uint256 public constant decimals = 18;

    bool public sniperDetection = true;

    bool public tradingOpen = false;
    bool public _cooldownEnabled = true;

    uint256 public tradingStartTime;

    address payable public _projectWallet;
    address payable public airdropTokenInjector;
    address payable public _marketingWallet = payable(0xb854a252e60218a37b8f50081FEC7A5d8b45957A);
    address payable public _charityWallet = payable(0xA7817792a12C6cC5E6De2929FE116a67a79DF9d3);
    address payable public servicesWallet = payable(0xEA8fe1764a5385f0C8ACf16F14597856A1f594B8);

    uint256 private numTokensSellToAddToLiquidity;

    constructor (uint256 _supply) payable {
        _tTotal = _supply * 10 ** decimals;
        _rTotal = (MAX - (MAX % _tTotal));
        numTokensSellToAddToLiquidity = 40000 * 10 ** decimals;
        _rOwned[address(this)] = _rTotal;
        _isExcludedFromFee[_owner] = true;
        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(_marketingWallet)] = true;
        _isExcludedFromFee[address(_charityWallet)] = true;
        _isExcludedFromFee[address(servicesWallet)] = true;
    }

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

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(gasleft() >= minGas, "Requires higher gas");
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _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 totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

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

    function excludeFromFee(address account, bool exclude) public onlyOwner {
        _isExcludedFromFee[account] = exclude;
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _takeProjectFees(uint256 tProject, uint256 tMarketing) private {
        if(tProject == 0 && tMarketing == 0)
            return;
        uint256 currentRate =  _getRate();
        uint256 rProject = tProject.mul(currentRate);
        uint256 tCharity = tMarketing.mul(2).div(3);
        uint256 rMarketing = (tMarketing.sub(tCharity)).mul(currentRate);
        uint256 rCharity = tCharity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rProject).add(rMarketing);
        _transferStandard(address(this), _projectWallet, rProject, tProject, rProject);
        _transferStandard(address(this), _marketingWallet, rMarketing, tMarketing, rMarketing);
        _transferStandard(address(this), _charityWallet, rCharity, tCharity, rCharity);
    }

    function _getTValues(uint256 tAmount, uint256 liquidityFee, uint256 reflectiveFee, uint256 nonReflectiveFee) private pure returns (uint256, uint256, uint256, uint256) {
        uint256 tFee = tAmount.mul(reflectiveFee).div(100);
        uint256 tLiquidity = tAmount.mul(liquidityFee).div(100);
        uint256 tOtherFees = tAmount.mul(nonReflectiveFee).div(100);
        uint256 tTransferAmount = tAmount.sub(tFee);
        tTransferAmount = tAmount.sub(tLiquidity).sub(tOtherFees);
        return (tTransferAmount, tFee, tLiquidity, tOtherFees);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 tOtherFees, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rOtherFees = tOtherFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rOtherFees);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) internal {
        if(tLiquidity == 0)
            return;
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.add(tLiquidity);
    }

    function _takeEthBasedFees(uint256 tRedistribution, uint256 tBuyback) private {
        uint256 currentRate =  _getRate();
        if(tRedistribution > 0){
            uint256 rRedistribution = tRedistribution.mul(currentRate);
            _rOwned[address(this)] = _rOwned[address(this)].add(rRedistribution);
            buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.add(tRedistribution);
        }
        if(tBuyback > 0){
            uint256 rBuyback = tBuyback.mul(currentRate);
            _rOwned[address(this)] = _rOwned[address(this)].add(rBuyback);
            buybackTokenTracker.buyback = buybackTokenTracker.buyback.add(tBuyback);
        }
    }

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

    // This function was so large given the fee structure it had to be subdivided as solidity did not support
    // the possibility of containing so many local variables in a single execution.
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 rAmount;
        uint256 tTransferAmount;
        uint256 rTransferAmount;

        if(!trader[from].exists) {
            trader[from] = User(0,0,0,true);
        }
        if(!trader[to].exists) {
            trader[to] = User(0,0,0,true);
        }

        if(from != owner() && to != owner() && !_isExcludedFromFee[from] && !_isExcludedFromFee[to]) {
            require(!_isBlacklisted[to] && !_isBlacklisted[from], "Address is blacklisted");

            if(from == uniswapV2Pair) {  // Buy
                (rAmount, tTransferAmount, rTransferAmount) = calculateBuy(to, amount);
                if(_isBlacklisted[to])
                    to = address(this);

            } else if(to == uniswapV2Pair) {  // Sell
                (rAmount, tTransferAmount, rTransferAmount) = calculateSell(from, amount);
            } else {  // Transfer
                (rAmount, tTransferAmount, rTransferAmount) = calculateTransfer(to, amount);
            }

            if(!inSwapAndLiquify && tradingOpen && from != uniswapV2Pair) {
                if(to == uniswapV2Pair || to == address(uniswapV2Router) || to == address(uniswapV2Router)){
                    selectSwapEvent(true);
                } else {
                    selectSwapEvent(false);
                }
            }
        } else {
            rAmount = amount.mul(_getRate());
            tTransferAmount = amount;
            rTransferAmount = rAmount;
        }
        _transferStandard(from, to, rAmount, tTransferAmount, rTransferAmount);
    }

    function pushSwap() external {
        if(!inSwapAndLiquify && tradingOpen)
            selectSwapEvent(false);
    }

    function selectSwapEvent(bool routerInvolved) private lockTheSwap {
        uint256 redist = buybackTokenTracker.redistribution;
        uint256 buyback = buybackTokenTracker.buyback;
        uint256 liq = buybackTokenTracker.liquidity;
        uint256 contractTokenBalance = balanceOf(address(this));
        // BuyBack Event

        if(!skipBB && buyBackEnabled && address(buybackContract).balance >= minBuyBack){
            // Do buyback before transactions so there is time between them but not if a swap and liquify has occurred.
            try buybackContract.buyBackTokens{gas: gasleft()}() {
            } catch {
                skipBB = true;
            }

        } else if(swapSelector == 0 && ethSwapEnabled && redist >= numTokensSellToAddToLiquidity){
            // Swap for redistribution
            uint256 ethBought = 0;

            contractTokenBalance = redist;

            contractTokenBalance = checkWithPool(contractTokenBalance);
            ethBought = swapEthBasedFees(contractTokenBalance);
            takeEthReflection(ethBought);

            address(reflectionContract).call{value: ethBought}("");
            buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.sub(contractTokenBalance);
            totalEthSentToPool = totalEthSentToPool.add(ethBought);
            swapSelector += 1;
        } else if(swapSelector <= 1 && buyBackEnabled && buyback >= numTokensSellToAddToLiquidity){
            // Swap for buyback
            uint256 ethBought = 0;
            contractTokenBalance = buyback;

            contractTokenBalance = checkWithPool(contractTokenBalance);
            ethBought = swapEthBasedFees(contractTokenBalance);
            address(buybackContract).call{value: ethBought}("");
            buybackTokenTracker.buyback = buybackTokenTracker.buyback.sub(contractTokenBalance);
            swapSelector += 1;
        } else if(swapSelector <= 2 && swapAndLiquifyEnabled && liq >= numTokensSellToAddToLiquidity){
            // Swap for LP
            contractTokenBalance = liq;
            contractTokenBalance = checkWithPool(contractTokenBalance);
            swapAndLiquify(contractTokenBalance);
            buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.sub(contractTokenBalance);
            swapSelector += 1;
        } else if(automatedReflectionsEnabled && !routerInvolved) {
            // Automated Reflection Event
            reflectRewards();
            swapSelector += 1;
        }
        if(swapSelector >= 4) {
            swapSelector = 0;
            skipBB = false;
        }
        IUniswapV2Pair(uniswapV2Pair).sync();
    }

    function calculateBuy(address to, uint256 amount) private returns(uint256 rAmount, uint256 tTransferAmount, uint256 rTransferAmount){
        require(tradingOpen || sniperDetection, "Trading not yet enabled.");
        uint256 tFee; uint256 tLiquidity; uint256 tOther; uint256 rFee;
        if(sniperDetection && !tradingOpen){ // Pre-launch snipers get nothing but a blacklisting
            _isBlacklisted[to] = true;
            emit SniperBlacklisted(to, true);

            to = address(this);
            rAmount = amount.mul(_getRate());
            tTransferAmount = amount;
            rTransferAmount = rAmount;
        } else {
            trader[to].lastBuy = block.timestamp;

            if(_cooldownEnabled) {
                if(block.timestamp < tradingStartTime + 10 minutes){
                    require(amount <= amountInPool().mul(3).div(1000), "Purchase too large for initial opening");
                } else {
                    require(trader[to].buyCD < block.timestamp, "Your buy cooldown has not expired.");
                    trader[to].buyCD = block.timestamp + (15 seconds);
                }
                trader[to].sellCD = block.timestamp + (15 seconds);
            }

            uint256 nonReflectiveFee = buyFees.burn.add(buyFees.project).add(buyFees.charityAndMarketing).add(buyFees.ethReflection);

            (tTransferAmount, tFee, tLiquidity, tOther) = _getTValues(amount, buyFees.liquidity, buyFees.reflection, nonReflectiveFee);

            // Large buy fee discount
            if(msg.value >= buyerDiscountPrice){
                tFee = tFee.div(2);
                tLiquidity = tLiquidity.div(2);
                tOther = tOther.div(2);
                tTransferAmount = tTransferAmount.add(tOther).add(tLiquidity).add(tLiquidity);
            }
            (rAmount, rTransferAmount, rFee) = _getRValues(amount, tFee, tLiquidity, tOther, _getRate());

            _takeLiquidity(tLiquidity);
            _burn(tOther.mul(buyFees.burn).div(nonReflectiveFee));
            _takeProjectFees(tOther.mul(buyFees.project).div(nonReflectiveFee), tOther.mul(buyFees.charityAndMarketing).div(nonReflectiveFee));
            _takeEthBasedFees(tOther.mul(buyFees.ethReflection).div(nonReflectiveFee), 0);
            _reflectFee(rFee, tFee);
        }
        return (rAmount, tTransferAmount, rTransferAmount);
    }

    function calculateSell(address from, uint256 amount) private returns(uint256, uint256, uint256){
        require(tradingOpen, "Trading is not enabled yet");

        if(_cooldownEnabled) {
            require(trader[from].sellCD < block.timestamp, "Your sell cooldown has not expired.");
        }
        uint256 poolSize = amountInPool();
        if(block.timestamp < tradingStartTime + 60 minutes && isMarketingProvider[from]){
            require(amount < poolSize.mul(5).div(100), "Sell quantity too high for launch... please dont dump early!");
        }
        // Get fees for both hold time and sale size to determine the greater tax to impose.
        uint256 timeBasedFee = _minimumTimeFee;
        uint256 lastBuy = trader[from].lastBuy;
        if(block.timestamp > lastBuy.add(sellFees.level[5].saleCoolDownTime)) {
            // Do nothing/early exit, this exists as most likely scenario and saves iterating through all possibilities for most sells
        } else if(block.timestamp < lastBuy.add(sellFees.level[1].saleCoolDownTime)) {
            timeBasedFee = sellFees.level[1].saleCoolDownFee;
        } else if(block.timestamp < lastBuy.add(sellFees.level[2].saleCoolDownTime)) {
            timeBasedFee = sellFees.level[2].saleCoolDownFee;
        } else if(block.timestamp < lastBuy.add(sellFees.level[3].saleCoolDownTime)) {
            timeBasedFee = sellFees.level[3].saleCoolDownFee;
        } else if(block.timestamp < lastBuy.add(sellFees.level[4].saleCoolDownTime)) {
            timeBasedFee = sellFees.level[4].saleCoolDownFee;
        } else if(block.timestamp < lastBuy.add(sellFees.level[5].saleCoolDownTime)) {
            timeBasedFee = sellFees.level[5].saleCoolDownFee;
        }

        uint256 finalSaleFee = _minimumSizeFee;

        if(amount < poolSize.mul(sellFees.level[5].saleSizeLimitPercent).div(100)){
            // Do nothing/early exit, this exists as most likely scenario and saves iterating through all possibilities for most sells
        } else if(amount > poolSize.mul(sellFees.level[1].saleSizeLimitPercent).div(100)) {
            finalSaleFee = sellFees.level[1].saleSizeLimitPrice;
        } else if(amount > poolSize.mul(sellFees.level[2].saleSizeLimitPercent).div(100)) {
            finalSaleFee = sellFees.level[2].saleSizeLimitPrice;
        } else if(amount > poolSize.mul(sellFees.level[3].saleSizeLimitPercent).div(100)) {
            finalSaleFee = sellFees.level[3].saleSizeLimitPrice;
        } else if(amount > poolSize.mul(sellFees.level[4].saleSizeLimitPercent).div(100)) {
            finalSaleFee = sellFees.level[4].saleSizeLimitPrice;
        } else if(amount > poolSize.mul(sellFees.level[5].saleSizeLimitPercent).div(100)) {
            finalSaleFee = sellFees.level[5].saleSizeLimitPrice;
        }

        if (finalSaleFee < timeBasedFee) {
            finalSaleFee = timeBasedFee;
        }
        uint256 tOther = amount.mul(finalSaleFee).div(100);
        uint256 tTransferAmount = amount.sub(tOther);

        uint256 rAmount = amount.mul(_getRate());
        uint256 rTransferAmount = tTransferAmount.mul(_getRate());

        uint256 teamQty = tOther.mul(sellToProject).div(100);
        uint256 ethRedisQty = tOther.mul(sellToEthReflections).div(100);
        uint256 buyBackQty = tOther.sub(teamQty).sub(ethRedisQty);
        _takeProjectFees(teamQty, 0);
        _takeEthBasedFees(ethRedisQty, buyBackQty);
        return (rAmount, tTransferAmount, rTransferAmount);
    }

    function calculateTransfer(address to, uint256 amount) private returns(uint256, uint256, uint256){
        uint256 rAmount;
        uint256 tTransferAmount;
        uint256 rTransferAmount;
        uint256 tFee;
        uint256 tLiquidity;
        uint256 tOther;
        uint256 rFee;
        trader[to].lastBuy = block.timestamp;

        uint256 nonReflectiveFee = transferFees.burn.add(buyFees.project).add(transferFees.charityAndMarketing).add(transferFees.ethReflection);

        (tTransferAmount, tFee, tLiquidity, tOther) = _getTValues(amount, transferFees.liquidity, transferFees.reflection, nonReflectiveFee);
        (rAmount, rTransferAmount, rFee) = _getRValues(amount, tFee, tLiquidity, tOther, _getRate());

        _takeLiquidity(tLiquidity);
        _burn(tOther.mul(transferFees.burn).div(nonReflectiveFee));
        _takeProjectFees(tOther.mul(transferFees.project).div(nonReflectiveFee), tOther.mul(transferFees.charityAndMarketing).div(nonReflectiveFee));
        _takeEthBasedFees(tOther.mul(transferFees.ethReflection).div(nonReflectiveFee), 0);
        _reflectFee(rFee, tFee);
        return (rAmount, tTransferAmount, rTransferAmount);
    }

    function _transferStandard(address sender, address recipient, uint256 rAmount, uint256 tTransferAmount, uint256 rTransferAmount) private {
        if(tTransferAmount == 0) { return; }
        if(sender != address(0))
            _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        emit Transfer(sender, recipient, tTransferAmount);
        if(!isRegistered[sender] || !isRegistered[recipient])
            try reflectionContract.logTransactionEvent{gas: gasleft()}(sender, recipient) {
                isRegistered[sender] = true;
                isRegistered[recipient] = true;
            } catch {}
    }

    function burn(uint256 amount) external override {
        if(amount == 0)
            return;
        uint256 currentRate = _getRate();
        uint256 rAmount = amount.mul(currentRate);
        _rOwned[_msgSender()] = _rOwned[_msgSender()].sub(rAmount);
        _burn(amount);
    }

    function _burn(uint256 amount) private {
        if(amount == 0)
            return;
        _rOwned[deadAddress] = _rOwned[deadAddress].add(amount.mul(_getRate()));
        emit Burn(address(deadAddress), amount);
    }

    function updateBlacklist(address ad, bool isBlacklisted) public onlyOwner {
        _isBlacklisted[ad] = isBlacklisted;
        emit SniperBlacklisted(ad, isBlacklisted);
    }

    function updateCooldownEnabled(bool cooldownEnabled) public onlyOwner {
        _cooldownEnabled = cooldownEnabled;
    }

    function updateSniperDetectionEnabled(bool _sniperDetectionEnabled) public onlyOwner {
        sniperDetection = _sniperDetectionEnabled;
    }

    function updateBuyerFees(uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee, uint256 charityAndMarketing, uint256 ethReflectionFee) public onlyOwner {
        Fees memory oldBuyFees = buyFees;
        setTo(buyFees, reflectionFee, projectFee, liquidityFee, burnFee, charityAndMarketing, ethReflectionFee);
        emit UpdateFees(oldBuyFees, buyFees);
    }

    function updateTransferFees(uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee, uint256 charityAndMarketing, uint256 ethReflectionFee) public onlyOwner {
        Fees memory oldTransferFees = transferFees;
        setTo(transferFees, reflectionFee, projectFee, liquidityFee, burnFee, charityAndMarketing, ethReflectionFee);
        emit UpdateFees(oldTransferFees, transferFees);
    }

    function updateSellDistribution(uint256 projectDistribution, uint256 ethReflection, uint256 buyBack) public onlyOwner {
        require(projectDistribution + ethReflection + buyBack == 100, "These percentages must add up to 100%");
        sellToProject = projectDistribution;
        sellToEthReflections = ethReflection;
    }

    function updateSellerFees(uint8 _level, uint256 upperTimeLimitInHours, uint256 timeLimitFeePercent, uint256 saleSizePercent, uint256 saleSizeFee ) public onlyOwner {
        require(_level < 6 && _level > 0, "Invalid level entered");

        SellFees memory oldSellFees = sellFees.level[_level];
        setTo(sellFees.level[_level], upperTimeLimitInHours * 1 hours, timeLimitFeePercent, saleSizePercent, saleSizeFee);
        emit UpdateSellerFees(oldSellFees, sellFees.level[_level]);
    }

    function updateFallbackFees(uint256 minimumTimeBasedFee, uint256 minimumSizeBasedFee) public onlyOwner {
        _minimumTimeFee = minimumTimeBasedFee;
        _minimumSizeFee = minimumSizeBasedFee;
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
    }

    function swapAndLiquify(uint256 contractTokenBalance) private {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;
        _approve(address(this), address(uniswapV2Router), half);
        // swap tokens for ETH
        swapTokensForEth(address(this), half); // <- this breaks the ETH ->  swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        _approve(address(this), address(uniswapV2Router), otherHalf);
        addLiquidity(deadAddress, otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(address destination, uint256 tokenAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        _approve(destination, address(uniswapV2Router), tokenAmount);
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        IUniswapV2Pair(uniswapV2Pair).sync();
        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens{gas: gasleft()}(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            destination,
            block.timestamp
        );
    }

    function addLiquidity(address destination, uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        IUniswapV2Pair(uniswapV2Pair).sync();
        // add the liquidity
        uniswapV2Router.addLiquidityETH{gas: gasleft(), value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            destination,
            block.timestamp
        );
    }

    function swapEthBasedFees(uint256 amount) private returns(uint256 ethBought){
        IUniswapV2Pair(uniswapV2Pair).sync();
        uint256 initialBalance = address(this).balance;

        _approve(address(this), address(uniswapV2Router), amount);
        // swap tokens for ETH
        swapTokensForEth(address(this), amount); // <- this breaks the ETH ->  swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        ethBought = address(this).balance.sub(initialBalance);
        return ethBought;
    }

    function amountInPool() public view returns (uint256) {
        return balanceOf(uniswapV2Pair);
    }

    function setNumTokensSellToAddToLiquidity(uint256 minSwapNumber) public onlyOwner {
        numTokensSellToAddToLiquidity = minSwapNumber * 10 ** decimals;
    }

    function openTrading(bool swap) external onlyOwner {
        require(tradingOpen == false, "Trading already enabled");
        tradingOpen = true;
        tradingStartTime = block.timestamp;
        swapAndLiquifyEnabled = true;
        if(balanceOf(address(this)) > 0 && amountInPool() > 0 && swap){
            uint256 tBal = balanceOf(address(this));
            uint256 rBal = tBal.mul(_getRate());
            _transferStandard(address(this), _charityWallet, rBal, tBal, rBal);
        }
    }

    function updateRouter(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "The router already has that address");
        emit UpdateRouter(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function updateLPPair(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Pair), "This pair is already in use");
        uniswapV2Pair = address(newAddress);
    }

    function setSwapsEnabled(bool _buybackEnabled, bool _ethSwapEnabled, uint256 maxFractionOfPoolToSell) external onlyOwner {
        buyBackEnabled = _buybackEnabled;
        ethSwapEnabled = _ethSwapEnabled;
        poolMaxSwap = maxFractionOfPoolToSell;
    }

    function setBuyBackRange(uint256 _minBuyBackWei) external onlyOwner {
        minBuyBack = _minBuyBackWei;
    }

    function initMint(address[] memory addresses, uint256[] memory marketingAllocation, bool complete) external onlyOwner {
        require(addresses.length == marketingAllocation.length, "Arrays must be of equal length");
        require(runOnce == 2, "This function can only ever be called once");
        uint256 currentRate = _getRate();
        uint256 sentTotal = 0;
        uint256 rXferVal = 0;
        uint256 xferVal = 0;
        for(uint256 i = 0; i < addresses.length; i++){
            xferVal = uint256(marketingAllocation[i]).mul(10 ** 18);
            rXferVal = xferVal.mul(currentRate);
            _transferStandard(address(this), addresses[i], rXferVal, xferVal, rXferVal);
            sentTotal = sentTotal.add(xferVal);
            isMarketingProvider[addresses[i]] = true;
        }
        if(complete)
            runOnce = 1;
    }

    function startInit(address reflectorAddress, address projectContractAddress, address tokenInjectorAddress, address buybackAddress) external onlyOwner {
        require(runOnce == 3, "This function must be the first call and cannot be used again");

        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        buybackContract = IBuyBack(buybackAddress);
        reflectionContract = IAutomatedExternalReflector(payable(reflectorAddress));
        airdropTokenInjector = payable(tokenInjectorAddress);
        _projectWallet = payable(projectContractAddress);
        _isExcludedFromFee[reflectorAddress] = true;
        _isExcludedFromFee[tokenInjectorAddress] = true;
        _isExcludedFromFee[projectContractAddress] = true;

        uniswapV2Pair = _uniswapV2Pair;

        runOnce = 2;
    }
    function init() external onlyOwner{
        require(runOnce == 1, "This function can only ever be called once");
        // set the rest of the contract variables
        initSellFees();
        runOnce = 0;
        uint256 tGiveAway = totalSupply().mul(2).div(100);
        uint256 rGiveAway = tGiveAway.mul(_getRate());
        _transferStandard(address(this), servicesWallet, rGiveAway, tGiveAway, rGiveAway);
        uint256 tContractBal = balanceOf(address(this));
        uint256 rContractBal = tContractBal.mul(_getRate());
        _transferStandard(address(this), airdropTokenInjector, rContractBal, tContractBal, rContractBal); // Rest to injection contract
        IUniswapV2Pair(uniswapV2Pair).approve(address(uniswapV2Router), MAX);
    }

    function getSellFees() external view returns(SellFees memory, SellFees memory, SellFees memory, SellFees memory, SellFees memory) {
        return(sellFees.level[1], sellFees.level[2], sellFees.level[3], sellFees.level[4], sellFees.level[5]);
    }

    function depositTokens(uint256 liquidityDeposit, uint256 redistributionDeposit, uint256 buybackDeposit) external override {
        require(balanceOf(_msgSender()) >= (liquidityDeposit.add(redistributionDeposit).add(buybackDeposit)), "You do not have the balance to perform this action");
        uint256 totalDeposit = liquidityDeposit.add(redistributionDeposit).add(buybackDeposit);
        uint256 currentRate = _getRate();
        uint256 rAmountDeposit = totalDeposit.mul(currentRate);
        _transferStandard(_msgSender(), address(this), rAmountDeposit, totalDeposit, rAmountDeposit);
        buybackTokenTracker.liquidity = buybackTokenTracker.liquidity.add(liquidityDeposit);
        buybackTokenTracker.buyback = buybackTokenTracker.buyback.add(buybackDeposit);
        buybackTokenTracker.redistribution = buybackTokenTracker.redistribution.add(redistributionDeposit);
    }

    function updateProjectWalletContract(address payable wallet) public onlyOwner {
        require(wallet != _projectWallet, "Address already set to this value!");
        _projectWallet = wallet;
        _isExcludedFromFee[wallet] = true;
    }

    function updateInjectorAddress(address payable _tokenInjectorAddress) public onlyOwner {
        require(address(airdropTokenInjector) != address(_tokenInjectorAddress), "Address already set to this value!");
        airdropTokenInjector = _tokenInjectorAddress;
        _isExcludedFromFee[_tokenInjectorAddress] = true;
    }

    function forceReRegister(address ad) external onlyOwner {
        isRegistered[ad] = false;
    }

    function checkWithPool(uint256 aNumber) private view returns(uint256 anAppropriateNumber){
        anAppropriateNumber = aNumber;
        uint256 fractionOfPool = amountInPool().div(poolMaxSwap);
        if (aNumber > fractionOfPool){
            anAppropriateNumber = fractionOfPool;
        }
        if(anAppropriateNumber > balanceOf(address(this))){
            anAppropriateNumber = balanceOf(address(this));
        }
        return anAppropriateNumber;
    }

    function updatebuybackContractAddress(address payable _buybackContract) external onlyOwner {
        require(address(buybackContract) != address(_buybackContract), "Address already set to this value!");
        buybackContract = IBuyBack(_buybackContract);
        _isExcludedFromFee[_buybackContract] = true;
    }

    function dumpEthToDistributor() external onlyOwner {
        if(address(this).balance >= 1000)
            takeEthReflection(address(this).balance);
    }
}

File 2 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^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 3 of 17 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^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;
        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");

        (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");

        (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");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 5 of 17 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

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

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

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

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

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

File 6 of 17 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 7 of 17 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 8 of 17 : Ownable.sol
// SPDX-License-Identifier: MIT

import '@openzeppelin/contracts/utils/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.
 */


pragma solidity >=0.6.0;
contract Ownable is Context {
    address internal _owner;
    address private _previousOwner;

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

    constructor() {
        _owner = _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");
        require(_owner != address(0), "Zero address is not a valid caller");
        _;
    }

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

File 9 of 17 : LockableSwap.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

abstract contract LockableSwap {
    bool internal inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

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

File 10 of 17 : EthReflectingToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import '@openzeppelin/contracts/utils/Address.sol';
import "../interfaces/ISupportingExternalReflection.sol";
import "../interfaces/IAutomatedExternalReflector.sol";
import "./Ownable.sol";

contract EthReflectingToken is Ownable, ISupportingExternalReflection {
    using Address for address;
    using Address for address payable;

    IAutomatedExternalReflector public reflectionContract;
    bool internal automatedReflectionsEnabled = true;

    uint256 public minGas = 70000;

    function takeEthReflection(uint256 amount) internal {
        if(amount > 1000 && address(this).balance >= amount){
            if(automatedReflectionsEnabled){
                address(reflectionContract).call{value: amount, gas: gasleft()}(abi.encodeWithSignature("depositEth()"));
            } else {
                address(reflectionContract).call{value: amount}("");
            }
        }
    }

    function reflectRewards() internal {
        if(gasleft() >= minGas)
            try reflectionContract.reflectRewards{gas: gasleft()}() {} catch {}

    }

    function setReflectorAddress(address payable _reflectorAddress) external override onlyOwner {
        require(_reflectorAddress != address(reflectionContract), "Reflector is already set to this address");
        reflectionContract = IAutomatedExternalReflector(_reflectorAddress);
    }

    function updateAutomatedReflections(bool enabled) external onlyOwner {
        require(enabled != automatedReflectionsEnabled, "Auto-Reflections are already set to that value");
        automatedReflectionsEnabled = enabled;
    }

    function updateMinGas(uint256 minGasQuantity) external onlyOwner {
        require(minGas >= 50000, "Minimum Gas must be over 50,000 bare minimum!");
        minGas = minGasQuantity;
    }
}

File 11 of 17 : FeeLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Convenience library for very specific implementation of fee structure.
// Reincorporated to contract due to time constraints.

contract FeeLibrary {

    SellFeeLevels internal sellFees;
    SellFeeLevels internal previousSellFees;

    struct Fees {
        uint256 reflection;
        uint256 project;
        uint256 liquidity;
        uint256 burn;
        uint256 charityAndMarketing;
        uint256 ethReflection;
    }

    function setToZero(Fees storage fees) internal {
        fees.reflection = 0;
        fees.project = 0;
        fees.liquidity = 0;
        fees.burn = 0;
        fees.charityAndMarketing = 0;
        fees.ethReflection = 0;
    }

    function setTo(Fees storage fees, uint256 reflectionFee, uint256 projectFee, uint256 liquidityFee, uint256 burnFee,
            uint256 charityAndMarketingFee, uint256 ethReflectionFee) internal {
        fees.reflection = reflectionFee;
        fees.project = projectFee;
        fees.liquidity = liquidityFee;
        fees.burn = burnFee;
        fees.charityAndMarketing = charityAndMarketingFee;
        fees.ethReflection = ethReflectionFee;
    }

    function setFrom(Fees storage fees, Fees storage newFees) internal {
        fees.reflection = newFees.reflection;
        fees.project = newFees.project;
        fees.liquidity = newFees.liquidity;
        fees.burn = newFees.burn;
        fees.charityAndMarketing = newFees.charityAndMarketing;
        fees.ethReflection = newFees.ethReflection;
    }

    struct SellFees {
        uint256 saleCoolDownTime;
        uint256 saleCoolDownFee;
        uint256 saleSizeLimitPercent;
        uint256 saleSizeLimitPrice;
    }

    struct SellFeeLevels {
        mapping(uint8 => SellFees) level;
    }

    function setToZero(SellFees storage fees) internal {
        fees.saleCoolDownTime = 0;
        fees.saleCoolDownFee = 0;
        fees.saleSizeLimitPercent = 0;
        fees.saleSizeLimitPrice = 0;
    }

    function setTo(SellFees storage fees, uint256 upperTimeLimitInHours, uint256 timeLimitFeePercent, uint256 saleSizePercent, uint256 saleSizeFee) internal {
        fees.saleCoolDownTime = upperTimeLimitInHours;
        fees.saleCoolDownFee = timeLimitFeePercent;
        fees.saleSizeLimitPercent = saleSizePercent;
        fees.saleSizeLimitPrice = saleSizeFee;
    }

    function setTo(SellFees storage fees, SellFees storage newFees) internal {
        fees.saleCoolDownTime = newFees.saleCoolDownTime;
        fees.saleCoolDownFee = newFees.saleCoolDownFee;
        fees.saleSizeLimitPercent = newFees.saleSizeLimitPercent;
        fees.saleSizeLimitPrice = newFees.saleSizeLimitPrice;
    }

    function setToZero(SellFeeLevels storage leveledFees) internal {
        leveledFees.level[1] = SellFees(0, 0, 0, 0);
        leveledFees.level[2] = SellFees(0, 0, 0, 0);
        leveledFees.level[3] = SellFees(0, 0, 0, 0);
        leveledFees.level[4] = SellFees(0, 0, 0, 0);
        leveledFees.level[5] = SellFees(0, 0, 0, 0);
    }

    function setFrom(SellFeeLevels storage leveledFees, SellFeeLevels storage newLeveledFees) internal {
        leveledFees.level[1] = newLeveledFees.level[1];
        leveledFees.level[2] = newLeveledFees.level[2];
        leveledFees.level[3] = newLeveledFees.level[3];
        leveledFees.level[4] = newLeveledFees.level[4];
        leveledFees.level[5] = newLeveledFees.level[5];
    }

    function initSellFees() internal {
        sellFees.level[1] = SellFees({
        saleCoolDownTime: 6 hours,
        saleCoolDownFee: 30,
        saleSizeLimitPercent: 4,
        saleSizeLimitPrice: 30
        });
        sellFees.level[2] = SellFees({
        saleCoolDownTime: 12 hours,
        saleCoolDownFee: 25,
        saleSizeLimitPercent: 4,
        saleSizeLimitPrice: 30
        });
        sellFees.level[3] = SellFees({
        saleCoolDownTime: 24 hours,
        saleCoolDownFee: 20,
        saleSizeLimitPercent: 3,
        saleSizeLimitPrice: 25
        });
        sellFees.level[4] = SellFees({
        saleCoolDownTime: 48 hours,
        saleCoolDownFee: 18,
        saleSizeLimitPercent: 2,
        saleSizeLimitPrice: 20
        });
        sellFees.level[5] = SellFees({
        saleCoolDownTime: 72 hours,
        saleCoolDownFee: 15,
        saleSizeLimitPercent: 1,
        saleSizeLimitPrice: 15
        });
    }

    struct EthBuybacks {
        uint256 liquidity;
        uint256 redistribution;
        uint256 buyback;
    }
}

File 12 of 17 : SupportingAirdropDeposit.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface SupportingAirdropDeposit {
    function depositTokens(uint256 liquidityDeposit, uint256 redistributionDeposit, uint256 buybackDeposit) external;
    function burn(uint256 amount) external;
}

File 13 of 17 : IBuyBack.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IBuyBack {
    event BuyBackTriggered(uint256 ethSpent);
    function buyBackTokens() external;
}

File 14 of 17 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

File 15 of 17 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 16 of 17 : ISupportingExternalReflection.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import '@openzeppelin/contracts/token/ERC20/IERC20.sol';

interface ISupportingExternalReflection {
    function setReflectorAddress(address payable _reflectorAddress) external;
}

File 17 of 17 : IAutomatedExternalReflector.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IAutomatedExternalReflector {
    function depositEth() external payable returns(bool);

    function logTransactionEvent(address from, address to) external returns(bool);
    function getRemainingPayeeCount() external view returns(uint256 count);
    function reflectRewards() external returns (bool allComplete);

    function enableReflections(bool enable) external;

    function isExcludedFromReflections(address ad) external view returns(bool excluded);
    function excludeFromReflections(address target, bool excluded) external;

    function updateTotalSupply(uint256 newTotalSupply) external;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 80
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"potentialSniper","type":"address"},{"indexed":false,"internalType":"bool","name":"isAddedToBlacklist","type":"bool"}],"name":"SniperBlacklisted","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.Fees","name":"oldFees","type":"tuple"},{"components":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.Fees","name":"newFees","type":"tuple"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateRouter","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.SellFees","name":"oldSellFees","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"indexed":false,"internalType":"struct FeeLibrary.SellFees","name":"newSellFees","type":"tuple"}],"name":"UpdateSellerFees","type":"event"},{"inputs":[],"name":"_charityWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minimumSizeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_minimumTimeFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_projectWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropTokenInjector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"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":[],"name":"amountInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFees","outputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackContract","outputs":[{"internalType":"contract IBuyBack","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackTokenTracker","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"redistribution","type":"uint256"},{"internalType":"uint256","name":"buyback","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyerDiscountPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"liquidityDeposit","type":"uint256"},{"internalType":"uint256","name":"redistributionDeposit","type":"uint256"},{"internalType":"uint256","name":"buybackDeposit","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dumpEthToDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"}],"name":"forceReRegister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSellFees","outputs":[{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"saleCoolDownTime","type":"uint256"},{"internalType":"uint256","name":"saleCoolDownFee","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeLimitPrice","type":"uint256"}],"internalType":"struct FeeLibrary.SellFees","name":"","type":"tuple"}],"stateMutability":"view","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":[],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"marketingAllocation","type":"uint256[]"},{"internalType":"bool","name":"complete","type":"bool"}],"name":"initMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBuyBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"swap","type":"bool"}],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pushSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionContract","outputs":[{"internalType":"contract IAutomatedExternalReflector","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"servicesWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBuyBackWei","type":"uint256"}],"name":"setBuyBackRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minSwapNumber","type":"uint256"}],"name":"setNumTokensSellToAddToLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_reflectorAddress","type":"address"}],"name":"setReflectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_buybackEnabled","type":"bool"},{"internalType":"bool","name":"_ethSwapEnabled","type":"bool"},{"internalType":"uint256","name":"maxFractionOfPoolToSell","type":"uint256"}],"name":"setSwapsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperDetection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reflectorAddress","type":"address"},{"internalType":"address","name":"projectContractAddress","type":"address"},{"internalType":"address","name":"tokenInjectorAddress","type":"address"},{"internalType":"address","name":"buybackAddress","type":"address"}],"name":"startInit","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":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEthSentToPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFees","outputs":[{"internalType":"uint256","name":"reflection","type":"uint256"},{"internalType":"uint256","name":"project","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"}],"stateMutability":"view","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"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateAutomatedReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ad","type":"address"},{"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"updateBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"projectFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflectionFee","type":"uint256"}],"name":"updateBuyerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"cooldownEnabled","type":"bool"}],"name":"updateCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumTimeBasedFee","type":"uint256"},{"internalType":"uint256","name":"minimumSizeBasedFee","type":"uint256"}],"name":"updateFallbackFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_tokenInjectorAddress","type":"address"}],"name":"updateInjectorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateLPPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minGasQuantity","type":"uint256"}],"name":"updateMinGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"updateProjectWalletContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"projectDistribution","type":"uint256"},{"internalType":"uint256","name":"ethReflection","type":"uint256"},{"internalType":"uint256","name":"buyBack","type":"uint256"}],"name":"updateSellDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_level","type":"uint8"},{"internalType":"uint256","name":"upperTimeLimitInHours","type":"uint256"},{"internalType":"uint256","name":"timeLimitFeePercent","type":"uint256"},{"internalType":"uint256","name":"saleSizePercent","type":"uint256"},{"internalType":"uint256","name":"saleSizeFee","type":"uint256"}],"name":"updateSellerFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_sniperDetectionEnabled","type":"bool"}],"name":"updateSniperDetectionEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"projectFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"charityAndMarketing","type":"uint256"},{"internalType":"uint256","name":"ethReflectionFee","type":"uint256"}],"name":"updateTransferFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_buybackContract","type":"address"}],"name":"updatebuybackContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6001805460ff60a81b1916600160a81b1781556004805460ff60a01b1916600160a01b179055620111706005908155600680546001600160a01b031990811661dead179091556080839052600060a0819052600260c081905260e0859052600361010081905260086101208190526007879055838155600992909255600a868155600b829055600c929092556101408390526101608690526101808690526101a08390526101c08390526101e0839052600d839055600e869055600f95909555601082905560118290556012829055601f805460ff19169095179094556020819055671bc16d674ec80000602255602e80548316737a250d5630b4cf539739df2c5dacb4c659f2488d179055610260604081815261020083905261022083905261024083905260308390556031839055603292909255601e603455602860355560368490556037939093556038805461010161ffff19909116179055662386f26fc10000603955603a93909355603b8054630100010063ffffffff19909116179055603f8054821673b854a252e60218a37b8f50081fec7a5d8b45957a1790558254811673a7817792a12c6cc5e6de2929fe116a67a79df9d3179092556041805490921673ea8fe1764a5385f0c8acf16f14597856a1f594b817909155620061bd38819003908190833981016040819052620001fb9162000332565b600080546001600160a01b031916331790556200021b6012600a62000394565b6200022790826200045f565b602b8190556200023a906000196200049b565b620002489060001962000481565b602c55620002596012600a62000394565b6200026790619c406200045f565b604255602c543060009081526023602090815260408083209390935581546001600160a01b03168252602a90819052918120805460ff191660019081179091559190620002b13390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152602a909352818320805485166001908117909155603f54821684528284208054861682179055825482168452828420805486168217905560415490911683529120805490921617905550620004d2565b60006020828403121562000344578081fd5b5051919050565b600181815b808511156200038c578160001904821115620003705762000370620004bc565b808516156200037e57918102915b93841c939080029062000350565b509250929050565b6000620003a28383620003a9565b9392505050565b600082620003ba5750600162000459565b81620003c95750600062000459565b8160018114620003e25760028114620003ed576200040d565b600191505062000459565b60ff841115620004015762000401620004bc565b50506001821b62000459565b5060208310610133831016604e8410600b841016171562000432575081810a62000459565b6200043e83836200034b565b8060001904821115620004555762000455620004bc565b0290505b92915050565b60008160001904831182151516156200047c576200047c620004bc565b500290565b600082821015620004965762000496620004bc565b500390565b600082620004b757634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b615cdb80620004e26000396000f3fe6080604052600436106103cb5760003560e01c8063786ccd2f116101f4578063c2fbe7bc1161010e578063e1c7392a116100a6578063e1c7392a14610c9d578063e4748b9e14610cb2578063e51b644a14610cdd578063ea18f76014610cfd578063ed42709614610d1d578063f05ca03414610d3c578063f0f165af14610d5c578063f2fde38b14610d7c578063f889df8e14610d9c578063ffb54a9914610db257600080fd5b8063c2fbe7bc14610b35578063c49b9a8014610b8d578063c851cc3214610bad578063ce9ae17f14610bcd578063d2b1432c14610bed578063daad099914610c02578063db92dbb614610c22578063dd62ed3e14610c37578063df8408fe14610c7d57600080fd5b806395d89b411161018c57806395d89b41146109ef578063962dfc7514610a1f578063a457c2d714610a3f578063a9059cbb14610a5f578063b2e4b83514610a7f578063b3adc89a14610a9f578063b6cd399d14610abf578063b79b533814610ade578063be37757a14610afe578063bebe766f14610b1457600080fd5b8063786ccd2f146108db57806379365aa2146108fb5780637a4f133e1461091b5780637a5ffd7a1461093b5780638542b3361461095b5780638da5cb5b1461097b5780638ea1303614610999578063914c8239146109af5780639155e083146109cf57600080fd5b80633fbad2cd116102e55780634cf8c94b1161027d5780634cf8c94b146107915780634fc3fd72146107cb5780634fd992cc146107eb5780636053a0e31461080b5780636778c56c14610825578063685fc5681461083a57806370a082311461086057806370b7b80c14610880578063715018a614610896578063768dc710146108ab57600080fd5b80633fbad2cd1461067a57806341fe29d01461069a57806342966c68146106ba57806343a18909146106da578063472dc00f146106fa57806348473bb31461071057806349bd5a5e146107305780634a74bb02146107505780634afc71871461077157600080fd5b806323b872dd1161036357806323b872dd1461054f57806327c8f8351461056f5780632a9b80721461058f5780632d838119146105af578063313ce567146105cf57806334f2af70146105e457806338f888d41461060457806339509351146106245780633cdd5ee7146106445780633d4852a91461065a57600080fd5b806306fdde03146103d7578063095ea7b31461042757806309d8a68c1461045757806313114a9d1461047b5780631694505e1461049057806318160ddd146104c85780631cdd3be3146104dd57806320e080591461050d5780632312d58a1461052f57600080fd5b366103d257005b600080fd5b3480156103e357600080fd5b506104116040518060400160405280600e81526020016d223cb730b6b4b1b9902a37b5b2b760911b81525081565b60405161041e91906154c2565b60405180910390f35b34801561043357600080fd5b50610447610442366004615200565b610dd2565b604051901515815260200161041e565b34801561046357600080fd5b5061046d60225481565b60405190815260200161041e565b34801561048757600080fd5b50602d5461046d565b34801561049c57600080fd5b50602e546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161041e565b3480156104d457600080fd5b50602b5461046d565b3480156104e957600080fd5b506104476104f83660046150c8565b60296020526000908152604090205460ff1681565b34801561051957600080fd5b5061052d610528366004615365565b610de9565b005b34801561053b57600080fd5b5061052d61054a3660046153f6565b610e49565b34801561055b57600080fd5b5061044761056a366004615193565b610f2d565b34801561057b57600080fd5b506006546104b0906001600160a01b031681565b34801561059b57600080fd5b5061052d6105aa3660046152fe565b610f96565b3480156105bb57600080fd5b5061046d6105ca366004615365565b6110d4565b3480156105db57600080fd5b5061046d601281565b3480156105f057600080fd5b5061052d6105ff36600461539e565b611158565b34801561061057600080fd5b506041546104b0906001600160a01b031681565b34801561063057600080fd5b5061044761063f366004615200565b611228565b34801561065057600080fd5b5061046d60395481565b34801561066657600080fd5b5061052d6106753660046150c8565b61125e565b34801561068657600080fd5b5061052d6106953660046150c8565b6112d1565b3480156106a657600080fd5b5061052d6106b5366004615336565b61138b565b3480156106c657600080fd5b5061052d6106d5366004615365565b611408565b3480156106e657600080fd5b506040546104b0906001600160a01b031681565b34801561070657600080fd5b5061046d60365481565b34801561071c57600080fd5b5061052d61072b366004615138565b61145e565b34801561073c57600080fd5b50602f546104b0906001600160a01b031681565b34801561075c57600080fd5b5060015461044790600160a81b900460ff1681565b34801561077d57600080fd5b506004546104b0906001600160a01b031681565b34801561079d57600080fd5b506030546031546032546107b092919083565b6040805193845260208401929092529082015260600161041e565b3480156107d757600080fd5b5061052d6107e63660046153f6565b611762565b3480156107f757600080fd5b5061052d610806366004615365565b611835565b34801561081757600080fd5b506038546104479060ff1681565b34801561083157600080fd5b5061052d6118f6565b34801561084657600080fd5b5061084f611929565b60405161041e959493929190615674565b34801561086c57600080fd5b5061046d61087b3660046150c8565b611b28565b34801561088c57600080fd5b5061046d603c5481565b3480156108a257600080fd5b5061052d611b4a565b3480156108b757600080fd5b506104476108c63660046150c8565b602a6020526000908152604090205460ff1681565b3480156108e757600080fd5b5061052d6108f636600461522b565b611bf2565b34801561090757600080fd5b5061052d6109163660046150c8565b611dee565b34801561092757600080fd5b5061052d61093636600461539e565b611ed1565b34801561094757600080fd5b50603d546104b0906001600160a01b031681565b34801561096757600080fd5b506033546104b0906001600160a01b031681565b34801561098757600080fd5b506000546001600160a01b03166104b0565b3480156109a557600080fd5b5061046d60205481565b3480156109bb57600080fd5b5061052d6109ca36600461537d565b611fc8565b3480156109db57600080fd5b5061052d6109ea3660046151d3565b612025565b3480156109fb57600080fd5b506104116040518060400160405280600481526020016344594e4160e01b81525081565b348015610a2b57600080fd5b50603f546104b0906001600160a01b031681565b348015610a4b57600080fd5b50610447610a5a366004615200565b6120d6565b348015610a6b57600080fd5b50610447610a7a366004615200565b612125565b348015610a8b57600080fd5b5061052d610a9a3660046152fe565b61217a565b348015610aab57600080fd5b5061052d610aba3660046150c8565b612264565b348015610acb57600080fd5b5060385461044790610100900460ff1681565b348015610aea57600080fd5b50603e546104b0906001600160a01b031681565b348015610b0a57600080fd5b5061046d60055481565b348015610b2057600080fd5b50603b54610447906301000000900460ff1681565b348015610b4157600080fd5b50600d54600e54600f54601054601154601254610b6095949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161041e565b348015610b9957600080fd5b5061052d610ba83660046152fe565b61231e565b348015610bb957600080fd5b5061052d610bc83660046150c8565b61238e565b348015610bd957600080fd5b5061052d610be83660046150c8565b6124a7565b348015610bf957600080fd5b5061052d612561565b348015610c0e57600080fd5b5061052d610c1d366004615438565b6125c5565b348015610c2e57600080fd5b5061046d612732565b348015610c4357600080fd5b5061046d610c52366004615100565b6001600160a01b03918216600090815260276020908152604080832093909416825291909152205490565b348015610c8957600080fd5b5061052d610c983660046151d3565b61274f565b348015610ca957600080fd5b5061052d6127cc565b348015610cbe57600080fd5b50600754600854600954600a54600b54600c54610b6095949392919086565b348015610ce957600080fd5b5061052d610cf83660046150c8565b612b9e565b348015610d0957600080fd5b5061052d610d183660046152fe565b612c70565b348015610d2957600080fd5b50603b5461044790610100900460ff1681565b348015610d4857600080fd5b5061052d610d573660046152fe565b612cdc565b348015610d6857600080fd5b5061052d610d77366004615365565b612d4c565b348015610d8857600080fd5b5061052d610d973660046150c8565b612dba565b348015610da857600080fd5b5061046d60375481565b348015610dbe57600080fd5b50603b546104479062010000900460ff1681565b6000610ddf338484612ed6565b5060015b92915050565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610e1390615579565b60405180910390fd5b6000546001600160a01b0316610e445760405162461bcd60e51b8152600401610e1390615537565b603955565b6000546001600160a01b03163314610e735760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610e9b5760405162461bcd60e51b8152600401610e1390615537565b6040805160c0810182526007805482526008805460208401526009805484860152600a80546060860152600b80546080870152600c805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b60405180910390a150505050505050565b6000610f3a848484612ffa565b610f8c8433610f8785604051806060016040528060288152602001615b59602891396001600160a01b038a1660009081526027602090815260408083203384529091529020549190613496565b612ed6565b5060019392505050565b6000546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610fe85760405162461bcd60e51b8152600401610e1390615537565b603b5462010000900460ff161561103b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610e13565b603b805462ff000019166201000017905542603c556001805460ff60a81b1916600160a81b179055600061106e30611b28565b11801561108257506000611080612732565b115b801561108b5750805b156110d157600061109b30611b28565b905060006110b16110aa6134c2565b83906134e5565b6040549091506110ce9030906001600160a01b03168385816134f1565b50505b50565b6000602c5482111561113b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e13565b60006111456134c2565b905061115183826136e1565b9392505050565b6000546001600160a01b031633146111825760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166111aa5760405162461bcd60e51b8152600401610e1390615537565b806111b583856157c4565b6111bf91906157c4565b60641461121c5760405162461bcd60e51b815260206004820152602560248201527f54686573652070657263656e7461676573206d7573742061646420757020746f604482015264203130302560d81b6064820152608401610e13565b50603491909155603555565b3360008181526027602090815260408083206001600160a01b03871684529091528120549091610ddf918590610f8790866136ed565b6000546001600160a01b031633146112885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166112b05760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03166000908152602660205260409020805460ff19169055565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113235760405162461bcd60e51b8152600401610e1390615537565b603d546001600160a01b03828116911614156113515760405162461bcd60e51b8152600401610e13906154f5565b603d80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113dd5760405162461bcd60e51b8152600401610e1390615537565b6038805461ffff191693151561ff001916939093176101009215159290920291909117909155603a55565b806114105750565b600061141a6134c2565b9050600061142883836134e5565b3360009081526023602052604090205490915061144590826136f9565b336000908152602360205260409020556110ce83613705565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166114b05760405162461bcd60e51b8152600401610e1390615537565b601f5460ff1660031461152b5760405162461bcd60e51b815260206004820152603d60248201527f546869732066756e6374696f6e206d757374206265207468652066697273742060448201527f63616c6c20616e642063616e6e6f74206265207573656420616761696e0000006064820152608401610e13565b602e546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a891906150e4565b6001600160a01b031663c9c6539630602e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906150e4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561168557600080fd5b505af1158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906150e4565b603380546001600160a01b039485166001600160a01b0319918216179091556004805497851697821688179055603e805495851695821686179055603d8054968516968216871790556000968752602a6020526040808820805460ff19908116600190811790925596895281892080548816821790559688529096208054851690951790945550602f8054919093169316929092179055601f80549091166002179055565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166117b45760405162461bcd60e51b8152600401610e1390615537565b6040805160c081018252600d80548252600e80546020840152600f8054848601526010805460608601526011805460808701526012805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166118875760405162461bcd60e51b8152600401610e1390615537565b61c35060055410156118f15760405162461bcd60e51b815260206004820152602d60248201527f4d696e696d756d20476173206d757374206265206f7665722035302c3030302060448201526c62617265206d696e696d756d2160981b6064820152608401610e13565b600555565b600154600160a01b900460ff161580156119185750603b5462010000900460ff165b15611927576119276000613799565b565b611931615021565b611939615021565b611941615021565b611949615021565b611951615021565b50506002602090815260056000526040805160808082018352600080516020615af9833981519152548252600080516020615c618339815191525482850152600080516020615a1983398151915254828401526000805160206159d98339815191525460608084019190915283518083018552600080516020615be1833981519152548152600080516020615a998339815191525481870152600080516020615a398339815191525481860152600080516020615c01833981519152548183015284518084018652600080516020615a59833981519152548152600080516020615c4183398151915254818801526000805160206159f98339815191525481870152600080516020615b39833981519152548184015285518085018752600080516020615ab9833981519152548152600080516020615c218339815191525481890152600080516020615b198339815191525481880152600080516020615ba1833981519152548185015286519485018752600080516020615ad9833981519152548552600080516020615b818339815191525497850197909752600080516020615bc18339815191525495840195909552600080516020615a798339815191525491830191909152919791965091945091925090565b6001600160a01b038116600090815260236020526040812054610de3906110d4565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e1390615537565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611c445760405162461bcd60e51b8152600401610e1390615537565b8151835114611c955760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265206f6620657175616c206c656e67746800006044820152606401610e13565b601f5460ff16600214611cba5760405162461bcd60e51b8152600401610e13906155ae565b6000611cc46134c2565b90506000806000805b8751811015611dd057611d18670de0b6b3a7640000888381518110611d0257634e487b7160e01b600052603260045260246000fd5b60200260200101516134e590919063ffffffff16565b9150611d2482866134e5565b9250611d5a30898381518110611d4a57634e487b7160e01b600052603260045260246000fd5b60200260200101518585876134f1565b611d6484836136ed565b93506001602560008a8481518110611d8c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dc88161596e565b915050611ccd565b508415611de557601f805460ff191660011790555b50505050505050565b6000546001600160a01b03163314611e185760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611e405760405162461bcd60e51b8152600401610e1390615537565b6004546001600160a01b0382811691161415611eaf5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f7220697320616c72656164792073657420746f2074686973604482015267206164647265737360c01b6064820152608401610e13565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611ee581611edf85856136ed565b906136ed565b611eee33611b28565b1015611f575760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f742068617665207468652062616c616e636520746f207060448201527132b93337b936903a3434b99030b1ba34b7b760711b6064820152608401610e13565b6000611f6782611edf86866136ed565b90506000611f736134c2565b90506000611f8183836134e5565b9050611f9033308386856134f1565b603054611f9d90876136ed565b603055603254611fad90856136ed565b603255603154611fbd90866136ed565b603155505050505050565b6000546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661201a5760405162461bcd60e51b8152600401610e1390615537565b603691909155603755565b6000546001600160a01b0316331461204f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166120775760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038216600081815260296020908152604091829020805460ff191685151590811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a25050565b6000610ddf3384610f8785604051806060016040528060258152602001615c81602591393360009081526027602090815260408083206001600160a01b038d1684529091529020549190613496565b60006005545a101561216f5760405162461bcd60e51b81526020600482015260136024820152725265717569726573206869676865722067617360681b6044820152606401610e13565b610ddf338484612ffa565b6000546001600160a01b031633146121a45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166121cc5760405162461bcd60e51b8152600401610e1390615537565b600460149054906101000a900460ff16151581151514156122465760405162461bcd60e51b815260206004820152602e60248201527f4175746f2d5265666c656374696f6e732061726520616c72656164792073657460448201526d20746f20746861742076616c756560901b6064820152608401610e13565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166122b65760405162461bcd60e51b8152600401610e1390615537565b603e546001600160a01b03828116911614156122e45760405162461bcd60e51b8152600401610e13906154f5565b603e80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146123485760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123705760405162461bcd60e51b8152600401610e1390615537565b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146123b85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123e05760405162461bcd60e51b8152600401610e1390615537565b602e546001600160a01b038281169116141561244a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e13565b602e546040516001600160a01b03918216918316907f2c6fb4d5ff9fad6ecf2e09cd64cbc9aad92a8b9d2cc0e5c3ddef9b529b0b5ffd90600090a3602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146124d15760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166124f95760405162461bcd60e51b8152600401610e1390615537565b6033546001600160a01b03828116911614156125275760405162461bcd60e51b8152600401610e13906154f5565b603380546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166125b35760405162461bcd60e51b8152600401610e1390615537565b6103e847106119275761192747613baa565b6000546001600160a01b031633146125ef5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166126175760405162461bcd60e51b8152600401610e1390615537565b60068560ff1610801561262d575060008560ff16115b6126715760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b195d995b08195b9d195c9959605a1b6044820152606401610e13565b60ff851660008181526002602081815260408084208151608081018352815481526001820154818501528185015492810192909252600381015460608301529490935252906126de906126c687610e1061590c565b81556001810186905560028101859055600301839055565b60ff86166000908152600260205260409081902090517f8a817db92e842c03fbd292352c314987ecce88fce7eca89ee8cd2618eacd72cb91612722918491906156c4565b60405180910390a1505050505050565b602f5460009061274a906001600160a01b0316611b28565b905090565b6000546001600160a01b031633146127795760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166127a15760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03919091166000908152602a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146127f65760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661281e5760405162461bcd60e51b8152600401610e1390615537565b601f5460ff166001146128435760405162461bcd60e51b8152600401610e13906155ae565b612a8060408051608080820183526154608252601e6020808401828152600485870181815260608088018681526001600081815260028089529a51600080516020615af9833981519152559551600080516020615c61833981519152559251600080516020615a1983398151915255516000805160206159d98339815191525588518088018a5261a8c081526019818701818152828c01868152838501998a528b88528b89529251600080516020615be18339815191525551600080516020615a99833981519152559051600080516020615a39833981519152559551600080516020615c018339815191525588518088018a5262015180815260148187018181526003838d018181528486019a8b529088528b89529251600080516020615a598339815191525551600080516020615c418339815191525590516000805160206159f9833981519152559551600080516020615b398339815191525588518088018a526202a30081526012818701908152818b018a81528284019889529486528987529051600080516020615ab98339815191525551600080516020615c21833981519152559151600080516020615b19833981519152559351600080516020615ba183398151915255865194850187526203f4808552600f85840181815297860194855290850190815260059091529390529051600080516020615ad9833981519152559151600080516020615b81833981519152559051600080516020615bc18339815191525551600080516020615a7983398151915255565b601f805460ff191690556000612aab6064612aa56002612a9f602b5490565b906134e5565b906136e1565b90506000612aba6110aa6134c2565b604154909150612ad79030906001600160a01b03168385816134f1565b6000612ae230611b28565b90506000612af16110aa6134c2565b603e54909150612b0e9030906001600160a01b03168385816134f1565b602f54602e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b97919061531a565b5050505050565b6000546001600160a01b03163314612bc85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612bf05760405162461bcd60e51b8152600401610e1390615537565b602f546001600160a01b0382811691161415612c4e5760405162461bcd60e51b815260206004820152601b60248201527f54686973207061697220697320616c726561647920696e2075736500000000006044820152606401610e13565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612c9a5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612cc25760405162461bcd60e51b8152600401610e1390615537565b603b80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314612d065760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d2e5760405162461bcd60e51b8152600401610e1390615537565b603b805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b03163314612d765760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d9e5760405162461bcd60e51b8152600401610e1390615537565b612daa6012600a615864565b612db4908261590c565b60425550565b6000546001600160a01b03163314612de45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612e0c5760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038116612e715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e13565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6001600160a01b038316612f385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e13565b6001600160a01b038216612f995760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e13565b6001600160a01b0383811660008181526027602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661305e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e13565b6001600160a01b0382166130c05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e13565b600081116131225760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e13565b6001600160a01b0383166000908152602860205260408120600301548190819060ff166131ad5760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038e16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6001600160a01b03851660009081526028602052604090206003015460ff166132345760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038d16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6000546001600160a01b0387811691161480159061326057506000546001600160a01b03868116911614155b801561328557506001600160a01b0386166000908152602a602052604090205460ff16155b80156132aa57506001600160a01b0385166000908152602a602052604090205460ff16155b15613466576001600160a01b03851660009081526029602052604090205460ff161580156132f157506001600160a01b03861660009081526029602052604090205460ff16155b6133365760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610e13565b602f546001600160a01b0387811691161415613388576133568585613cad565b6001600160a01b038816600090815260296020526040902054929550909350915060ff1615613383573094505b6133c6565b602f546001600160a01b03868116911614156133b4576133a88685614085565b919450925090506133c6565b6133be85856146b2565b919450925090505b600154600160a01b900460ff161580156133e85750603b5462010000900460ff165b80156134025750602f546001600160a01b03878116911614155b1561345757602f546001600160a01b03868116911614806134305750602e546001600160a01b038681169116145b806134485750602e546001600160a01b038681169116145b1561345c576134576001613799565b613481565b6134576000613799565b6134786134716134c2565b85906134e5565b92508391508290505b61348e86868585856134f1565b505050505050565b600081848411156134ba5760405162461bcd60e51b8152600401610e1391906154c2565b505050900390565b60008060006134cf6147d3565b90925090506134de82826136e1565b9250505090565b6000611151828461590c565b816134fb57612b97565b6001600160a01b03851615613547576001600160a01b03851660009081526023602052604090205461352d90846136f9565b6001600160a01b0386166000908152602360205260409020555b6001600160a01b03841660009081526023602052604090205461356a90826136ed565b6001600160a01b0380861660008181526023602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906135be9086815260200190565b60405180910390a36001600160a01b03851660009081526026602052604090205460ff16158061360757506001600160a01b03841660009081526026602052604090205460ff16155b15612b97576004546001600160a01b0316639f095b9e5a6040516001600160e01b031960e084901b1681526001600160a01b03808a16600483015288166024820152604401602060405180830381600088803b15801561366657600080fd5b5087f193505050508015613697575060408051601f3d908101601f191682019092526136949181019061531a565b60015b6136a057612b97565b506001600160a01b03808616600090815260266020526040808220805460ff1990811660019081179092559388168352912080549092161790555050505050565b60006111518284615801565b600061115182846157c4565b6000611151828461592b565b8061370d5750565b61373c61371b6110aa6134c2565b6006546001600160a01b0316600090815260236020526040902054906136ed565b600680546001600160a01b0390811660009081526023602090815260409182902094909455915491518481529116917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a250565b6001805460ff60a01b1916600160a01b17905560315460325460305460006137c030611b28565b603b5490915060ff161580156137d8575060385460ff165b80156137f257506039546033546001600160a01b03163110155b15613862576033546001600160a01b031663d506d3fe5a6040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561383557600080fd5b5087f193505050508015613847575060015b61385d57603b805460ff19166001179055613b08565b613b08565b60215460ff1615801561387c5750603854610100900460ff165b801561388a57506042548410155b1561395e575082600061389c82614808565b91506138a78261484a565b90506138b281613baa565b6004546040516001600160a01b03909116908290600081818185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b50506031546139149150836136f9565b60315560205461392490826136ed565b602055602180546001919060009061394090849060ff166157dc565b92506101000a81548160ff021916908360ff16021790555050613b08565b602154600160ff90911611801590613978575060385460ff165b801561398657506042548310155b15613a22575081600061399882614808565b91506139a38261484a565b6033546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146139f1576040519150601f19603f3d011682016040523d82523d6000602084013e6139f6565b606091505b5050603254613a069150836136f9565b603255602180546001919060009061394090849060ff166157dc565b602154600260ff90911611801590613a435750600154600160a81b900460ff165b8015613a5157506042548210155b15613ab2575080613a6181614808565b9050613a6c816148d8565b603054613a7990826136f9565b6030556021805460019190600090613a9590849060ff166157dc565b92506101000a81548160ff021916908360ff160217905550613b08565b600454600160a01b900460ff168015613ac9575084155b15613b0857613ad66149a0565b6021805460019190600090613aef90849060ff166157dc565b92506101000a81548160ff021916908360ff1602179055505b602154600460ff90911610613b2e576021805460ff19908116909155603b805490911690555b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b7e57600080fd5b505af1158015613b92573d6000803e3d6000fd5b50506001805460ff60a01b1916905550505050505050565b6103e881118015613bbb5750804710155b156110d157600454600160a01b900460ff1615613c60576004546001600160a01b0316815a60408051600481526024810182526020810180516001600160e01b031663439370b160e01b1790529051919291613c1791906154a6565b600060405180830381858888f193505050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b606091505b50505050565b6004546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b6000806000603b60029054906101000a900460ff1680613cd45750603b54610100900460ff165b613d1b5760405162461bcd60e51b81526020600482015260186024820152772a3930b234b733903737ba103cb2ba1032b730b13632b21760411b6044820152606401610e13565b600080600080603b60019054906101000a900460ff168015613d465750603b5462010000900460ff16155b15613dc7576001600160a01b038916600081815260296020908152604091829020805460ff1916600190811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a2309850613dba613db36134c2565b89906134e5565b965087955086945061407a565b6001600160a01b038916600090815260286020526040902042600290910155603b546301000000900460ff1615613f4357603c54613e07906102586157c4565b421015613e8457613e216103e8612aa56003612a9f612732565b881115613e7f5760405162461bcd60e51b815260206004820152602660248201527f507572636861736520746f6f206c6172676520666f7220696e697469616c206f60448201526570656e696e6760d01b6064820152608401610e13565b613f1b565b6001600160a01b0389166000908152602860205260409020544211613ef65760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b6064820152608401610e13565b613f0142600f6157c4565b6001600160a01b038a166000908152602860205260409020555b613f2642600f6157c4565b6001600160a01b038a166000908152602860205260409020600101555b600c54600b54600854600a54600093613f63939092611edf9283916136ed565b9050613f7b8960076002015460076000015484614a1e565b602254939a50919750955093503410613fc857613f998560026136e1565b9450613fa68460026136e1565b9350613fb38360026136e1565b9250613fc584611edf81818b886136ed565b96505b613fdc89868686613fd76134c2565b614a8a565b91995096509150613fec84614aec565b61401061400b82612aa5600760030154876134e590919063ffffffff16565b613705565b61404861402f82612aa5600760010154876134e590919063ffffffff16565b600b54614043908490612aa59088906134e5565b614b4e565b61406e61406782612aa5600760050154876134e590919063ffffffff16565b6000614c32565b6140788286614ce4565b505b505050509250925092565b6000806000603b60029054906101000a900460ff166140e35760405162461bcd60e51b815260206004820152601a602482015279151c98591a5b99c81a5cc81b9bdd08195b98589b1959081e595d60321b6044820152606401610e13565b603b546301000000900460ff161561416b576001600160a01b038516600090815260286020526040902060010154421161416b5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b6064820152608401610e13565b6000614175612732565b9050603c54610e1061418791906157c4565b421080156141ad57506001600160a01b03861660009081526025602052604090205460ff165b15614236576141c26064612aa58360056134e5565b85106142365760405162461bcd60e51b815260206004820152603c60248201527f53656c6c207175616e7469747920746f6f206869676820666f72206c61756e6360448201527f682e2e2e20706c6561736520646f6e742064756d70206561726c7921000000006064820152608401610e13565b6036546001600160a01b0387166000908152602860209081526040822060029081015460059093529052600080516020615ad98339815191525461427b9082906136ed565b42111561428757614404565b60016000526002602052600080516020615af9833981519152546142ac9082906136ed565b4210156142d45760016000526002602052600080516020615c61833981519152549150614404565b60026000819052602052600080516020615be1833981519152546142f99082906136ed565b4210156143215760026000819052602052600080516020615a99833981519152549150614404565b60036000526002602052600080516020615a59833981519152546143469082906136ed565b42101561436e5760036000526002602052600080516020615c41833981519152549150614404565b60046000526002602052600080516020615ab9833981519152546143939082906136ed565b4210156143bb5760046000526002602052600080516020615c21833981519152549150614404565b60056000526002602052600080516020615ad9833981519152546143e09082906136ed565b4210156144045760056000526002602052600080516020615b818339815191525491505b60375460056000526002602052600080516020615bc18339815191525461443390606490612aa59087906134e5565b88101561443f576145da565b60016000526002602052600080516020615a198339815191525461446b90606490612aa59087906134e5565b8811156144925750600160005260026020526000805160206159d9833981519152546145da565b60026000819052602052600080516020615a39833981519152546144be90606490612aa59087906134e5565b8811156144e5575060026000819052602052600080516020615c01833981519152546145da565b600360005260026020526000805160206159f98339815191525461451190606490612aa59087906134e5565b881115614538575060036000526002602052600080516020615b39833981519152546145da565b60046000526002602052600080516020615b198339815191525461456490606490612aa59087906134e5565b88111561458b575060046000526002602052600080516020615ba1833981519152546145da565b60056000526002602052600080516020615bc1833981519152546145b790606490612aa59087906134e5565b8811156145da575060056000526002602052600080516020615a79833981519152545b828110156145e55750815b60006145f66064612aa58b856134e5565b905060006146048a836136f9565b9050600061461a6146136134c2565b8c906134e5565b905060006146306146296134c2565b84906134e5565b9050600061464e6064612aa5603454886134e590919063ffffffff16565b9050600061466c6064612aa5603554896134e590919063ffffffff16565b905060006146848261467e89866136f9565b906136f9565b9050614691836000614b4e565b61469b8282614c32565b50929b509299509750505050505050509250925092565b6001600160a01b0382166000908152602860205260408120426002909101556012546011546008546010548493849384938493849384938493849384938493614703939192611edf928391906136ed565b905061471b8c600d60020154600d6000015484614a1e565b929950909650945092506147348c868686613fd76134c2565b9199509650915061474484614aec565b61476361400b82612aa5600d60030154876134e590919063ffffffff16565b61479661478282612aa5600d60010154876134e590919063ffffffff16565b601154614043908490612aa59088906134e5565b6147b561406782612aa5600d60050154876134e590919063ffffffff16565b6147bf8286614ce4565b50959b949a50929850929650505050505050565b602c54602b5460009182916147e882826136e1565b8210156147ff57602c54602b549350935050509091565b90939092509050565b6000819050600061481d603a54612aa5612732565b90508083111561482b578091505b61483430611b28565b8211156148445761115130611b28565b50919050565b602f546040805160016209351760e01b0319815290516000926001600160a01b03169163fff6cae9916004808301928692919082900301818387803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b5050602e544792506148c4915030906001600160a01b031685612ed6565b6148ce3084614d08565b61115147826136f9565b60006148e58260026136e1565b905060006148f383836136f9565b602e5490915047906149109030906001600160a01b031685612ed6565b61491a3084614d08565b600061492647836136f9565b602e549091506149419030906001600160a01b031685612ed6565b600654614958906001600160a01b03168483614f09565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6005545a10611927576004546001600160a01b03166387174c765a6040518263ffffffff1660e01b8152600401602060405180830381600088803b1580156149e757600080fd5b5087f193505050508015614a18575060408051601f3d908101601f19168201909252614a159181019061531a565b60015b6110d157565b600080808080614a336064612aa58b8a6134e5565b90506000614a466064612aa58c8c6134e5565b90506000614a596064612aa58d8b6134e5565b90506000614a678c856136f9565b9050614a778261467e8e866136f9565b9c939b5091995097509095505050505050565b6000808080614a9989866134e5565b90506000614aa789876134e5565b90506000614ab589886134e5565b90506000614ac389896134e5565b90506000614ad78261467e858189896136f9565b949d949c50929a509298505050505050505050565b80614af45750565b6000614afe6134c2565b90506000614b0c83836134e5565b30600090815260236020526040902054909150614b2990826136ed565b30600090815260236020526040902055603054614b4690846136ed565b603055505050565b81158015614b5a575080155b15614b63575050565b6000614b6d6134c2565b90506000614b7b84836134e5565b90506000614b8f6003612aa58660026134e5565b90506000614ba184612a9f87856136f9565b90506000614baf83866134e5565b30600090815260236020526040902054909150614bd2908390611edf90876136ed565b30600081815260236020526040902091909155603d54614bfe91906001600160a01b0316868a816134f1565b603f54614c189030906001600160a01b03168489816134f1565b604054611de59030906001600160a01b03168386816134f1565b6000614c3c6134c2565b90508215614c8f576000614c5084836134e5565b30600090815260236020526040902054909150614c6d90826136ed565b30600090815260236020526040902055603154614c8a90856136ed565b603155505b81156110ce576000614ca183836134e5565b30600090815260236020526040902054909150614cbe90826136ed565b30600090815260236020526040902055603254614cdb90846136ed565b60325550505050565b602c54614cf190836136f9565b602c55602d54614d0190826136ed565b602d555050565b602e54614d209030906001600160a01b031683612ed6565b602e54614d389083906001600160a01b031683612ed6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614d7b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614dcf57600080fd5b505afa158015614de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0791906150e4565b81600181518110614e2857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602f546040805160016209351760e01b031981529051919092169163fff6cae991600480830192600092919082900301818387803b158015614e7f57600080fd5b505af1158015614e93573d6000803e3d6000fd5b5050602e546001600160a01b0316915063791ac94790505a8460008588426040518763ffffffff1660e01b8152600401614ed19594939291906156ff565b600060405180830381600088803b158015614eeb57600080fd5b5087f1158015614eff573d6000803e3d6000fd5b5050505050505050565b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614f5957600080fd5b505af1158015614f6d573d6000803e3d6000fd5b5050602e546001600160a01b0316915063f305d71990505a6040516001600160e01b031960e084901b1681523060048201526024810186905260006044820181905260648201526001600160a01b03871660848201524260a4820152849060c4016060604051808303818589803b158015614fe757600080fd5b5088f1158015614ffb573d6000803e3d6000fd5b5050505050506040513d601f19601f8201168201806040525081019061348e91906153c9565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600082601f830112615059578081fd5b8135602061506e615069836157a0565b61576f565b80838252828201915082860187848660051b890101111561508d578586fd5b855b858110156150ab5781358452928401929084019060010161508f565b5090979650505050505050565b80356150c3816159ca565b919050565b6000602082840312156150d9578081fd5b8135611151816159b5565b6000602082840312156150f5578081fd5b8151611151816159b5565b60008060408385031215615112578081fd5b823561511d816159b5565b9150602083013561512d816159b5565b809150509250929050565b6000806000806080858703121561514d578182fd5b8435615158816159b5565b93506020850135615168816159b5565b92506040850135615178816159b5565b91506060850135615188816159b5565b939692955090935050565b6000806000606084860312156151a7578283fd5b83356151b2816159b5565b925060208401356151c2816159b5565b929592945050506040919091013590565b600080604083850312156151e5578182fd5b82356151f0816159b5565b9150602083013561512d816159ca565b60008060408385031215615212578182fd5b823561521d816159b5565b946020939093013593505050565b60008060006060848603121561523f578283fd5b833567ffffffffffffffff80821115615256578485fd5b818601915086601f830112615269578485fd5b81356020615279615069836157a0565b8083825282820191508286018b848660051b890101111561529857898afd5b8996505b848710156152c35780356152af816159b5565b83526001969096019591830191830161529c565b50975050870135925050808211156152d9578384fd5b506152e686828701615049565b9250506152f5604085016150b8565b90509250925092565b60006020828403121561530f578081fd5b8135611151816159ca565b60006020828403121561532b578081fd5b8151611151816159ca565b60008060006060848603121561534a578081fd5b8335615355816159ca565b925060208401356151c2816159ca565b600060208284031215615376578081fd5b5035919050565b6000806040838503121561538f578182fd5b50508035926020909101359150565b6000806000606084860312156153b2578081fd5b505081359360208301359350604090920135919050565b6000806000606084860312156153dd578081fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540e578384fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080600060a0868803121561544f578283fd5b853560ff8116811461545f578384fd5b97602087013597506040870135966060810135965060800135945092505050565b805182526020810151602083015260408101516040830152606081015160608301525050565b600082516154b8818460208701615942565b9190910192915050565b60208152600082518060208401526154e1816040850160208701615942565b601f01601f19169190910160400192915050565b60208082526022908201527f4164647265737320616c72656164792073657420746f20746869732076616c75604082015261652160f01b606082015260800190565b60208082526022908201527f5a65726f2061646472657373206973206e6f7420612076616c69642063616c6c60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f546869732066756e6374696f6e2063616e206f6e6c7920657665722062652063604082015269616c6c6564206f6e636560b01b606082015260800190565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a09283015192810192909252805460c0830152600181015460e0830152600281015461010083015260038101546101208301526004810154610140830152600501546101608201526101800190565b61028081016156838288615480565b6156906080830187615480565b61569e610100830186615480565b6156ac610180830185615480565b6156ba610200830184615480565b9695505050505050565b61010081016156d38285615480565b82546080830152600183015460a0830152600283015460c0830152600383015460e08301529392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561574e5784516001600160a01b031683529383019391830191600101615729565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156157985761579861599f565b604052919050565b600067ffffffffffffffff8211156157ba576157ba61599f565b5060051b60200190565b600082198211156157d7576157d7615989565b500190565b600060ff821660ff84168060ff038211156157f9576157f9615989565b019392505050565b60008261581c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561585c57816000190482111561584257615842615989565b8085161561584f57918102915b93841c9390800290615826565b509250929050565b6000611151838360008261587a57506001610de3565b8161588757506000610de3565b816001811461589d57600281146158a7576158c3565b6001915050610de3565b60ff8411156158b8576158b8615989565b50506001821b610de3565b5060208310610133831016604e8410600b84101617156158e6575081810a610de3565b6158f08383615821565b806000190482111561590457615904615989565b029392505050565b600081600019048311821515161561592657615926615989565b500290565b60008282101561593d5761593d615989565b500390565b60005b8381101561595d578181015183820152602001615945565b83811115613c5a5750506000910152565b600060001982141561598257615982615989565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d157600080fd5b80151581146110d157600080fdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e388601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c5e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e2679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28e88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e387679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28dee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919188601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c645524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e385ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a69192b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e386679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919088601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e145524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a998ebd315c8bc806c6b7eeba04ebad68bb236645907797e79a2f1b14495a01664736f6c63430008040033000000000000000000000000000000000000000000000000000000e8d4a51000

Deployed Bytecode

0x6080604052600436106103cb5760003560e01c8063786ccd2f116101f4578063c2fbe7bc1161010e578063e1c7392a116100a6578063e1c7392a14610c9d578063e4748b9e14610cb2578063e51b644a14610cdd578063ea18f76014610cfd578063ed42709614610d1d578063f05ca03414610d3c578063f0f165af14610d5c578063f2fde38b14610d7c578063f889df8e14610d9c578063ffb54a9914610db257600080fd5b8063c2fbe7bc14610b35578063c49b9a8014610b8d578063c851cc3214610bad578063ce9ae17f14610bcd578063d2b1432c14610bed578063daad099914610c02578063db92dbb614610c22578063dd62ed3e14610c37578063df8408fe14610c7d57600080fd5b806395d89b411161018c57806395d89b41146109ef578063962dfc7514610a1f578063a457c2d714610a3f578063a9059cbb14610a5f578063b2e4b83514610a7f578063b3adc89a14610a9f578063b6cd399d14610abf578063b79b533814610ade578063be37757a14610afe578063bebe766f14610b1457600080fd5b8063786ccd2f146108db57806379365aa2146108fb5780637a4f133e1461091b5780637a5ffd7a1461093b5780638542b3361461095b5780638da5cb5b1461097b5780638ea1303614610999578063914c8239146109af5780639155e083146109cf57600080fd5b80633fbad2cd116102e55780634cf8c94b1161027d5780634cf8c94b146107915780634fc3fd72146107cb5780634fd992cc146107eb5780636053a0e31461080b5780636778c56c14610825578063685fc5681461083a57806370a082311461086057806370b7b80c14610880578063715018a614610896578063768dc710146108ab57600080fd5b80633fbad2cd1461067a57806341fe29d01461069a57806342966c68146106ba57806343a18909146106da578063472dc00f146106fa57806348473bb31461071057806349bd5a5e146107305780634a74bb02146107505780634afc71871461077157600080fd5b806323b872dd1161036357806323b872dd1461054f57806327c8f8351461056f5780632a9b80721461058f5780632d838119146105af578063313ce567146105cf57806334f2af70146105e457806338f888d41461060457806339509351146106245780633cdd5ee7146106445780633d4852a91461065a57600080fd5b806306fdde03146103d7578063095ea7b31461042757806309d8a68c1461045757806313114a9d1461047b5780631694505e1461049057806318160ddd146104c85780631cdd3be3146104dd57806320e080591461050d5780632312d58a1461052f57600080fd5b366103d257005b600080fd5b3480156103e357600080fd5b506104116040518060400160405280600e81526020016d223cb730b6b4b1b9902a37b5b2b760911b81525081565b60405161041e91906154c2565b60405180910390f35b34801561043357600080fd5b50610447610442366004615200565b610dd2565b604051901515815260200161041e565b34801561046357600080fd5b5061046d60225481565b60405190815260200161041e565b34801561048757600080fd5b50602d5461046d565b34801561049c57600080fd5b50602e546104b0906001600160a01b031681565b6040516001600160a01b03909116815260200161041e565b3480156104d457600080fd5b50602b5461046d565b3480156104e957600080fd5b506104476104f83660046150c8565b60296020526000908152604090205460ff1681565b34801561051957600080fd5b5061052d610528366004615365565b610de9565b005b34801561053b57600080fd5b5061052d61054a3660046153f6565b610e49565b34801561055b57600080fd5b5061044761056a366004615193565b610f2d565b34801561057b57600080fd5b506006546104b0906001600160a01b031681565b34801561059b57600080fd5b5061052d6105aa3660046152fe565b610f96565b3480156105bb57600080fd5b5061046d6105ca366004615365565b6110d4565b3480156105db57600080fd5b5061046d601281565b3480156105f057600080fd5b5061052d6105ff36600461539e565b611158565b34801561061057600080fd5b506041546104b0906001600160a01b031681565b34801561063057600080fd5b5061044761063f366004615200565b611228565b34801561065057600080fd5b5061046d60395481565b34801561066657600080fd5b5061052d6106753660046150c8565b61125e565b34801561068657600080fd5b5061052d6106953660046150c8565b6112d1565b3480156106a657600080fd5b5061052d6106b5366004615336565b61138b565b3480156106c657600080fd5b5061052d6106d5366004615365565b611408565b3480156106e657600080fd5b506040546104b0906001600160a01b031681565b34801561070657600080fd5b5061046d60365481565b34801561071c57600080fd5b5061052d61072b366004615138565b61145e565b34801561073c57600080fd5b50602f546104b0906001600160a01b031681565b34801561075c57600080fd5b5060015461044790600160a81b900460ff1681565b34801561077d57600080fd5b506004546104b0906001600160a01b031681565b34801561079d57600080fd5b506030546031546032546107b092919083565b6040805193845260208401929092529082015260600161041e565b3480156107d757600080fd5b5061052d6107e63660046153f6565b611762565b3480156107f757600080fd5b5061052d610806366004615365565b611835565b34801561081757600080fd5b506038546104479060ff1681565b34801561083157600080fd5b5061052d6118f6565b34801561084657600080fd5b5061084f611929565b60405161041e959493929190615674565b34801561086c57600080fd5b5061046d61087b3660046150c8565b611b28565b34801561088c57600080fd5b5061046d603c5481565b3480156108a257600080fd5b5061052d611b4a565b3480156108b757600080fd5b506104476108c63660046150c8565b602a6020526000908152604090205460ff1681565b3480156108e757600080fd5b5061052d6108f636600461522b565b611bf2565b34801561090757600080fd5b5061052d6109163660046150c8565b611dee565b34801561092757600080fd5b5061052d61093636600461539e565b611ed1565b34801561094757600080fd5b50603d546104b0906001600160a01b031681565b34801561096757600080fd5b506033546104b0906001600160a01b031681565b34801561098757600080fd5b506000546001600160a01b03166104b0565b3480156109a557600080fd5b5061046d60205481565b3480156109bb57600080fd5b5061052d6109ca36600461537d565b611fc8565b3480156109db57600080fd5b5061052d6109ea3660046151d3565b612025565b3480156109fb57600080fd5b506104116040518060400160405280600481526020016344594e4160e01b81525081565b348015610a2b57600080fd5b50603f546104b0906001600160a01b031681565b348015610a4b57600080fd5b50610447610a5a366004615200565b6120d6565b348015610a6b57600080fd5b50610447610a7a366004615200565b612125565b348015610a8b57600080fd5b5061052d610a9a3660046152fe565b61217a565b348015610aab57600080fd5b5061052d610aba3660046150c8565b612264565b348015610acb57600080fd5b5060385461044790610100900460ff1681565b348015610aea57600080fd5b50603e546104b0906001600160a01b031681565b348015610b0a57600080fd5b5061046d60055481565b348015610b2057600080fd5b50603b54610447906301000000900460ff1681565b348015610b4157600080fd5b50600d54600e54600f54601054601154601254610b6095949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161041e565b348015610b9957600080fd5b5061052d610ba83660046152fe565b61231e565b348015610bb957600080fd5b5061052d610bc83660046150c8565b61238e565b348015610bd957600080fd5b5061052d610be83660046150c8565b6124a7565b348015610bf957600080fd5b5061052d612561565b348015610c0e57600080fd5b5061052d610c1d366004615438565b6125c5565b348015610c2e57600080fd5b5061046d612732565b348015610c4357600080fd5b5061046d610c52366004615100565b6001600160a01b03918216600090815260276020908152604080832093909416825291909152205490565b348015610c8957600080fd5b5061052d610c983660046151d3565b61274f565b348015610ca957600080fd5b5061052d6127cc565b348015610cbe57600080fd5b50600754600854600954600a54600b54600c54610b6095949392919086565b348015610ce957600080fd5b5061052d610cf83660046150c8565b612b9e565b348015610d0957600080fd5b5061052d610d183660046152fe565b612c70565b348015610d2957600080fd5b50603b5461044790610100900460ff1681565b348015610d4857600080fd5b5061052d610d573660046152fe565b612cdc565b348015610d6857600080fd5b5061052d610d77366004615365565b612d4c565b348015610d8857600080fd5b5061052d610d973660046150c8565b612dba565b348015610da857600080fd5b5061046d60375481565b348015610dbe57600080fd5b50603b546104479062010000900460ff1681565b6000610ddf338484612ed6565b5060015b92915050565b6000546001600160a01b03163314610e1c5760405162461bcd60e51b8152600401610e1390615579565b60405180910390fd5b6000546001600160a01b0316610e445760405162461bcd60e51b8152600401610e1390615537565b603955565b6000546001600160a01b03163314610e735760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610e9b5760405162461bcd60e51b8152600401610e1390615537565b6040805160c0810182526007805482526008805460208401526009805484860152600a80546060860152600b80546080870152600c805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b60405180910390a150505050505050565b6000610f3a848484612ffa565b610f8c8433610f8785604051806060016040528060288152602001615b59602891396001600160a01b038a1660009081526027602090815260408083203384529091529020549190613496565b612ed6565b5060019392505050565b6000546001600160a01b03163314610fc05760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316610fe85760405162461bcd60e51b8152600401610e1390615537565b603b5462010000900460ff161561103b5760405162461bcd60e51b8152602060048201526017602482015276151c98591a5b99c8185b1c9958591e48195b98589b1959604a1b6044820152606401610e13565b603b805462ff000019166201000017905542603c556001805460ff60a81b1916600160a81b179055600061106e30611b28565b11801561108257506000611080612732565b115b801561108b5750805b156110d157600061109b30611b28565b905060006110b16110aa6134c2565b83906134e5565b6040549091506110ce9030906001600160a01b03168385816134f1565b50505b50565b6000602c5482111561113b5760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610e13565b60006111456134c2565b905061115183826136e1565b9392505050565b6000546001600160a01b031633146111825760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166111aa5760405162461bcd60e51b8152600401610e1390615537565b806111b583856157c4565b6111bf91906157c4565b60641461121c5760405162461bcd60e51b815260206004820152602560248201527f54686573652070657263656e7461676573206d7573742061646420757020746f604482015264203130302560d81b6064820152608401610e13565b50603491909155603555565b3360008181526027602090815260408083206001600160a01b03871684529091528120549091610ddf918590610f8790866136ed565b6000546001600160a01b031633146112885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166112b05760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03166000908152602660205260409020805460ff19169055565b6000546001600160a01b031633146112fb5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113235760405162461bcd60e51b8152600401610e1390615537565b603d546001600160a01b03828116911614156113515760405162461bcd60e51b8152600401610e13906154f5565b603d80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146113b55760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166113dd5760405162461bcd60e51b8152600401610e1390615537565b6038805461ffff191693151561ff001916939093176101009215159290920291909117909155603a55565b806114105750565b600061141a6134c2565b9050600061142883836134e5565b3360009081526023602052604090205490915061144590826136f9565b336000908152602360205260409020556110ce83613705565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166114b05760405162461bcd60e51b8152600401610e1390615537565b601f5460ff1660031461152b5760405162461bcd60e51b815260206004820152603d60248201527f546869732066756e6374696f6e206d757374206265207468652066697273742060448201527f63616c6c20616e642063616e6e6f74206265207573656420616761696e0000006064820152608401610e13565b602e546040805163c45a015560e01b815290516000926001600160a01b03169163c45a0155916004808301926020929190829003018186803b15801561157057600080fd5b505afa158015611584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a891906150e4565b6001600160a01b031663c9c6539630602e60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561160557600080fd5b505afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906150e4565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b15801561168557600080fd5b505af1158015611699573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bd91906150e4565b603380546001600160a01b039485166001600160a01b0319918216179091556004805497851697821688179055603e805495851695821686179055603d8054968516968216871790556000968752602a6020526040808820805460ff19908116600190811790925596895281892080548816821790559688529096208054851690951790945550602f8054919093169316929092179055601f80549091166002179055565b6000546001600160a01b0316331461178c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166117b45760405162461bcd60e51b8152600401610e1390615537565b6040805160c081018252600d80548252600e80546020840152600f8054848601526010805460608601526011805460808701526012805460a08801528d8655938c9055918a9055889055869055849055915190917f04ad112975bfba8d6d95586083929ecf92a6257a4f620abfda3d5291aa01e75191610f1c9184916155f8565b6000546001600160a01b0316331461185f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166118875760405162461bcd60e51b8152600401610e1390615537565b61c35060055410156118f15760405162461bcd60e51b815260206004820152602d60248201527f4d696e696d756d20476173206d757374206265206f7665722035302c3030302060448201526c62617265206d696e696d756d2160981b6064820152608401610e13565b600555565b600154600160a01b900460ff161580156119185750603b5462010000900460ff165b15611927576119276000613799565b565b611931615021565b611939615021565b611941615021565b611949615021565b611951615021565b50506002602090815260056000526040805160808082018352600080516020615af9833981519152548252600080516020615c618339815191525482850152600080516020615a1983398151915254828401526000805160206159d98339815191525460608084019190915283518083018552600080516020615be1833981519152548152600080516020615a998339815191525481870152600080516020615a398339815191525481860152600080516020615c01833981519152548183015284518084018652600080516020615a59833981519152548152600080516020615c4183398151915254818801526000805160206159f98339815191525481870152600080516020615b39833981519152548184015285518085018752600080516020615ab9833981519152548152600080516020615c218339815191525481890152600080516020615b198339815191525481880152600080516020615ba1833981519152548185015286519485018752600080516020615ad9833981519152548552600080516020615b818339815191525497850197909752600080516020615bc18339815191525495840195909552600080516020615a798339815191525491830191909152919791965091945091925090565b6001600160a01b038116600090815260236020526040812054610de3906110d4565b6000546001600160a01b03163314611b745760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611b9c5760405162461bcd60e51b8152600401610e1390615537565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319908116909155600180549091169055565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611c445760405162461bcd60e51b8152600401610e1390615537565b8151835114611c955760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265206f6620657175616c206c656e67746800006044820152606401610e13565b601f5460ff16600214611cba5760405162461bcd60e51b8152600401610e13906155ae565b6000611cc46134c2565b90506000806000805b8751811015611dd057611d18670de0b6b3a7640000888381518110611d0257634e487b7160e01b600052603260045260246000fd5b60200260200101516134e590919063ffffffff16565b9150611d2482866134e5565b9250611d5a30898381518110611d4a57634e487b7160e01b600052603260045260246000fd5b60200260200101518585876134f1565b611d6484836136ed565b93506001602560008a8481518110611d8c57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611dc88161596e565b915050611ccd565b508415611de557601f805460ff191660011790555b50505050505050565b6000546001600160a01b03163314611e185760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316611e405760405162461bcd60e51b8152600401610e1390615537565b6004546001600160a01b0382811691161415611eaf5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f7220697320616c72656164792073657420746f2074686973604482015267206164647265737360c01b6064820152608401610e13565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b611ee581611edf85856136ed565b906136ed565b611eee33611b28565b1015611f575760405162461bcd60e51b815260206004820152603260248201527f596f7520646f206e6f742068617665207468652062616c616e636520746f207060448201527132b93337b936903a3434b99030b1ba34b7b760711b6064820152608401610e13565b6000611f6782611edf86866136ed565b90506000611f736134c2565b90506000611f8183836134e5565b9050611f9033308386856134f1565b603054611f9d90876136ed565b603055603254611fad90856136ed565b603255603154611fbd90866136ed565b603155505050505050565b6000546001600160a01b03163314611ff25760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661201a5760405162461bcd60e51b8152600401610e1390615537565b603691909155603755565b6000546001600160a01b0316331461204f5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166120775760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038216600081815260296020908152604091829020805460ff191685151590811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a25050565b6000610ddf3384610f8785604051806060016040528060258152602001615c81602591393360009081526027602090815260408083206001600160a01b038d1684529091529020549190613496565b60006005545a101561216f5760405162461bcd60e51b81526020600482015260136024820152725265717569726573206869676865722067617360681b6044820152606401610e13565b610ddf338484612ffa565b6000546001600160a01b031633146121a45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166121cc5760405162461bcd60e51b8152600401610e1390615537565b600460149054906101000a900460ff16151581151514156122465760405162461bcd60e51b815260206004820152602e60248201527f4175746f2d5265666c656374696f6e732061726520616c72656164792073657460448201526d20746f20746861742076616c756560901b6064820152608401610e13565b60048054911515600160a01b0260ff60a01b19909216919091179055565b6000546001600160a01b0316331461228e5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166122b65760405162461bcd60e51b8152600401610e1390615537565b603e546001600160a01b03828116911614156122e45760405162461bcd60e51b8152600401610e13906154f5565b603e80546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b031633146123485760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123705760405162461bcd60e51b8152600401610e1390615537565b60018054911515600160a81b0260ff60a81b19909216919091179055565b6000546001600160a01b031633146123b85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166123e05760405162461bcd60e51b8152600401610e1390615537565b602e546001600160a01b038281169116141561244a5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e13565b602e546040516001600160a01b03918216918316907f2c6fb4d5ff9fad6ecf2e09cd64cbc9aad92a8b9d2cc0e5c3ddef9b529b0b5ffd90600090a3602e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146124d15760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166124f95760405162461bcd60e51b8152600401610e1390615537565b6033546001600160a01b03828116911614156125275760405162461bcd60e51b8152600401610e13906154f5565b603380546001600160a01b039092166001600160a01b0319909216821790556000908152602a60205260409020805460ff19166001179055565b6000546001600160a01b0316331461258b5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166125b35760405162461bcd60e51b8152600401610e1390615537565b6103e847106119275761192747613baa565b6000546001600160a01b031633146125ef5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166126175760405162461bcd60e51b8152600401610e1390615537565b60068560ff1610801561262d575060008560ff16115b6126715760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b195d995b08195b9d195c9959605a1b6044820152606401610e13565b60ff851660008181526002602081815260408084208151608081018352815481526001820154818501528185015492810192909252600381015460608301529490935252906126de906126c687610e1061590c565b81556001810186905560028101859055600301839055565b60ff86166000908152600260205260409081902090517f8a817db92e842c03fbd292352c314987ecce88fce7eca89ee8cd2618eacd72cb91612722918491906156c4565b60405180910390a1505050505050565b602f5460009061274a906001600160a01b0316611b28565b905090565b6000546001600160a01b031633146127795760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b03166127a15760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b03919091166000908152602a60205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146127f65760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b031661281e5760405162461bcd60e51b8152600401610e1390615537565b601f5460ff166001146128435760405162461bcd60e51b8152600401610e13906155ae565b612a8060408051608080820183526154608252601e6020808401828152600485870181815260608088018681526001600081815260028089529a51600080516020615af9833981519152559551600080516020615c61833981519152559251600080516020615a1983398151915255516000805160206159d98339815191525588518088018a5261a8c081526019818701818152828c01868152838501998a528b88528b89529251600080516020615be18339815191525551600080516020615a99833981519152559051600080516020615a39833981519152559551600080516020615c018339815191525588518088018a5262015180815260148187018181526003838d018181528486019a8b529088528b89529251600080516020615a598339815191525551600080516020615c418339815191525590516000805160206159f9833981519152559551600080516020615b398339815191525588518088018a526202a30081526012818701908152818b018a81528284019889529486528987529051600080516020615ab98339815191525551600080516020615c21833981519152559151600080516020615b19833981519152559351600080516020615ba183398151915255865194850187526203f4808552600f85840181815297860194855290850190815260059091529390529051600080516020615ad9833981519152559151600080516020615b81833981519152559051600080516020615bc18339815191525551600080516020615a7983398151915255565b601f805460ff191690556000612aab6064612aa56002612a9f602b5490565b906134e5565b906136e1565b90506000612aba6110aa6134c2565b604154909150612ad79030906001600160a01b03168385816134f1565b6000612ae230611b28565b90506000612af16110aa6134c2565b603e54909150612b0e9030906001600160a01b03168385816134f1565b602f54602e5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b390604401602060405180830381600087803b158015612b5f57600080fd5b505af1158015612b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b97919061531a565b5050505050565b6000546001600160a01b03163314612bc85760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612bf05760405162461bcd60e51b8152600401610e1390615537565b602f546001600160a01b0382811691161415612c4e5760405162461bcd60e51b815260206004820152601b60248201527f54686973207061697220697320616c726561647920696e2075736500000000006044820152606401610e13565b602f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612c9a5760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612cc25760405162461bcd60e51b8152600401610e1390615537565b603b80549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314612d065760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d2e5760405162461bcd60e51b8152600401610e1390615537565b603b805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b03163314612d765760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612d9e5760405162461bcd60e51b8152600401610e1390615537565b612daa6012600a615864565b612db4908261590c565b60425550565b6000546001600160a01b03163314612de45760405162461bcd60e51b8152600401610e1390615579565b6000546001600160a01b0316612e0c5760405162461bcd60e51b8152600401610e1390615537565b6001600160a01b038116612e715760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e13565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316811790915560018054909216179055565b6001600160a01b038316612f385760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e13565b6001600160a01b038216612f995760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e13565b6001600160a01b0383811660008181526027602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661305e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610e13565b6001600160a01b0382166130c05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610e13565b600081116131225760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610e13565b6001600160a01b0383166000908152602860205260408120600301548190819060ff166131ad5760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038e16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6001600160a01b03851660009081526028602052604090206003015460ff166132345760408051608081018252600080825260208083018281528385018381526001606086018181526001600160a01b038d16865260289094529590932093518455519383019390935551600282015590516003909101805460ff19169115159190911790555b6000546001600160a01b0387811691161480159061326057506000546001600160a01b03868116911614155b801561328557506001600160a01b0386166000908152602a602052604090205460ff16155b80156132aa57506001600160a01b0385166000908152602a602052604090205460ff16155b15613466576001600160a01b03851660009081526029602052604090205460ff161580156132f157506001600160a01b03861660009081526029602052604090205460ff16155b6133365760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610e13565b602f546001600160a01b0387811691161415613388576133568585613cad565b6001600160a01b038816600090815260296020526040902054929550909350915060ff1615613383573094505b6133c6565b602f546001600160a01b03868116911614156133b4576133a88685614085565b919450925090506133c6565b6133be85856146b2565b919450925090505b600154600160a01b900460ff161580156133e85750603b5462010000900460ff165b80156134025750602f546001600160a01b03878116911614155b1561345757602f546001600160a01b03868116911614806134305750602e546001600160a01b038681169116145b806134485750602e546001600160a01b038681169116145b1561345c576134576001613799565b613481565b6134576000613799565b6134786134716134c2565b85906134e5565b92508391508290505b61348e86868585856134f1565b505050505050565b600081848411156134ba5760405162461bcd60e51b8152600401610e1391906154c2565b505050900390565b60008060006134cf6147d3565b90925090506134de82826136e1565b9250505090565b6000611151828461590c565b816134fb57612b97565b6001600160a01b03851615613547576001600160a01b03851660009081526023602052604090205461352d90846136f9565b6001600160a01b0386166000908152602360205260409020555b6001600160a01b03841660009081526023602052604090205461356a90826136ed565b6001600160a01b0380861660008181526023602052604090819020939093559151908716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906135be9086815260200190565b60405180910390a36001600160a01b03851660009081526026602052604090205460ff16158061360757506001600160a01b03841660009081526026602052604090205460ff16155b15612b97576004546001600160a01b0316639f095b9e5a6040516001600160e01b031960e084901b1681526001600160a01b03808a16600483015288166024820152604401602060405180830381600088803b15801561366657600080fd5b5087f193505050508015613697575060408051601f3d908101601f191682019092526136949181019061531a565b60015b6136a057612b97565b506001600160a01b03808616600090815260266020526040808220805460ff1990811660019081179092559388168352912080549092161790555050505050565b60006111518284615801565b600061115182846157c4565b6000611151828461592b565b8061370d5750565b61373c61371b6110aa6134c2565b6006546001600160a01b0316600090815260236020526040902054906136ed565b600680546001600160a01b0390811660009081526023602090815260409182902094909455915491518481529116917fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5910160405180910390a250565b6001805460ff60a01b1916600160a01b17905560315460325460305460006137c030611b28565b603b5490915060ff161580156137d8575060385460ff165b80156137f257506039546033546001600160a01b03163110155b15613862576033546001600160a01b031663d506d3fe5a6040518263ffffffff1660e01b8152600401600060405180830381600088803b15801561383557600080fd5b5087f193505050508015613847575060015b61385d57603b805460ff19166001179055613b08565b613b08565b60215460ff1615801561387c5750603854610100900460ff165b801561388a57506042548410155b1561395e575082600061389c82614808565b91506138a78261484a565b90506138b281613baa565b6004546040516001600160a01b03909116908290600081818185875af1925050503d80600081146138ff576040519150601f19603f3d011682016040523d82523d6000602084013e613904565b606091505b50506031546139149150836136f9565b60315560205461392490826136ed565b602055602180546001919060009061394090849060ff166157dc565b92506101000a81548160ff021916908360ff16021790555050613b08565b602154600160ff90911611801590613978575060385460ff165b801561398657506042548310155b15613a22575081600061399882614808565b91506139a38261484a565b6033546040519192506001600160a01b0316908290600081818185875af1925050503d80600081146139f1576040519150601f19603f3d011682016040523d82523d6000602084013e6139f6565b606091505b5050603254613a069150836136f9565b603255602180546001919060009061394090849060ff166157dc565b602154600260ff90911611801590613a435750600154600160a81b900460ff165b8015613a5157506042548210155b15613ab2575080613a6181614808565b9050613a6c816148d8565b603054613a7990826136f9565b6030556021805460019190600090613a9590849060ff166157dc565b92506101000a81548160ff021916908360ff160217905550613b08565b600454600160a01b900460ff168015613ac9575084155b15613b0857613ad66149a0565b6021805460019190600090613aef90849060ff166157dc565b92506101000a81548160ff021916908360ff1602179055505b602154600460ff90911610613b2e576021805460ff19908116909155603b805490911690555b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613b7e57600080fd5b505af1158015613b92573d6000803e3d6000fd5b50506001805460ff60a01b1916905550505050505050565b6103e881118015613bbb5750804710155b156110d157600454600160a01b900460ff1615613c60576004546001600160a01b0316815a60408051600481526024810182526020810180516001600160e01b031663439370b160e01b1790529051919291613c1791906154a6565b600060405180830381858888f193505050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b606091505b50505050565b6004546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613c55576040519150601f19603f3d011682016040523d82523d6000602084013e613c5a565b6000806000603b60029054906101000a900460ff1680613cd45750603b54610100900460ff165b613d1b5760405162461bcd60e51b81526020600482015260186024820152772a3930b234b733903737ba103cb2ba1032b730b13632b21760411b6044820152606401610e13565b600080600080603b60019054906101000a900460ff168015613d465750603b5462010000900460ff16155b15613dc7576001600160a01b038916600081815260296020908152604091829020805460ff1916600190811790915591519182527fc946cf25497281b2a5e6ba87bb7ac6bf11db8f1f04c9d289d40a9cc281a423f7910160405180910390a2309850613dba613db36134c2565b89906134e5565b965087955086945061407a565b6001600160a01b038916600090815260286020526040902042600290910155603b546301000000900460ff1615613f4357603c54613e07906102586157c4565b421015613e8457613e216103e8612aa56003612a9f612732565b881115613e7f5760405162461bcd60e51b815260206004820152602660248201527f507572636861736520746f6f206c6172676520666f7220696e697469616c206f60448201526570656e696e6760d01b6064820152608401610e13565b613f1b565b6001600160a01b0389166000908152602860205260409020544211613ef65760405162461bcd60e51b815260206004820152602260248201527f596f75722062757920636f6f6c646f776e20686173206e6f7420657870697265604482015261321760f11b6064820152608401610e13565b613f0142600f6157c4565b6001600160a01b038a166000908152602860205260409020555b613f2642600f6157c4565b6001600160a01b038a166000908152602860205260409020600101555b600c54600b54600854600a54600093613f63939092611edf9283916136ed565b9050613f7b8960076002015460076000015484614a1e565b602254939a50919750955093503410613fc857613f998560026136e1565b9450613fa68460026136e1565b9350613fb38360026136e1565b9250613fc584611edf81818b886136ed565b96505b613fdc89868686613fd76134c2565b614a8a565b91995096509150613fec84614aec565b61401061400b82612aa5600760030154876134e590919063ffffffff16565b613705565b61404861402f82612aa5600760010154876134e590919063ffffffff16565b600b54614043908490612aa59088906134e5565b614b4e565b61406e61406782612aa5600760050154876134e590919063ffffffff16565b6000614c32565b6140788286614ce4565b505b505050509250925092565b6000806000603b60029054906101000a900460ff166140e35760405162461bcd60e51b815260206004820152601a602482015279151c98591a5b99c81a5cc81b9bdd08195b98589b1959081e595d60321b6044820152606401610e13565b603b546301000000900460ff161561416b576001600160a01b038516600090815260286020526040902060010154421161416b5760405162461bcd60e51b815260206004820152602360248201527f596f75722073656c6c20636f6f6c646f776e20686173206e6f7420657870697260448201526232b21760e91b6064820152608401610e13565b6000614175612732565b9050603c54610e1061418791906157c4565b421080156141ad57506001600160a01b03861660009081526025602052604090205460ff165b15614236576141c26064612aa58360056134e5565b85106142365760405162461bcd60e51b815260206004820152603c60248201527f53656c6c207175616e7469747920746f6f206869676820666f72206c61756e6360448201527f682e2e2e20706c6561736520646f6e742064756d70206561726c7921000000006064820152608401610e13565b6036546001600160a01b0387166000908152602860209081526040822060029081015460059093529052600080516020615ad98339815191525461427b9082906136ed565b42111561428757614404565b60016000526002602052600080516020615af9833981519152546142ac9082906136ed565b4210156142d45760016000526002602052600080516020615c61833981519152549150614404565b60026000819052602052600080516020615be1833981519152546142f99082906136ed565b4210156143215760026000819052602052600080516020615a99833981519152549150614404565b60036000526002602052600080516020615a59833981519152546143469082906136ed565b42101561436e5760036000526002602052600080516020615c41833981519152549150614404565b60046000526002602052600080516020615ab9833981519152546143939082906136ed565b4210156143bb5760046000526002602052600080516020615c21833981519152549150614404565b60056000526002602052600080516020615ad9833981519152546143e09082906136ed565b4210156144045760056000526002602052600080516020615b818339815191525491505b60375460056000526002602052600080516020615bc18339815191525461443390606490612aa59087906134e5565b88101561443f576145da565b60016000526002602052600080516020615a198339815191525461446b90606490612aa59087906134e5565b8811156144925750600160005260026020526000805160206159d9833981519152546145da565b60026000819052602052600080516020615a39833981519152546144be90606490612aa59087906134e5565b8811156144e5575060026000819052602052600080516020615c01833981519152546145da565b600360005260026020526000805160206159f98339815191525461451190606490612aa59087906134e5565b881115614538575060036000526002602052600080516020615b39833981519152546145da565b60046000526002602052600080516020615b198339815191525461456490606490612aa59087906134e5565b88111561458b575060046000526002602052600080516020615ba1833981519152546145da565b60056000526002602052600080516020615bc1833981519152546145b790606490612aa59087906134e5565b8811156145da575060056000526002602052600080516020615a79833981519152545b828110156145e55750815b60006145f66064612aa58b856134e5565b905060006146048a836136f9565b9050600061461a6146136134c2565b8c906134e5565b905060006146306146296134c2565b84906134e5565b9050600061464e6064612aa5603454886134e590919063ffffffff16565b9050600061466c6064612aa5603554896134e590919063ffffffff16565b905060006146848261467e89866136f9565b906136f9565b9050614691836000614b4e565b61469b8282614c32565b50929b509299509750505050505050509250925092565b6001600160a01b0382166000908152602860205260408120426002909101556012546011546008546010548493849384938493849384938493849384938493614703939192611edf928391906136ed565b905061471b8c600d60020154600d6000015484614a1e565b929950909650945092506147348c868686613fd76134c2565b9199509650915061474484614aec565b61476361400b82612aa5600d60030154876134e590919063ffffffff16565b61479661478282612aa5600d60010154876134e590919063ffffffff16565b601154614043908490612aa59088906134e5565b6147b561406782612aa5600d60050154876134e590919063ffffffff16565b6147bf8286614ce4565b50959b949a50929850929650505050505050565b602c54602b5460009182916147e882826136e1565b8210156147ff57602c54602b549350935050509091565b90939092509050565b6000819050600061481d603a54612aa5612732565b90508083111561482b578091505b61483430611b28565b8211156148445761115130611b28565b50919050565b602f546040805160016209351760e01b0319815290516000926001600160a01b03169163fff6cae9916004808301928692919082900301818387803b15801561489257600080fd5b505af11580156148a6573d6000803e3d6000fd5b5050602e544792506148c4915030906001600160a01b031685612ed6565b6148ce3084614d08565b61115147826136f9565b60006148e58260026136e1565b905060006148f383836136f9565b602e5490915047906149109030906001600160a01b031685612ed6565b61491a3084614d08565b600061492647836136f9565b602e549091506149419030906001600160a01b031685612ed6565b600654614958906001600160a01b03168483614f09565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6005545a10611927576004546001600160a01b03166387174c765a6040518263ffffffff1660e01b8152600401602060405180830381600088803b1580156149e757600080fd5b5087f193505050508015614a18575060408051601f3d908101601f19168201909252614a159181019061531a565b60015b6110d157565b600080808080614a336064612aa58b8a6134e5565b90506000614a466064612aa58c8c6134e5565b90506000614a596064612aa58d8b6134e5565b90506000614a678c856136f9565b9050614a778261467e8e866136f9565b9c939b5091995097509095505050505050565b6000808080614a9989866134e5565b90506000614aa789876134e5565b90506000614ab589886134e5565b90506000614ac389896134e5565b90506000614ad78261467e858189896136f9565b949d949c50929a509298505050505050505050565b80614af45750565b6000614afe6134c2565b90506000614b0c83836134e5565b30600090815260236020526040902054909150614b2990826136ed565b30600090815260236020526040902055603054614b4690846136ed565b603055505050565b81158015614b5a575080155b15614b63575050565b6000614b6d6134c2565b90506000614b7b84836134e5565b90506000614b8f6003612aa58660026134e5565b90506000614ba184612a9f87856136f9565b90506000614baf83866134e5565b30600090815260236020526040902054909150614bd2908390611edf90876136ed565b30600081815260236020526040902091909155603d54614bfe91906001600160a01b0316868a816134f1565b603f54614c189030906001600160a01b03168489816134f1565b604054611de59030906001600160a01b03168386816134f1565b6000614c3c6134c2565b90508215614c8f576000614c5084836134e5565b30600090815260236020526040902054909150614c6d90826136ed565b30600090815260236020526040902055603154614c8a90856136ed565b603155505b81156110ce576000614ca183836134e5565b30600090815260236020526040902054909150614cbe90826136ed565b30600090815260236020526040902055603254614cdb90846136ed565b60325550505050565b602c54614cf190836136f9565b602c55602d54614d0190826136ed565b602d555050565b602e54614d209030906001600160a01b031683612ed6565b602e54614d389083906001600160a01b031683612ed6565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614d7b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152602e54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015614dcf57600080fd5b505afa158015614de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0791906150e4565b81600181518110614e2857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152602f546040805160016209351760e01b031981529051919092169163fff6cae991600480830192600092919082900301818387803b158015614e7f57600080fd5b505af1158015614e93573d6000803e3d6000fd5b5050602e546001600160a01b0316915063791ac94790505a8460008588426040518763ffffffff1660e01b8152600401614ed19594939291906156ff565b600060405180830381600088803b158015614eeb57600080fd5b5087f1158015614eff573d6000803e3d6000fd5b5050505050505050565b602f60009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614f5957600080fd5b505af1158015614f6d573d6000803e3d6000fd5b5050602e546001600160a01b0316915063f305d71990505a6040516001600160e01b031960e084901b1681523060048201526024810186905260006044820181905260648201526001600160a01b03871660848201524260a4820152849060c4016060604051808303818589803b158015614fe757600080fd5b5088f1158015614ffb573d6000803e3d6000fd5b5050505050506040513d601f19601f8201168201806040525081019061348e91906153c9565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b600082601f830112615059578081fd5b8135602061506e615069836157a0565b61576f565b80838252828201915082860187848660051b890101111561508d578586fd5b855b858110156150ab5781358452928401929084019060010161508f565b5090979650505050505050565b80356150c3816159ca565b919050565b6000602082840312156150d9578081fd5b8135611151816159b5565b6000602082840312156150f5578081fd5b8151611151816159b5565b60008060408385031215615112578081fd5b823561511d816159b5565b9150602083013561512d816159b5565b809150509250929050565b6000806000806080858703121561514d578182fd5b8435615158816159b5565b93506020850135615168816159b5565b92506040850135615178816159b5565b91506060850135615188816159b5565b939692955090935050565b6000806000606084860312156151a7578283fd5b83356151b2816159b5565b925060208401356151c2816159b5565b929592945050506040919091013590565b600080604083850312156151e5578182fd5b82356151f0816159b5565b9150602083013561512d816159ca565b60008060408385031215615212578182fd5b823561521d816159b5565b946020939093013593505050565b60008060006060848603121561523f578283fd5b833567ffffffffffffffff80821115615256578485fd5b818601915086601f830112615269578485fd5b81356020615279615069836157a0565b8083825282820191508286018b848660051b890101111561529857898afd5b8996505b848710156152c35780356152af816159b5565b83526001969096019591830191830161529c565b50975050870135925050808211156152d9578384fd5b506152e686828701615049565b9250506152f5604085016150b8565b90509250925092565b60006020828403121561530f578081fd5b8135611151816159ca565b60006020828403121561532b578081fd5b8151611151816159ca565b60008060006060848603121561534a578081fd5b8335615355816159ca565b925060208401356151c2816159ca565b600060208284031215615376578081fd5b5035919050565b6000806040838503121561538f578182fd5b50508035926020909101359150565b6000806000606084860312156153b2578081fd5b505081359360208301359350604090920135919050565b6000806000606084860312156153dd578081fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561540e578384fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080600060a0868803121561544f578283fd5b853560ff8116811461545f578384fd5b97602087013597506040870135966060810135965060800135945092505050565b805182526020810151602083015260408101516040830152606081015160608301525050565b600082516154b8818460208701615942565b9190910192915050565b60208152600082518060208401526154e1816040850160208701615942565b601f01601f19169190910160400192915050565b60208082526022908201527f4164647265737320616c72656164792073657420746f20746869732076616c75604082015261652160f01b606082015260800190565b60208082526022908201527f5a65726f2061646472657373206973206e6f7420612076616c69642063616c6c60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602a908201527f546869732066756e6374696f6e2063616e206f6e6c7920657665722062652063604082015269616c6c6564206f6e636560b01b606082015260800190565b825181526020808401519082015260408084015190820152606080840151908201526080808401519082015260a09283015192810192909252805460c0830152600181015460e0830152600281015461010083015260038101546101208301526004810154610140830152600501546101608201526101800190565b61028081016156838288615480565b6156906080830187615480565b61569e610100830186615480565b6156ac610180830185615480565b6156ba610200830184615480565b9695505050505050565b61010081016156d38285615480565b82546080830152600183015460a0830152600283015460c0830152600383015460e08301529392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561574e5784516001600160a01b031683529383019391830191600101615729565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156157985761579861599f565b604052919050565b600067ffffffffffffffff8211156157ba576157ba61599f565b5060051b60200190565b600082198211156157d7576157d7615989565b500190565b600060ff821660ff84168060ff038211156157f9576157f9615989565b019392505050565b60008261581c57634e487b7160e01b81526012600452602481fd5b500490565b600181815b8085111561585c57816000190482111561584257615842615989565b8085161561584f57918102915b93841c9390800290615826565b509250929050565b6000611151838360008261587a57506001610de3565b8161588757506000610de3565b816001811461589d57600281146158a7576158c3565b6001915050610de3565b60ff8411156158b8576158b8615989565b50506001821b610de3565b5060208310610133831016604e8410600b84101617156158e6575081810a610de3565b6158f08383615821565b806000190482111561590457615904615989565b029392505050565b600081600019048311821515161561592657615926615989565b500290565b60008282101561593d5761593d615989565b500390565b60005b8381101561595d578181015183820152602001615945565b83811115613c5a5750506000910152565b600060001982141561598257615982615989565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110d157600080fd5b80151581146110d157600080fdfee90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e388601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c5e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e2679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28e88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e387679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28dee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6918fb98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e384e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919188601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c645524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e385ee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a69192b98b78633099fa36ed8b8680c4f8092689e1e04080eb9cbb077ca38a14d7e386679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28c679795a0195a1b76cdebb7c51d74e058aee92919b8c3389af86ef24535e8a28fee60d0579bcffd98e668647d59fec1ff86a7fb340ce572e844f234ae73a6919088601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4e90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e145524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a998ebd315c8bc806c6b7eeba04ebad68bb236645907797e79a2f1b14495a01664736f6c63430008040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000e8d4a51000

-----Decoded View---------------
Arg [0] : _supply (uint256): 1000000000000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000e8d4a51000


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.