ETH Price: $3,387.84 (-1.72%)
Gas: 3 Gwei

Token

PrePump (PRE)
 

Overview

Max Total Supply

100,000,000 PRE

Holders

271

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.482721201747148438 PRE

Value
$0.00
0x9d34151abe8d1594e74f463d350840119ab0689b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

PrePump is a service aggregating and visualizing mentions of ERC20 tokens from X and Telegram in one place. Trade with prepump.io to earn a revenue share, referral rewards, and enter the lottery.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Pre

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : pre.sol
// SPDX-License-Identifier: MIT

/**

X: https://twitter.com/prepumpio

Web: https://prepump.io

Support TG: @prepumpio

Community: https://t.me/+RLd73FKtGPQ3NTky

Email:  [email protected]

*/

pragma solidity =0.8.15;

import "./LPDiv.sol";

contract Pre is ERC20, Ownable {
    IUniswapRouter public router;
    address public pair;

    bool private swapping;
    bool public swapEnabled = true;
    bool public claimEnabled;
    bool public tradingEnabled;
    bool public publicTradingEnabled;

    PREDividendTracker public dividendTracker;

    address public devWallet;

    uint256 public swapTokensAtAmount;
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    struct Taxes {
        uint256 liquidity;
        uint256 dev;
    }

    Taxes public buyTaxes = Taxes(3, 3);
    Taxes public sellTaxes = Taxes(3, 3);

    uint256 public totalBuyTax = 6;
    uint256 public totalSellTax = 6;

    mapping(address => bool) public _isBot;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    ///////////////
    //   Events  //
    ///////////////

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor(
        address _developerwallet, 
        address _lotterywallet, 
        uint256 _referraltax, 
        uint256 _minreferralamount
    ) ERC20("PrePump", "PRE") {
        dividendTracker = new PREDividendTracker();

        setDevWallet(_developerwallet);
        setLotteryWallet(_lotterywallet);
        updateReferralTax(_referraltax); // 10
        updateMinReferralAmount(_minreferralamount); // 1000

        IUniswapRouter _router = IUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );

        router = _router;
        pair = _pair;
        setSwapTokensAtAmount(300000);
        updateMaxWalletAmount(2000000);
        setMaxBuyAndSell(2000000, 2000000);

        _setAutomatedMarketMakerPair(_pair, true);

        dividendTracker.updateLP_Token(pair);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(address(0xdead), true);
        dividendTracker.excludeFromDividends(address(_router), true);
        dividendTracker.setTokenAddress(address(this));

        excludeFromMaxWallet(address(_pair), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(_router), true);

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);

        _mint(owner(), 100000000 * (10**18));
    }

    receive() external payable {}

    function updateDividendTracker(address newAddress) public onlyOwner {
        PREDividendTracker newDividendTracker = PREDividendTracker(
            payable(newAddress)
        );
        newDividendTracker.excludeFromDividends(
            address(newDividendTracker),
            true
        );
        newDividendTracker.excludeFromDividends(address(this), true);
        newDividendTracker.excludeFromDividends(owner(), true);
        newDividendTracker.excludeFromDividends(address(router), true);
        dividendTracker = newDividendTracker;
    }

    /// @notice Manual claim the dividends
    function claim(address referrer) external {
        require(claimEnabled, "Claim not enabled");
        dividendTracker.processAccount(payable(msg.sender), referrer);
    }
    
    function setReferrer(address _referrer) external {
        dividendTracker.addReferrer(_referrer, msg.sender);
    }

    function updateMinReferralAmount(uint256 amount) public onlyOwner {
        require(amount > 0, "Cannot set zero minReferralAmount");
        dividendTracker.setMinReferralAmount(amount);
    }

    function updateReferralTax(uint256 tax) public onlyOwner {
        require(tax > 1, "Low referral tax");
        dividendTracker.updateReferralTax(tax);
    }

    function updateUserReferralTax(address account, uint256 tax) public onlyOwner {
        require(tax > 1, "Low referral tax");
        dividendTracker.updateUserReferralTax(account, tax);
    }

    function updateMaxWalletAmount(uint256 newNum) public onlyOwner {
        require(newNum >= 1000000, "Cannot set maxWallet lower than 1%");
        maxWallet = newNum * 10**18;
    }

    function setMaxBuyAndSell(uint256 maxBuy, uint256 maxSell)
        public
        onlyOwner
    {
        require(maxBuy >= 1000000, "Cannot set maxbuy lower than 1% ");
        require(maxSell >= 500000, "Cannot set maxsell lower than 0.5% ");
        maxBuyAmount = maxBuy * 10**18;
        maxSellAmount = maxSell * 10**18;
    }

    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * 10**18;
    }

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

    /// @notice Withdraw tokens sent by mistake.
    /// @param tokenAddress The address of the token to withdraw
    function rescueETH20Tokens(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).transfer(
            owner(),
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    /// @notice Send remaining ETH to dev
    /// @dev It will send all ETH to dev
    function forceSend() external onlyOwner {
        uint256 ETHbalance = address(this).balance;
        (bool success, ) = payable(devWallet).call{value: ETHbalance}("");
        require(success);
    }

    function trackerRescueETH20Tokens(address tokenAddress) external onlyOwner {
        dividendTracker.trackerRescueETH20Tokens(msg.sender, tokenAddress);
    }

    function updateRouter(address newRouter) external onlyOwner {
        router = IUniswapRouter(newRouter);
    }

    /////////////////////////////////
    // Exclude / Include functions //
    /////////////////////////////////

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    /// @dev "true" to exlcude, "false" to include
    function excludeFromDividends(address account, bool value)
        public
        onlyOwner
    {
        dividendTracker.excludeFromDividends(account, value);
    }

    function setDevWallet(address newWallet) public onlyOwner {
        devWallet = newWallet;
    }

    function setLotteryWallet(address newWallet) public onlyOwner {
        dividendTracker.setLotteryAddress(newWallet);
    }

    function setBuyTaxes(uint256 _liquidity, uint256 _dev) external onlyOwner {
        require(_liquidity + _dev <= 20, "Fee must be <= 20%");
        buyTaxes = Taxes(_liquidity, _dev);
        totalBuyTax = _liquidity + _dev;
    }

    function setSellTaxes(uint256 _liquidity, uint256 _dev) external onlyOwner {
        require(_liquidity + _dev <= 20, "Fee must be <= 20%");
        sellTaxes = Taxes(_liquidity, _dev);
        totalSellTax = _liquidity + _dev;
    }

    /// @notice Enable or disable internal swaps
    /// @dev Set "true" to enable internal swaps for liquidity, treasury and dividends
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function activateTrading() external onlyOwner {
        require(!tradingEnabled, "Trading already enabled");
        tradingEnabled = true;
    }

    function activatePublicTrading() external onlyOwner {
        require(!publicTradingEnabled, "Public trading already enabled");
        publicTradingEnabled = true;
    }

    function setClaimEnabled(bool state) external onlyOwner {
        claimEnabled = state;
    }

    /// @param bot The bot address
    /// @param value "true" to blacklist, "false" to unblacklist
    function setBot(address bot, bool value) external onlyOwner {
        require(_isBot[bot] != value);
        _isBot[bot] = value;
    }

    function setLP_Token(address _lpToken) external onlyOwner {
        dividendTracker.updateLP_Token(_lpToken);
    }

    /// @dev Set new pairs created due to listing in new DEX
    function setAutomatedMarketMakerPair(address newPair, bool value)
        external
        onlyOwner
    {
        _setAutomatedMarketMakerPair(newPair, value);
    }

    function _setAutomatedMarketMakerPair(address newPair, bool value) private {
        require(
            automatedMarketMakerPairs[newPair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[newPair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(newPair, true);
        }

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    //////////////////////
    // Getter Functions //
    //////////////////////

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

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

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function referralsOf(address referral)
        public
        view
        returns (uint256)
    {
        return dividendTracker.getReferralAmount(referral);
    }

    function totalReferralsOf()
        public
        view
        returns (uint256)
    {
        return dividendTracker.getReferralsAmount(msg.sender);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountInfo(address account)
        external
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    ////////////////////////
    // Transfer Functions //
    ////////////////////////

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

        if (
            !_isExcludedFromFees[from] && !_isExcludedFromFees[to] && !swapping
        ) {
            require(tradingEnabled, "Trading not active");

            if (automatedMarketMakerPairs[to]) {
                require(
                    amount <= maxSellAmount,
                    "You are exceeding maxSellAmount"
                );
            } else if (automatedMarketMakerPairs[from]){
                require(
                    amount <= maxBuyAmount,
                    "You are exceeding maxBuyAmount"
                );
                require(
                    publicTradingEnabled || (!publicTradingEnabled && _isExcludedFromFees[to]),
                    "Public trading not active"
                );
            }
            if (!_isExcludedFromMaxWallet[to]) {
                require(
                    amount + balanceOf(to) <= maxWallet,
                    "Unable to exceed Max Wallet"
                );
            }
        }

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

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            if (totalSellTax > 0) {
                swapAndLiquify(contractTokenBalance);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

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

        if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from])
            takeFee = false;

        if (takeFee) {
            uint256 feeAmt;
            if (automatedMarketMakerPairs[to])
                feeAmt = (amount * totalSellTax) / 100;
            else if (automatedMarketMakerPairs[from])
                feeAmt = (amount * totalBuyTax) / 100;

            amount = amount - feeAmt;
            super._transfer(from, address(this), feeAmt);
        }
        super._transfer(from, to, amount);

        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 toSwapForLiq = ((tokens * sellTaxes.liquidity) / totalSellTax) / 2;
        uint256 tokensToAddLiquidityWith = ((tokens * sellTaxes.liquidity) / totalSellTax) / 2;
        uint256 toSwapForDev = (tokens * sellTaxes.dev) / totalSellTax;

        swapTokensForETH(toSwapForLiq);

        uint256 currentbalance = address(this).balance;

        if (currentbalance > 0) {
            // Add liquidity to uni
            addLiquidity(tokensToAddLiquidityWith, currentbalance);
        }

        swapTokensForETH(toSwapForDev);

        uint256 EthTaxBalance = address(this).balance;

        // Send ETH to dev
        uint256 devAmt = EthTaxBalance;

        if (devAmt > 0) {
            (bool success, ) = payable(devWallet).call{value: devAmt}("");
            require(success, "Failed to send ETH to dev wallet");
        }

        uint256 lpBalance = IERC20(pair).balanceOf(address(this));

        //Send LP to dividends
        uint256 dividends = lpBalance;

        if (dividends > 0) {
            bool success = IERC20(pair).transfer(
                address(dividendTracker),
                dividends
            );
            if (success) {
                dividendTracker.distributeLPDividends(dividends);
                emit SendDividends(tokens, dividends);
            }
        }
    }

    // transfers LP from the owners wallet to holders // must approve this contract, on pair contract before calling
    function ManualLiquidityDistribution(uint256 amount) public onlyOwner {
        bool success = IERC20(pair).transferFrom(
            msg.sender,
            address(dividendTracker),
            amount
        );
        if (success) {
            dividendTracker.distributeLPDividends(amount);
        }
    }

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

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

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

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

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

contract PREDividendTracker is Ownable, DividendPayingToken {
    struct AccountInfo {
        address account;
        uint256 withdrawableDividends;
        uint256 totalDividends;
        uint256 lastClaimTime;
    }

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    event ExcludeFromDividends(address indexed account, bool value);
    event Claim(address indexed account, uint256 amount);

    constructor()
        DividendPayingToken("PRE_Dividend_Tracker", "PRE_Dividend_Tracker")
    {}

    function trackerRescueETH20Tokens(address recipient, address tokenAddress)
        external
        onlyOwner
    {
        IERC20(tokenAddress).transfer(
            recipient,
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    function updateLP_Token(address _lpToken) external onlyOwner {
        LP_Token = _lpToken;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "PRE_Dividend_Tracker: No transfers allowed");
    }

    function excludeFromDividends(address account, bool value)
        external
        onlyOwner
    {
        require(excludedFromDividends[account] != value);
        excludedFromDividends[account] = value;
        if (value == true) {
            _setBalance(account, 0);
        } else {
            _setBalance(account, balanceOf(account));
        }
        emit ExcludeFromDividends(account, value);
    }

    function getAccount(address account)
        public
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableDividends = withdrawableDividendOf(account);
        info.totalDividends = accumulativeDividendOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableDividends,
            info.totalDividends,
            info.lastClaimTime,
            totalDividendsWithdrawn
        );
    }

    function setBalance(address account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        _setBalance(account, newBalance);
    }

    function processAccount(address payable account, address referrer)
        external
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account, referrer);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }
}

File 2 of 10 : LPDiv.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./SafeMath.sol";
import "./ILPDiv.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";


interface IPair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function token0() external view returns (address);

}

interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

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

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, Ownable {

  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  address public LP_Token;
  // The address for the lottery that collects LP tokens from participants who come in without a referral link. 
  address public lotteryAddess;

  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;

  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  mapping(address => address[]) public referrerToReferrals;
  mapping(address => uint256) public referralToAmount;
  mapping(address => uint256) public referralToTax;

  uint256 public totalDividendsDistributed;
  uint256 public totalDividendsWithdrawn;

  address tokenAddress;
  uint256 public minReferralAmount = 3000;
  uint256 public referralTax = 10;

  constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

  function distributeLPDividends(uint256 amount) public onlyOwner{
    require(totalSupply() > 0);

    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  function setLotteryAddress(address _address) public virtual override onlyOwner {
    lotteryAddess = _address;
  }

  function setMinReferralAmount(uint256 amount) public virtual override onlyOwner {
      minReferralAmount = amount * 10**18;
  }

  function setTokenAddress(address token) public virtual override onlyOwner {
      tokenAddress = token;
  }

  function updateReferralTax(uint256 _tax) public virtual override onlyOwner {
      referralTax = _tax;
  }

  function updateUserReferralTax(address user, uint256 _tax) public virtual override onlyOwner {
      referralToTax[user] = _tax;
  }

   /// @notice  Pair referral/parrent assignment
  /// @dev If _parent = 0x0...0, then lotteryAddess becomes the parent
  function addReferrer(address _referrer, address _referral) public virtual override onlyOwner{
    require(_referral != _referrer, "Referral cannot be their own parent");
    require(isNewReferral(_referrer, _referral), "Referral already added");

    address referrerAddress = _referrer == address(0) 
        ? lotteryAddess 
        : _referrer;

    referrerToReferrals[referrerAddress].push(_referral);

    emit ReferralAdded(_referral, referrerAddress);
  }

  
  // Function to check if this is a new referral (has not been added before)
  function isNewReferral(address _referrer, address _referral) private view returns (bool) {
    for (uint256 i = 0; i < referrerToReferrals[_referrer].length; i++) {
        if (referrerToReferrals[_referrer][i] == _referral) {
            return false;
        }
    }
    return true;
  }

  // Referrals per referral
  function getReferralAmount(address _referral) public view override returns (uint256) {
    // if (isNewReferral(msg.sender, _referral)) {
    //   return 0;
    // }
    return referralToAmount[_referral];
  }

  // Total referrals for user
  function getReferralsAmount(address _referrer) public view override returns (uint256) {
    uint256 amount = 0;
    for (uint256 i = 0; i < referrerToReferrals[_referrer].length; i++) {
        amount = amount.add(referralToAmount[referrerToReferrals[_referrer][i]]);
    }
    return amount;
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend(address _referrer) public virtual override {
    _withdrawDividendOfUser(payable(msg.sender), _referrer);

  }

  function _getTax(address _address) private view returns(uint256) {
    return referralToTax[_address] > 0 ? referralToTax[_address] : referralTax;
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
 function _withdrawDividendOfUser(address payable user, address _referrer) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableFullDividendOf(user);

    // Pair referral/parrent assignment
    if (isNewReferral(_referrer, user)){
      addReferrer(_referrer, user);
    }

    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      totalDividendsWithdrawn += _withdrawableDividend;
      emit DividendWithdrawn(user, _withdrawableDividend);

      uint256 tax = _getTax(user);
      uint256 referralAmount = _withdrawableDividend.mul(tax).div(100);
      uint256 dividendAmount = _withdrawableDividend - referralAmount;

      bool success = IERC20(LP_Token).transfer(user, dividendAmount);

      if(!success) {
        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
        totalDividendsWithdrawn -= _withdrawableDividend;
        return 0;
      }

      // If the amount of the master token is less than minReferralAmount, the referrer does't receive referral reward
      IERC20 token = IERC20(tokenAddress);
      uint256 balance = token.balanceOf(_referrer);
      address referrer = _referrer;
      if (balance < minReferralAmount) {
        referrer = lotteryAddess;
      }

      IERC20(LP_Token).transfer(referrer, referralAmount);

      referralToAmount[user] = referralToAmount[user].add(referralAmount);

      return dividendAmount;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    uint256 tax = _getTax(_owner);
    return withdrawableFullDividendOf(_owner).mul(100 - tax).div(100);
  }

  function withdrawableFullDividendOf(address _owner) private view  returns(uint256) {
    return accumulativeFullDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner].sub(referralToAmount[_owner]);
  }


  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableFullDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    uint256 tax = _getTax(_owner);
    return accumulativeFullDividendOf(_owner).mul(100 - tax).div(100);
  }

  function accumulativeFullDividendOf(address _owner) private view returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }


  /// @dev Internal function that transfer tokens from one address to another.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param from The address to transfer from.
  /// @param to The address to transfer to.
  /// @param value The amount to be transferred.
  function _transfer(address from, address to, uint256 value) internal virtual override {
    require(false);

    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }

  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that burns an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);

    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);

    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}

File 3 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

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

        return c;
    }

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

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

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

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

        return c;
    }

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

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

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

File 4 of 10 : ILPDiv.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;



interface DividendPayingTokenInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend(address _referrer) external;

  function setLotteryAddress(address _address) external;

  function addReferrer(address _referrer, address _referral) external;

  function setMinReferralAmount(uint256 amount) external;

  function setTokenAddress(address token) external;

  function updateReferralTax(uint256 _tax) external;

  function updateUserReferralTax(address user, uint256 _tax) external;

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  function getReferralAmount(address _referral) external view returns(uint256);

  function getReferralsAmount(address _referrer) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );

  event ReferralAdded(
    address indexed referrer,
    address indexed referral
  );
  
}

File 5 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 6 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

File 7 of 10 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 9 of 10 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

File 10 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/IERC20.sol";

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_developerwallet","type":"address"},{"internalType":"address","name":"_lotterywallet","type":"address"},{"internalType":"uint256","name":"_referraltax","type":"uint256"},{"internalType":"uint256","name":"_minreferralamount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualLiquidityDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activatePublicTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract PREDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referral","type":"address"}],"name":"referralsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bot","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setClaimEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"setLP_Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setLotteryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"}],"name":"setMaxBuyAndSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_dev","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"trackerRescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinReferralAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"updateReferralTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tax","type":"uint256"}],"name":"updateUserReferralTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6007805460ff60a81b1916600160a81b1790556003608081905260a0819052600e819055600f81905561010060405260c081905260e08190526010819055601155600660128190556013553480156200005757600080fd5b50604051620065d9380380620065d98339810160408190526200007a9162000e34565b60405180604001604052806007815260200166050726550756d760cc1b8152506040518060400160405280600381526020016250524560e81b8152508160039081620000c7919062000f20565b506004620000d6828262000f20565b505050620000f3620000ed620006ae60201b60201c565b620006b2565b604051620001019062000e09565b604051809103906000f0801580156200011e573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03929092169190911790556200014a8462000704565b620001558362000730565b62000160826200079f565b6200016b8162000824565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001c5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001eb919062000fec565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000239573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025f919062000fec565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d3919062000fec565b600680546001600160a01b038086166001600160a01b0319928316179092556007805492841692909116919091179055905062000313620493e0620008bc565b62000321621e8480620008e0565b62000330621e84808062000964565b6200033d81600162000a56565b60085460075460405163225b5ecf60e11b81526001600160a01b0391821660048201529116906344b6bd9e90602401600060405180830381600087803b1580156200038757600080fd5b505af11580156200039c573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b0390911660048201819052600160248301529250630483f7a09150604401600060405180830381600087803b158015620003ed57600080fd5b505af115801562000402573d6000803e3d6000fd5b505060085460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200045257600080fd5b505af115801562000467573d6000803e3d6000fd5b50506008546001600160a01b03169150630483f7a09050620004916005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004da57600080fd5b505af1158015620004ef573d6000803e3d6000fd5b505060085460405162241fbd60e51b815261dead6004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200054157600080fd5b505af115801562000556573d6000803e3d6000fd5b505060085460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b158015620005a857600080fd5b505af1158015620005bd573d6000803e3d6000fd5b5050600854604051631352746960e11b81523060048201526001600160a01b0390911692506326a4e8d29150602401600060405180830381600087803b1580156200060757600080fd5b505af11580156200061c573d6000803e3d6000fd5b505050506200063381600162000bc060201b60201c565b6200064030600162000bc0565b6200064d82600162000bc0565b6200066c620006646005546001600160a01b031690565b600162000bf5565b6200067930600162000bf5565b620006a2620006906005546001600160a01b031690565b6a52b7d2dcc80cd2e400000062000ce3565b50505050505062001064565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200070e62000da6565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6200073a62000da6565b600854604051631519959560e11b81526001600160a01b03838116600483015290911690632a332b2a906024015b600060405180830381600087803b1580156200078357600080fd5b505af115801562000798573d6000803e3d6000fd5b5050505050565b620007a962000da6565b60018111620007f25760405162461bcd60e51b815260206004820152601060248201526f098deee40e4cacccae4e4c2d840e8c2f60831b60448201526064015b60405180910390fd5b60085460405163ed82b54f60e01b8152600481018390526001600160a01b039091169063ed82b54f9060240162000768565b6200082e62000da6565b600081116200088a5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574207a65726f206d696e526566657272616c416d6f756e6044820152601d60fa1b6064820152608401620007e9565b600854604051636e4c68ef60e11b8152600481018390526001600160a01b039091169063dc98d1de9060240162000768565b620008c662000da6565b620008da81670de0b6b3a764000062001027565b600a5550565b620008ea62000da6565b620f42408110156200094a5760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401620007e9565b6200095e81670de0b6b3a764000062001027565b600d5550565b6200096e62000da6565b620f4240821015620009c35760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125206044820152606401620007e9565b6207a12081101562000a245760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60448201526201a92960ed1b6064820152608401620007e9565b62000a3882670de0b6b3a764000062001027565b600b5562000a4f81670de0b6b3a764000062001027565b600c555050565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150362000aee5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401620007e9565b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915562000b845760085460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801562000b6a57600080fd5b505af115801562000b7f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b62000bca62000da6565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b62000bff62000da6565b6001600160a01b03821660009081526015602052604090205481151560ff90911615150362000c845760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401620007e9565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b03821662000d3b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620007e9565b806002600082825462000d4f919062001049565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6005546001600160a01b0316331462000e025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620007e9565b565b505050565b61227c806200435d83390190565b80516001600160a01b038116811462000e2f57600080fd5b919050565b6000806000806080858703121562000e4b57600080fd5b62000e568562000e17565b935062000e666020860162000e17565b6040860151606090960151949790965092505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000ea757607f821691505b60208210810362000ec857634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e0457600081815260208120601f850160051c8101602086101562000ef75750805b601f850160051c820191505b8181101562000f185782815560010162000f03565b505050505050565b81516001600160401b0381111562000f3c5762000f3c62000e7c565b62000f548162000f4d845462000e92565b8462000ece565b602080601f83116001811462000f8c576000841562000f735750858301515b600019600386901b1c1916600185901b17855562000f18565b600085815260208120601f198616915b8281101562000fbd5788860151825594840194600190910190840162000f9c565b508582101562000fdc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000fff57600080fd5b6200100a8262000e17565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562001044576200104462001011565b500290565b600082198211156200105f576200105f62001011565b500190565b6132e980620010746000396000f3fe6080604052600436106103e85760003560e01c806388e765ff11610208578063abb8105211610118578063d2fcc001116100ab578063ed82b54f1161007a578063ed82b54f14610bf8578063f2fde38b14610c18578063f66895a314610c38578063f887ea4014610c53578063f8b45b0514610c7357600080fd5b8063d2fcc00114610b82578063dd62ed3e14610ba2578063e01af92c14610bc2578063e2f4560514610be257600080fd5b8063bdf1436d116100e7578063bdf1436d14610b02578063c024666814610b22578063c18bc19514610b42578063c851cc3214610b6257600080fd5b8063abb8105214610a62578063afa4f3b214610a92578063b62496f514610ab2578063ba46a75114610ae257600080fd5b80639a7a23d61161019b578063a457c2d71161016a578063a457c2d7146109c2578063a8aa1b31146109e2578063a8b9d24014610a02578063a9059cbb14610a22578063aa35822c14610a4257600080fd5b80639a7a23d6146109425780639c35293014610962578063a11a168214610982578063a18a7bfc146109a257600080fd5b80638ea5220f116101d75780638ea5220f146108d857806392929a09146108f857806393ab70f51461091857806395d89b411461092d57600080fd5b806388e765ff1461086457806389ae741a1461087a5780638c9684f91461089a5780638da5cb5b146108ba57600080fd5b8063342aa8b51161030357806369319fbd1161029657806379b447bd1161026557806379b447bd146107825780637b510fe8146107a2578063831aba43146107f4578063864701a51461081457806388bdd9be1461084457600080fd5b806369319fbd146107015780636ddd17131461071657806370a0823114610737578063715018a61461076d57600080fd5b80634ada218b116102d25780634ada218b146106715780634fbee1931461069257806366d602ae146106cb5780636843cd84146106e157600080fd5b8063342aa8b5146105fa578063395093511461061a578063455cfed11461063a57806346469afb1461065b57600080fd5b80631e83409a1161037b5780632c1f52161161034a5780632c1f5216146105715780632e1ab904146105a957806330bb4cff146105c9578063313ce567146105de57600080fd5b80631e83409a146104f05780631f53ac021461051057806323b872dd146105305780632866ed211461055057600080fd5b80630bd05b69116103b75780630bd05b691461049157806312b77e8a146104a657806318160ddd146104bb5780631bff7898146104da57600080fd5b80630483f7a0146103f457806306fdde0314610416578063095ea7b3146104415780630a78097d1461047157600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061041461040f366004612e75565b610c89565b005b34801561042257600080fd5b5061042b610cfc565b6040516104389190612eae565b60405180910390f35b34801561044d57600080fd5b5061046161045c366004612f03565b610d8e565b6040519015158152602001610438565b34801561047d57600080fd5b5061041461048c366004612f2f565b610da6565b34801561049d57600080fd5b50610414610eab565b3480156104b257600080fd5b50610414610f27565b3480156104c757600080fd5b506002545b604051908152602001610438565b3480156104e657600080fd5b506104cc60135481565b3480156104fc57600080fd5b5061041461050b366004612f2f565b610f93565b34801561051c57600080fd5b5061041461052b366004612f2f565b611018565b34801561053c57600080fd5b5061046161054b366004612f53565b611042565b34801561055c57600080fd5b5060075461046190600160b01b900460ff1681565b34801561057d57600080fd5b50600854610591906001600160a01b031681565b6040516001600160a01b039091168152602001610438565b3480156105b557600080fd5b506104146105c4366004612f2f565b611066565b3480156105d557600080fd5b506104cc6110d1565b3480156105ea57600080fd5b5060405160128152602001610438565b34801561060657600080fd5b50610414610615366004612e75565b611144565b34801561062657600080fd5b50610461610635366004612f03565b6111a4565b34801561064657600080fd5b5060075461046190600160c01b900460ff1681565b34801561066757600080fd5b506104cc60125481565b34801561067d57600080fd5b5060075461046190600160b81b900460ff1681565b34801561069e57600080fd5b506104616106ad366004612f2f565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156106d757600080fd5b506104cc600c5481565b3480156106ed57600080fd5b506104cc6106fc366004612f2f565b6111c6565b34801561070d57600080fd5b5061041461123c565b34801561072257600080fd5b5060075461046190600160a81b900460ff1681565b34801561074357600080fd5b506104cc610752366004612f2f565b6001600160a01b031660009081526020819052604090205490565b34801561077957600080fd5b506104146112b3565b34801561078e57600080fd5b5061041461079d366004612f94565b6112c7565b3480156107ae57600080fd5b506107c26107bd366004612f2f565b6113af565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610438565b34801561080057600080fd5b506104cc61080f366004612f2f565b611439565b34801561082057600080fd5b50600e54600f5461082f919082565b60408051928352602083019190915201610438565b34801561085057600080fd5b5061041461085f366004612f2f565b61146c565b34801561087057600080fd5b506104cc600b5481565b34801561088657600080fd5b50610414610895366004612f03565b61163e565b3480156108a657600080fd5b506104146108b5366004612f2f565b6116c2565b3480156108c657600080fd5b506005546001600160a01b0316610591565b3480156108e457600080fd5b50600954610591906001600160a01b031681565b34801561090457600080fd5b50610414610913366004612fb6565b611702565b34801561092457600080fd5b506104cc611728565b34801561093957600080fd5b5061042b611771565b34801561094e57600080fd5b5061041461095d366004612e75565b611780565b34801561096e57600080fd5b5061041461097d366004612f2f565b611792565b34801561098e57600080fd5b5061041461099d366004612f94565b6117cc565b3480156109ae57600080fd5b506104146109bd366004612f2f565b611851565b3480156109ce57600080fd5b506104616109dd366004612f03565b611889565b3480156109ee57600080fd5b50600754610591906001600160a01b031681565b348015610a0e57600080fd5b506104cc610a1d366004612f2f565b611904565b348015610a2e57600080fd5b50610461610a3d366004612f03565b611937565b348015610a4e57600080fd5b50610414610a5d366004612f94565b611945565b348015610a6e57600080fd5b50610461610a7d366004612f2f565b60146020526000908152604090205460ff1681565b348015610a9e57600080fd5b50610414610aad366004612fd3565b6119ca565b348015610abe57600080fd5b50610461610acd366004612f2f565b60166020526000908152604090205460ff1681565b348015610aee57600080fd5b50610414610afd366004612fd3565b6119ea565b348015610b0e57600080fd5b50610414610b1d366004612fd3565b611a7d565b348015610b2e57600080fd5b50610414610b3d366004612e75565b611b42565b348015610b4e57600080fd5b50610414610b5d366004612fd3565b611c2c565b348015610b6e57600080fd5b50610414610b7d366004612f2f565b611caa565b348015610b8e57600080fd5b50610414610b9d366004612e75565b611cd4565b348015610bae57600080fd5b506104cc610bbd366004612fec565b611d07565b348015610bce57600080fd5b50610414610bdd366004612fb6565b611d32565b348015610bee57600080fd5b506104cc600a5481565b348015610c0457600080fd5b50610414610c13366004612fd3565b611d58565b348015610c2457600080fd5b50610414610c33366004612f2f565b611dd4565b348015610c4457600080fd5b5060105460115461082f919082565b348015610c5f57600080fd5b50600654610591906001600160a01b031681565b348015610c7f57600080fd5b506104cc600d5481565b610c91611e4d565b60085460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610ce057600080fd5b505af1158015610cf4573d6000803e3d6000fd5b505050505050565b606060038054610d0b9061301a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d379061301a565b8015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050905090565b600033610d9c818585611ea7565b5060019392505050565b610dae611e4d565b806001600160a01b031663a9059cbb610dcf6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e379190613054565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea7919061306d565b5050565b610eb3611e4d565b600754600160b81b900460ff1615610f125760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c656400000000000000000060448201526064015b60405180910390fd5b6007805460ff60b81b1916600160b81b179055565b610f2f611e4d565b60095460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f80576040519150601f19603f3d011682016040523d82523d6000602084013e610f85565b606091505b5050905080610ea757600080fd5b600754600160b01b900460ff16610fe05760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd08195b98589b1959607a1b6044820152606401610f09565b6008546040516352b5f81d60e01b81523360048201526001600160a01b038381166024830152909116906352b5f81d90604401610e64565b611020611e4d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600033611050858285611fcb565b61105b858585612045565b506001949350505050565b61106e611e4d565b60085460405163225b5ecf60e11b81526001600160a01b038381166004830152909116906344b6bd9e906024015b600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b5050505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613054565b905090565b61114c611e4d565b6001600160a01b03821660009081526014602052604090205481151560ff90911615150361117957600080fd5b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600033610d9c8185856111b78383611d07565b6111c191906130a0565b611ea7565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112369190613054565b92915050565b611244611e4d565b600754600160c01b900460ff161561129e5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632074726164696e6720616c726561647920656e61626c656400006044820152606401610f09565b6007805460ff60c01b1916600160c01b179055565b6112bb611e4d565b6112c560006126b7565b565b6112cf611e4d565b620f42408210156113225760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125206044820152606401610f09565b6207a1208110156113815760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60448201526201a92960ed1b6064820152608401610f09565b61139382670de0b6b3a76400006130b8565b600b556113a881670de0b6b3a76400006130b8565b600c555050565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839291169063fbcbc0f19060240160a060405180830381865afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906130d7565b939a9299509097509550909350915050565b6008546040516342f81b6760e11b81526001600160a01b03838116600483015260009216906385f036ce906024016111f5565b611474611e4d565b60405162241fbd60e51b81526001600160a01b03821660048201819052600160248301528291630483f7a090604401600060405180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505060405162241fbd60e51b8152306004820152600160248201526001600160a01b0384169250630483f7a09150604401600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050806001600160a01b0316630483f7a06115556005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505060065460405162241fbd60e51b81526001600160a01b039182166004820152600160248201529084169250630483f7a09150604401600060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b5050600880546001600160a01b0319166001600160a01b039490941693909317909255505050565b611646611e4d565b600181116116895760405162461bcd60e51b815260206004820152601060248201526f098deee40e4cacccae4e4c2d840e8c2f60831b6044820152606401610f09565b6008546040516344d73a0d60e11b81526001600160a01b03848116600483015260248201849052909116906389ae741a90604401610cc6565b6116ca611e4d565b60085460405163497ec82360e01b81523360048201526001600160a01b0383811660248301529091169063497ec8239060440161109c565b61170a611e4d565b60078054911515600160b01b0260ff60b01b19909216919091179055565b600854604051630b4d047560e21b81523360048201526000916001600160a01b031690632d3411d490602401602060405180830381865afa15801561111b573d6000803e3d6000fd5b606060048054610d0b9061301a565b611788611e4d565b610ea78282612709565b61179a611e4d565b600854604051631519959560e11b81526001600160a01b03838116600483015290911690632a332b2a9060240161109c565b6117d4611e4d565b60146117e082846130a0565b11156118235760405162461bcd60e51b8152602060048201526012602482015271466565206d757374206265203c3d2032302560701b6044820152606401610f09565b604080518082019091528281526020018190526010829055601181905561184a81836130a0565b6013555050565b6008546040516317284cb760e31b81526001600160a01b0383811660048301523360248301529091169063b94265b89060440161109c565b600033816118978286611d07565b9050838110156118f75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f09565b61105b8286868403611ea7565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f5565b600033610d9c818585612045565b61194d611e4d565b601461195982846130a0565b111561199c5760405162461bcd60e51b8152602060048201526012602482015271466565206d757374206265203c3d2032302560701b6044820152606401610f09565b60408051808201909152828152602001819052600e829055600f8190556119c381836130a0565b6012555050565b6119d2611e4d565b6119e481670de0b6b3a76400006130b8565b600a5550565b6119f2611e4d565b60008111611a4c5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574207a65726f206d696e526566657272616c416d6f756e6044820152601d60fa1b6064820152608401610f09565b600854604051636e4c68ef60e11b8152600481018390526001600160a01b039091169063dc98d1de9060240161109c565b611a85611e4d565b6007546008546040516323b872dd60e01b81523360048201526001600160a01b0391821660248201526044810184905260009291909116906323b872dd906064016020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b09919061306d565b90508015610ea757600854604051633b79ab6760e21b8152600481018490526001600160a01b039091169063ede6ad9c90602401610cc6565b611b4a611e4d565b6001600160a01b03821660009081526015602052604090205481151560ff909116151503611bcd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610f09565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611c34611e4d565b620f4240811015611c925760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610f09565b611ca481670de0b6b3a76400006130b8565b600d5550565b611cb2611e4d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b611cdc611e4d565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611d3a611e4d565b60078054911515600160a81b0260ff60a81b19909216919091179055565b611d60611e4d565b60018111611da35760405162461bcd60e51b815260206004820152601060248201526f098deee40e4cacccae4e4c2d840e8c2f60831b6044820152606401610f09565b60085460405163ed82b54f60e01b8152600481018390526001600160a01b039091169063ed82b54f9060240161109c565b611ddc611e4d565b6001600160a01b038116611e415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f09565b611e4a816126b7565b50565b6005546001600160a01b031633146112c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f09565b6001600160a01b038316611f095760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f09565b6001600160a01b038216611f6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f09565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611fd78484611d07565b9050600019811461203f57818110156120325760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f09565b61203f8484848403611ea7565b50505050565b6001600160a01b03831661206b5760405162461bcd60e51b8152600401610f0990613120565b6001600160a01b0382166120915760405162461bcd60e51b8152600401610f0990613165565b6001600160a01b03831660009081526015602052604090205460ff161580156120d357506001600160a01b03821660009081526015602052604090205460ff16155b80156120e95750600754600160a01b900460ff16155b1561234c57600754600160b81b900460ff1661213c5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610f09565b6001600160a01b03821660009081526016602052604090205460ff16156121b457600c548111156121af5760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e74006044820152606401610f09565b6122b8565b6001600160a01b03831660009081526016602052604090205460ff16156122b857600b548111156122275760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e7400006044820152606401610f09565b600754600160c01b900460ff168061226c5750600754600160c01b900460ff1615801561226c57506001600160a01b03821660009081526015602052604090205460ff165b6122b85760405162461bcd60e51b815260206004820152601960248201527f5075626c69632074726164696e67206e6f7420616374697665000000000000006044820152606401610f09565b6001600160a01b03821660009081526017602052604090205460ff1661234c57600d546001600160a01b0383166000908152602081905260409020546122fe90836130a0565b111561234c5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610f09565b80600003612365576123608383600061286e565b505050565b30600090815260208190526040902054600a54811080159081906123935750600754600160a01b900460ff16155b80156123a85750600754600160a81b900460ff165b80156123cc57506001600160a01b03841660009081526016602052604090205460ff165b80156123f157506001600160a01b03851660009081526015602052604090205460ff16155b801561241657506001600160a01b03841660009081526015602052604090205460ff16155b1561244d576007805460ff60a01b1916600160a01b1790556013541561243f5761243f82612998565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526015602052604090205460ff600160a01b90920482161591168061249b57506001600160a01b03851660009081526015602052604090205460ff165b156124a4575060005b6001600160a01b03851660009081526016602052604090205460ff161580156124e657506001600160a01b03861660009081526016602052604090205460ff16155b156124ef575060005b801561258e576001600160a01b03851660009081526016602052604081205460ff16156125375760646013548661252691906130b8565b61253091906131a8565b9050612575565b6001600160a01b03871660009081526016602052604090205460ff16156125755760646012548661256891906130b8565b61257291906131a8565b90505b61257f81866131ca565b945061258c87308361286e565b505b61259986868661286e565b6008546001600160a01b031663e30443bc876125ca816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561261057600080fd5b505af1925050508015612621575060015b506008546001600160a01b031663e30443bc86612653816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561269957600080fd5b505af19250505080156126aa575060015b15610cf457505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361279f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610f09565b6001600160a01b0382166000908152601660205260409020805460ff191682158015919091179091556128325760085460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561281957600080fd5b505af115801561282d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166128945760405162461bcd60e51b8152600401610f0990613120565b6001600160a01b0382166128ba5760405162461bcd60e51b8152600401610f0990613165565b6001600160a01b038316600090815260208190526040902054818110156129325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f09565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361203f565b6013546010546000916002916129ae90856130b8565b6129b891906131a8565b6129c291906131a8565b905060006002601354601060000154856129dc91906130b8565b6129e691906131a8565b6129f091906131a8565b601354601154919250600091612a0690866130b8565b612a1091906131a8565b9050612a1b83612c84565b478015612a2c57612a2c8382612da8565b612a3582612c84565b47808015612ae2576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a8a576040519150601f19603f3d011682016040523d82523d6000602084013e612a8f565b606091505b5050905080612ae05760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f2073656e642045544820746f206465762077616c6c65746044820152606401610f09565b505b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4f9190613054565b9050808015612c795760075460085460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052600092919091169063a9059cbb906044016020604051808303816000875af1158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd6919061306d565b90508015612c7757600854604051633b79ab6760e21b8152600481018490526001600160a01b039091169063ede6ad9c90602401600060405180830381600087803b158015612c2457600080fd5b505af1158015612c38573d6000803e3d6000fd5b5050604080518d8152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cb957612cb96131e1565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3691906131f7565b81600181518110612d4957612d496131e1565b6001600160a01b039283166020918202929092010152600654612d6f9130911684611ea7565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610cc6908590600090869030904290600401613214565b600654612dc09030906001600160a01b031684611ea7565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612e2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110ca9190613285565b6001600160a01b0381168114611e4a57600080fd5b8015158114611e4a57600080fd5b60008060408385031215612e8857600080fd5b8235612e9381612e52565b91506020830135612ea381612e67565b809150509250929050565b600060208083528351808285015260005b81811015612edb57858101830151858201604001528201612ebf565b81811115612eed576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612f1657600080fd5b8235612f2181612e52565b946020939093013593505050565b600060208284031215612f4157600080fd5b8135612f4c81612e52565b9392505050565b600080600060608486031215612f6857600080fd5b8335612f7381612e52565b92506020840135612f8381612e52565b929592945050506040919091013590565b60008060408385031215612fa757600080fd5b50508035926020909101359150565b600060208284031215612fc857600080fd5b8135612f4c81612e67565b600060208284031215612fe557600080fd5b5035919050565b60008060408385031215612fff57600080fd5b823561300a81612e52565b91506020830135612ea381612e52565b600181811c9082168061302e57607f821691505b60208210810361304e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561306657600080fd5b5051919050565b60006020828403121561307f57600080fd5b8151612f4c81612e67565b634e487b7160e01b600052601160045260246000fd5b600082198211156130b3576130b361308a565b500190565b60008160001904831182151516156130d2576130d261308a565b500290565b600080600080600060a086880312156130ef57600080fd5b85516130fa81612e52565b602087015160408801516060890151608090990151929a91995097965090945092505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826131c557634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156131dc576131dc61308a565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561320957600080fd5b8151612f4c81612e52565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132645784516001600160a01b03168352938301939183019160010161323f565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329a57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220bf34a01511ce76da4d85012e45b26fefdb0d38b92453ae41cf486c677bf9c23a64736f6c634300080f00336080604052610bb8601155600a6012553480156200001c57600080fd5b5060408051808201825260148082527f5052455f4469766964656e645f547261636b657200000000000000000000000060208084018290528451808601909552918452908301529081816003620000748382620001a3565b506004620000838282620001a3565b505050620000a06200009a620000a860201b60201c565b620000ac565b50506200026f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012957607f821691505b6020821081036200014a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019e57600081815260208120601f850160051c81016020861015620001795750805b601f850160051c820191505b818110156200019a5782815560010162000185565b5050505b505050565b81516001600160401b03811115620001bf57620001bf620000fe565b620001d781620001d0845462000114565b8462000150565b602080601f8311600181146200020f5760008415620001f65750858301515b600019600386901b1c1916600185901b1785556200019a565b600085815260208120601f198616915b8281101562000240578886015182559484019460019091019084016200021f565b50858210156200025f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611ffd806200027f6000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063715018a61161015c578063a457c2d7116100ce578063dd62ed3e11610087578063dd62ed3e146105bc578063e30443bc146105cf578063ed82b54f146105e2578063ede6ad9c146105f5578063f2fde38b14610608578063fbcbc0f11461061b57600080fd5b8063a457c2d71461054a578063a8b9d2401461055d578063a9059cbb14610570578063aafd847a14610583578063b94265b814610596578063dc98d1de146105a957600080fd5b80638da5cb5b116101205780638da5cb5b146104ef5780639104cff21461050057806391b89fba1461051357806395d89b41146105265780639c53c0ca1461052e5780639e1e06611461054157600080fd5b8063715018a61461048f57806385a6b3ae1461049757806385f036ce146104a057806387982ac3146104c957806389ae741a146104dc57600080fd5b806327ce0147116101f5578063405057c6116101b9578063405057c61461040157806344b6bd9e1461040a578063497ec8231461041d5780634e7b827f1461043057806352b5f81d1461045357806370a082311461046657600080fd5b806327ce0147146103a65780632a332b2a146103b95780632d3411d4146103cc578063313ce567146103df57806339509351146103ee57600080fd5b80631162c4b6116102475780631162c4b61461030d578063178889b71461033857806318160ddd14610358578063226cfa3d1461036057806323b872dd1461038057806326a4e8d21461039357600080fd5b80630388c856146102845780630483f7a0146102a057806306fdde03146102b5578063095ea7b3146102ca5780631107ce96146102ed575b600080fd5b61028d60125481565b6040519081526020015b60405180910390f35b6102b36102ae366004611cc3565b610660565b005b6102bd610744565b6040516102979190611cfc565b6102dd6102d8366004611d51565b6107d6565b6040519015158152602001610297565b61028d6102fb366004611d7d565b600c6020526000908152604090205481565b600654610320906001600160a01b031681565b6040516001600160a01b039091168152602001610297565b61028d610346366004611d7d565b600d6020526000908152604090205481565b60025461028d565b61028d61036e366004611d7d565b60146020526000908152604090205481565b6102dd61038e366004611d9a565b6107f0565b6102b36103a1366004611d7d565b610814565b61028d6103b4366004611d7d565b61083e565b6102b36103c7366004611d7d565b61087a565b61028d6103da366004611d7d565b6108a4565b60405160128152602001610297565b6102dd6103fc366004611d51565b610943565b61028d60115481565b6102b3610418366004611d7d565b610965565b6102b361042b366004611ddb565b61098f565b6102dd61043e366004611d7d565b60136020526000908152604090205460ff1681565b6102dd610461366004611ddb565b610a7d565b61028d610474366004611d7d565b6001600160a01b031660009081526020819052604090205490565b6102b3610b04565b61028d600e5481565b61028d6104ae366004611d7d565b6001600160a01b03166000908152600c602052604090205490565b6103206104d7366004611d51565b610b18565b6102b36104ea366004611d51565b610b50565b6005546001600160a01b0316610320565b600754610320906001600160a01b031681565b61028d610521366004611d7d565b610b74565b6102bd610b7f565b6102b361053c366004611d7d565b610b8e565b61028d600f5481565b6102dd610558366004611d51565b610b9c565b61028d61056b366004611d7d565b610c1c565b6102dd61057e366004611d51565b610c45565b61028d610591366004611d7d565b610c53565b6102b36105a4366004611ddb565b610c80565b6102b36105b7366004611e09565b610dd8565b61028d6105ca366004611ddb565b610df8565b6102b36105dd366004611d51565b610e23565b6102b36105f0366004611e09565b610e55565b6102b3610603366004611e09565b610e62565b6102b3610616366004611d7d565b610efe565b61062e610629366004611d7d565b610f74565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610297565b61066861101c565b6001600160a01b03821660009081526013602052604090205481151560ff90911615150361069557600080fd5b6001600160a01b0382166000908152601360205260409020805460ff19168215159081179091556001036106d3576106ce826000611076565b6106fb565b6106fb826106f6846001600160a01b031660009081526020819052604090205490565b611076565b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610738911515815260200190565b60405180910390a25050565b60606003805461075390611e22565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90611e22565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050505050905090565b6000336107e48185856110d5565b60019150505b92915050565b6000336107fe8582856111f9565b61080985858561126d565b506001949350505050565b61081c61101c565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60008061084a836112c8565b9050610873606461086d61085e8483611e72565b61086787611309565b90611365565b906113e7565b9392505050565b61088261101c565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600080805b6001600160a01b0384166000908152600b602052604090205481101561093c576001600160a01b0384166000908152600b60205260408120805461092892600c929091859081106108fc576108fc611e89565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611429565b91508061093481611e9f565b9150506108a9565b5092915050565b6000336107e48185856109568383610df8565b6109609190611eb8565b6110d5565b61096d61101c565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b61099761101c565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90849083906370a0823190602401602060405180830381865afa1580156109e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a099190611ed0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a789190611ee9565b505050565b6000610a8761101c565b6000610a938484611488565b90508015610afa576001600160a01b03841660008181526014602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610ae89084815260200190565b60405180910390a260019150506107ea565b5060009392505050565b610b0c61101c565b610b1660006117b2565b565b600b6020528160005260406000208181548110610b3457600080fd5b6000918252602090912001546001600160a01b03169150829050565b610b5861101c565b6001600160a01b039091166000908152600d6020526040902055565b60006107ea82610c1c565b60606004805461075390611e22565b610b983382611488565b5050565b60003381610baa8286610df8565b905083811015610c0f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b61080982868684036110d5565b600080610c28836112c8565b9050610873606461086d610c3c8483611e72565b61086787611804565b6000336107e481858561126d565b6001600160a01b0381166000908152600c6020908152604080832054600a9092528220546107ea9161182c565b610c8861101c565b816001600160a01b0316816001600160a01b031603610cf55760405162461bcd60e51b815260206004820152602360248201527f526566657272616c2063616e6e6f74206265207468656972206f776e20706172604482015262195b9d60ea1b6064820152608401610c06565b610cff828261186e565b610d445760405162461bcd60e51b8152602060048201526016602482015275149959995c9c985b08185b1c9958591e48185919195960521b6044820152606401610c06565b60006001600160a01b03831615610d5b5782610d68565b6007546001600160a01b03165b6001600160a01b038181166000818152600b60209081526040808320805460018101825590845291832090910180546001600160a01b03191694881694851790555193945090927f3f6a300e641007b6c88b17485d36e2d83c20409a1c5e79bfa1f4eb69ea0946959190a3505050565b610de061101c565b610df281670de0b6b3a7640000611f06565b60115550565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610e2b61101c565b6001600160a01b03821660009081526013602052604090205460ff16610b9857610b988282611076565b610e5d61101c565b601255565b610e6a61101c565b6000610e7560025490565b11610e7f57600080fd5b8015610efb57610eb2610e9160025490565b610e9f83600160801b611365565b610ea99190611f25565b60085490611429565b60085560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600e54610ef79082611429565b600e555b50565b610f0661101c565b6001600160a01b038116610f6b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c06565b610efb816117b2565b6000806000806000610fb0604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610fc587610c1c565b6020820152610fd38761083e565b60408281019182526001600160a01b03989098166000908152601460209081529890205460608301819052825198909201519051600f5498999198909750919550909350915050565b6005546001600160a01b03163314610b165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c06565b6001600160a01b038216600090815260208190526040902054808211156110b55760006110a3838361182c565b90506110af8482611901565b50505050565b80821015610a785760006110c9828461182c565b90506110af8482611965565b6001600160a01b0383166111375760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c06565b6001600160a01b0382166111985760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c06565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006112058484610df8565b905060001981146110af57818110156112605760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610c06565b6110af84848484036110d5565b60405162461bcd60e51b815260206004820152602a60248201527f5052455f4469766964656e645f547261636b65723a204e6f207472616e7366656044820152691c9cc8185b1b1bddd95960b21b6064820152608401610c06565b6001600160a01b0381166000908152600d60205260408120546112ed576012546107ea565b506001600160a01b03166000908152600d602052604090205490565b6001600160a01b03811660009081526009602090815260408083205491839052822054600854600160801b9261135b92611356926113509161134b9190611365565b6119a9565b906119b9565b6119f7565b6107ea9190611f25565b600082600003611377575060006107ea565b60006113838385611f06565b9050826113908583611f25565b146108735760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c06565b600061087383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611a0a565b6000806114368385611eb8565b9050838110156108735760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c06565b60008061149484611804565b90506114a0838561186e565b156114af576114af8385610c80565b8015610afa576001600160a01b0384166000908152600a60205260409020546114d89082611429565b6001600160a01b0385166000908152600a6020526040812091909155600f8054839290611506908490611eb8565b90915550506040518181526001600160a01b038516907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a26000611554856112c8565b90506000611567606461086d8585611365565b905060006115758285611e72565b60065460405163a9059cbb60e01b81526001600160a01b038a81166004830152602482018490529293506000929091169063a9059cbb906044016020604051808303816000875af11580156115ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f29190611ee9565b90508061165e576001600160a01b0388166000908152600a602052604090205461161c908661182c565b6001600160a01b0389166000908152600a6020526040812091909155600f805487929061164a908490611e72565b90915550600096506107ea95505050505050565b6010546040516370a0823160e01b81526001600160a01b0389811660048301529091169060009082906370a0823190602401602060405180830381865afa1580156116ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d19190611ed0565b60115490915089908210156116ee57506007546001600160a01b03165b60065460405163a9059cbb60e01b81526001600160a01b038381166004830152602482018990529091169063a9059cbb906044016020604051808303816000875af1158015611741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117659190611ee9565b506001600160a01b038b166000908152600c60205260409020546117899087611429565b6001600160a01b038c166000908152600c6020526040902055509296506107ea95505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381166000908152600a60205260408120546107ea9061182a84611309565b905b600061087383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a41565b6000805b6001600160a01b0384166000908152600b60205260409020548110156118f7576001600160a01b038481166000908152600b60205260409020805491851691839081106118c1576118c1611e89565b6000918252602090912001546001600160a01b0316036118e55760009150506107ea565b806118ef81611e9f565b915050611872565b5060019392505050565b61190b8282611a72565b61194561192661134b8360085461136590919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611b31565b6001600160a01b0390921660009081526009602052604090209190915550565b61196f8282611b6e565b61194561198a61134b8360085461136590919063ffffffff16565b6001600160a01b038416600090815260096020526040902054906119b9565b600081818112156107ea57600080fd5b6000806119c68385611f47565b9050600083121580156119d95750838112155b806119ee57506000831280156119ee57508381125b61087357600080fd5b600080821215611a0657600080fd5b5090565b60008183611a2b5760405162461bcd60e51b8152600401610c069190611cfc565b506000611a388486611f25565b95945050505050565b60008184841115611a655760405162461bcd60e51b8152600401610c069190611cfc565b506000611a388486611e72565b6001600160a01b038216611ac85760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c06565b8060026000828254611ada9190611eb8565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b600080611b3e8385611f88565b905060008312158015611b515750838113155b806119ee57506000831280156119ee575083811361087357600080fd5b6001600160a01b038216611bce5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c06565b6001600160a01b03821660009081526020819052604090205481811015611c425760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610c06565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b0381168114610efb57600080fd5b8015158114610efb57600080fd5b60008060408385031215611cd657600080fd5b8235611ce181611ca0565b91506020830135611cf181611cb5565b809150509250929050565b600060208083528351808285015260005b81811015611d2957858101830151858201604001528201611d0d565b81811115611d3b576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215611d6457600080fd5b8235611d6f81611ca0565b946020939093013593505050565b600060208284031215611d8f57600080fd5b813561087381611ca0565b600080600060608486031215611daf57600080fd5b8335611dba81611ca0565b92506020840135611dca81611ca0565b929592945050506040919091013590565b60008060408385031215611dee57600080fd5b8235611df981611ca0565b91506020830135611cf181611ca0565b600060208284031215611e1b57600080fd5b5035919050565b600181811c90821680611e3657607f821691505b602082108103611e5657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611e8457611e84611e5c565b500390565b634e487b7160e01b600052603260045260246000fd5b600060018201611eb157611eb1611e5c565b5060010190565b60008219821115611ecb57611ecb611e5c565b500190565b600060208284031215611ee257600080fd5b5051919050565b600060208284031215611efb57600080fd5b815161087381611cb5565b6000816000190483118215151615611f2057611f20611e5c565b500290565b600082611f4257634e487b7160e01b600052601260045260246000fd5b500490565b600080821280156001600160ff1b0384900385131615611f6957611f69611e5c565b600160ff1b8390038412811615611f8257611f82611e5c565b50500190565b60008083128015600160ff1b850184121615611fa657611fa6611e5c565b6001600160ff1b0384018313811615611fc157611fc1611e5c565b5050039056fea264697066735822122032d8a06caef34e487c3d0f95faaaad8c78e7cc293c6ea8ebfb0db0797c667b7964736f6c634300080f0033000000000000000000000000a5f92e6e5bb95334bc9a55f4e17fbd7f4f45f4b8000000000000000000000000efb7c8a67372781d13e0ce8eb8a783c8b18cdbce000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x6080604052600436106103e85760003560e01c806388e765ff11610208578063abb8105211610118578063d2fcc001116100ab578063ed82b54f1161007a578063ed82b54f14610bf8578063f2fde38b14610c18578063f66895a314610c38578063f887ea4014610c53578063f8b45b0514610c7357600080fd5b8063d2fcc00114610b82578063dd62ed3e14610ba2578063e01af92c14610bc2578063e2f4560514610be257600080fd5b8063bdf1436d116100e7578063bdf1436d14610b02578063c024666814610b22578063c18bc19514610b42578063c851cc3214610b6257600080fd5b8063abb8105214610a62578063afa4f3b214610a92578063b62496f514610ab2578063ba46a75114610ae257600080fd5b80639a7a23d61161019b578063a457c2d71161016a578063a457c2d7146109c2578063a8aa1b31146109e2578063a8b9d24014610a02578063a9059cbb14610a22578063aa35822c14610a4257600080fd5b80639a7a23d6146109425780639c35293014610962578063a11a168214610982578063a18a7bfc146109a257600080fd5b80638ea5220f116101d75780638ea5220f146108d857806392929a09146108f857806393ab70f51461091857806395d89b411461092d57600080fd5b806388e765ff1461086457806389ae741a1461087a5780638c9684f91461089a5780638da5cb5b146108ba57600080fd5b8063342aa8b51161030357806369319fbd1161029657806379b447bd1161026557806379b447bd146107825780637b510fe8146107a2578063831aba43146107f4578063864701a51461081457806388bdd9be1461084457600080fd5b806369319fbd146107015780636ddd17131461071657806370a0823114610737578063715018a61461076d57600080fd5b80634ada218b116102d25780634ada218b146106715780634fbee1931461069257806366d602ae146106cb5780636843cd84146106e157600080fd5b8063342aa8b5146105fa578063395093511461061a578063455cfed11461063a57806346469afb1461065b57600080fd5b80631e83409a1161037b5780632c1f52161161034a5780632c1f5216146105715780632e1ab904146105a957806330bb4cff146105c9578063313ce567146105de57600080fd5b80631e83409a146104f05780631f53ac021461051057806323b872dd146105305780632866ed211461055057600080fd5b80630bd05b69116103b75780630bd05b691461049157806312b77e8a146104a657806318160ddd146104bb5780631bff7898146104da57600080fd5b80630483f7a0146103f457806306fdde0314610416578063095ea7b3146104415780630a78097d1461047157600080fd5b366103ef57005b600080fd5b34801561040057600080fd5b5061041461040f366004612e75565b610c89565b005b34801561042257600080fd5b5061042b610cfc565b6040516104389190612eae565b60405180910390f35b34801561044d57600080fd5b5061046161045c366004612f03565b610d8e565b6040519015158152602001610438565b34801561047d57600080fd5b5061041461048c366004612f2f565b610da6565b34801561049d57600080fd5b50610414610eab565b3480156104b257600080fd5b50610414610f27565b3480156104c757600080fd5b506002545b604051908152602001610438565b3480156104e657600080fd5b506104cc60135481565b3480156104fc57600080fd5b5061041461050b366004612f2f565b610f93565b34801561051c57600080fd5b5061041461052b366004612f2f565b611018565b34801561053c57600080fd5b5061046161054b366004612f53565b611042565b34801561055c57600080fd5b5060075461046190600160b01b900460ff1681565b34801561057d57600080fd5b50600854610591906001600160a01b031681565b6040516001600160a01b039091168152602001610438565b3480156105b557600080fd5b506104146105c4366004612f2f565b611066565b3480156105d557600080fd5b506104cc6110d1565b3480156105ea57600080fd5b5060405160128152602001610438565b34801561060657600080fd5b50610414610615366004612e75565b611144565b34801561062657600080fd5b50610461610635366004612f03565b6111a4565b34801561064657600080fd5b5060075461046190600160c01b900460ff1681565b34801561066757600080fd5b506104cc60125481565b34801561067d57600080fd5b5060075461046190600160b81b900460ff1681565b34801561069e57600080fd5b506104616106ad366004612f2f565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156106d757600080fd5b506104cc600c5481565b3480156106ed57600080fd5b506104cc6106fc366004612f2f565b6111c6565b34801561070d57600080fd5b5061041461123c565b34801561072257600080fd5b5060075461046190600160a81b900460ff1681565b34801561074357600080fd5b506104cc610752366004612f2f565b6001600160a01b031660009081526020819052604090205490565b34801561077957600080fd5b506104146112b3565b34801561078e57600080fd5b5061041461079d366004612f94565b6112c7565b3480156107ae57600080fd5b506107c26107bd366004612f2f565b6113af565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610438565b34801561080057600080fd5b506104cc61080f366004612f2f565b611439565b34801561082057600080fd5b50600e54600f5461082f919082565b60408051928352602083019190915201610438565b34801561085057600080fd5b5061041461085f366004612f2f565b61146c565b34801561087057600080fd5b506104cc600b5481565b34801561088657600080fd5b50610414610895366004612f03565b61163e565b3480156108a657600080fd5b506104146108b5366004612f2f565b6116c2565b3480156108c657600080fd5b506005546001600160a01b0316610591565b3480156108e457600080fd5b50600954610591906001600160a01b031681565b34801561090457600080fd5b50610414610913366004612fb6565b611702565b34801561092457600080fd5b506104cc611728565b34801561093957600080fd5b5061042b611771565b34801561094e57600080fd5b5061041461095d366004612e75565b611780565b34801561096e57600080fd5b5061041461097d366004612f2f565b611792565b34801561098e57600080fd5b5061041461099d366004612f94565b6117cc565b3480156109ae57600080fd5b506104146109bd366004612f2f565b611851565b3480156109ce57600080fd5b506104616109dd366004612f03565b611889565b3480156109ee57600080fd5b50600754610591906001600160a01b031681565b348015610a0e57600080fd5b506104cc610a1d366004612f2f565b611904565b348015610a2e57600080fd5b50610461610a3d366004612f03565b611937565b348015610a4e57600080fd5b50610414610a5d366004612f94565b611945565b348015610a6e57600080fd5b50610461610a7d366004612f2f565b60146020526000908152604090205460ff1681565b348015610a9e57600080fd5b50610414610aad366004612fd3565b6119ca565b348015610abe57600080fd5b50610461610acd366004612f2f565b60166020526000908152604090205460ff1681565b348015610aee57600080fd5b50610414610afd366004612fd3565b6119ea565b348015610b0e57600080fd5b50610414610b1d366004612fd3565b611a7d565b348015610b2e57600080fd5b50610414610b3d366004612e75565b611b42565b348015610b4e57600080fd5b50610414610b5d366004612fd3565b611c2c565b348015610b6e57600080fd5b50610414610b7d366004612f2f565b611caa565b348015610b8e57600080fd5b50610414610b9d366004612e75565b611cd4565b348015610bae57600080fd5b506104cc610bbd366004612fec565b611d07565b348015610bce57600080fd5b50610414610bdd366004612fb6565b611d32565b348015610bee57600080fd5b506104cc600a5481565b348015610c0457600080fd5b50610414610c13366004612fd3565b611d58565b348015610c2457600080fd5b50610414610c33366004612f2f565b611dd4565b348015610c4457600080fd5b5060105460115461082f919082565b348015610c5f57600080fd5b50600654610591906001600160a01b031681565b348015610c7f57600080fd5b506104cc600d5481565b610c91611e4d565b60085460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610ce057600080fd5b505af1158015610cf4573d6000803e3d6000fd5b505050505050565b606060038054610d0b9061301a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d379061301a565b8015610d845780601f10610d5957610100808354040283529160200191610d84565b820191906000526020600020905b815481529060010190602001808311610d6757829003601f168201915b5050505050905090565b600033610d9c818585611ea7565b5060019392505050565b610dae611e4d565b806001600160a01b031663a9059cbb610dcf6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610e13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e379190613054565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea7919061306d565b5050565b610eb3611e4d565b600754600160b81b900460ff1615610f125760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c656400000000000000000060448201526064015b60405180910390fd5b6007805460ff60b81b1916600160b81b179055565b610f2f611e4d565b60095460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f80576040519150601f19603f3d011682016040523d82523d6000602084013e610f85565b606091505b5050905080610ea757600080fd5b600754600160b01b900460ff16610fe05760405162461bcd60e51b815260206004820152601160248201527010db185a5b481b9bdd08195b98589b1959607a1b6044820152606401610f09565b6008546040516352b5f81d60e01b81523360048201526001600160a01b038381166024830152909116906352b5f81d90604401610e64565b611020611e4d565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600033611050858285611fcb565b61105b858585612045565b506001949350505050565b61106e611e4d565b60085460405163225b5ecf60e11b81526001600160a01b038381166004830152909116906344b6bd9e906024015b600060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b5050505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561111b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113f9190613054565b905090565b61114c611e4d565b6001600160a01b03821660009081526014602052604090205481151560ff90911615150361117957600080fd5b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b600033610d9c8185856111b78383611d07565b6111c191906130a0565b611ea7565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112369190613054565b92915050565b611244611e4d565b600754600160c01b900460ff161561129e5760405162461bcd60e51b815260206004820152601e60248201527f5075626c69632074726164696e6720616c726561647920656e61626c656400006044820152606401610f09565b6007805460ff60c01b1916600160c01b179055565b6112bb611e4d565b6112c560006126b7565b565b6112cf611e4d565b620f42408210156113225760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125206044820152606401610f09565b6207a1208110156113815760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e60448201526201a92960ed1b6064820152608401610f09565b61139382670de0b6b3a76400006130b8565b600b556113a881670de0b6b3a76400006130b8565b600c555050565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839291169063fbcbc0f19060240160a060405180830381865afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906130d7565b939a9299509097509550909350915050565b6008546040516342f81b6760e11b81526001600160a01b03838116600483015260009216906385f036ce906024016111f5565b611474611e4d565b60405162241fbd60e51b81526001600160a01b03821660048201819052600160248301528291630483f7a090604401600060405180830381600087803b1580156114bd57600080fd5b505af11580156114d1573d6000803e3d6000fd5b505060405162241fbd60e51b8152306004820152600160248201526001600160a01b0384169250630483f7a09150604401600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b50505050806001600160a01b0316630483f7a06115556005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505060065460405162241fbd60e51b81526001600160a01b039182166004820152600160248201529084169250630483f7a09150604401600060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b5050600880546001600160a01b0319166001600160a01b039490941693909317909255505050565b611646611e4d565b600181116116895760405162461bcd60e51b815260206004820152601060248201526f098deee40e4cacccae4e4c2d840e8c2f60831b6044820152606401610f09565b6008546040516344d73a0d60e11b81526001600160a01b03848116600483015260248201849052909116906389ae741a90604401610cc6565b6116ca611e4d565b60085460405163497ec82360e01b81523360048201526001600160a01b0383811660248301529091169063497ec8239060440161109c565b61170a611e4d565b60078054911515600160b01b0260ff60b01b19909216919091179055565b600854604051630b4d047560e21b81523360048201526000916001600160a01b031690632d3411d490602401602060405180830381865afa15801561111b573d6000803e3d6000fd5b606060048054610d0b9061301a565b611788611e4d565b610ea78282612709565b61179a611e4d565b600854604051631519959560e11b81526001600160a01b03838116600483015290911690632a332b2a9060240161109c565b6117d4611e4d565b60146117e082846130a0565b11156118235760405162461bcd60e51b8152602060048201526012602482015271466565206d757374206265203c3d2032302560701b6044820152606401610f09565b604080518082019091528281526020018190526010829055601181905561184a81836130a0565b6013555050565b6008546040516317284cb760e31b81526001600160a01b0383811660048301523360248301529091169063b94265b89060440161109c565b600033816118978286611d07565b9050838110156118f75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610f09565b61105b8286868403611ea7565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d240906024016111f5565b600033610d9c818585612045565b61194d611e4d565b601461195982846130a0565b111561199c5760405162461bcd60e51b8152602060048201526012602482015271466565206d757374206265203c3d2032302560701b6044820152606401610f09565b60408051808201909152828152602001819052600e829055600f8190556119c381836130a0565b6012555050565b6119d2611e4d565b6119e481670de0b6b3a76400006130b8565b600a5550565b6119f2611e4d565b60008111611a4c5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574207a65726f206d696e526566657272616c416d6f756e6044820152601d60fa1b6064820152608401610f09565b600854604051636e4c68ef60e11b8152600481018390526001600160a01b039091169063dc98d1de9060240161109c565b611a85611e4d565b6007546008546040516323b872dd60e01b81523360048201526001600160a01b0391821660248201526044810184905260009291909116906323b872dd906064016020604051808303816000875af1158015611ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b09919061306d565b90508015610ea757600854604051633b79ab6760e21b8152600481018490526001600160a01b039091169063ede6ad9c90602401610cc6565b611b4a611e4d565b6001600160a01b03821660009081526015602052604090205481151560ff909116151503611bcd5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b6064820152608401610f09565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b611c34611e4d565b620f4240811015611c925760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610f09565b611ca481670de0b6b3a76400006130b8565b600d5550565b611cb2611e4d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b611cdc611e4d565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611d3a611e4d565b60078054911515600160a81b0260ff60a81b19909216919091179055565b611d60611e4d565b60018111611da35760405162461bcd60e51b815260206004820152601060248201526f098deee40e4cacccae4e4c2d840e8c2f60831b6044820152606401610f09565b60085460405163ed82b54f60e01b8152600481018390526001600160a01b039091169063ed82b54f9060240161109c565b611ddc611e4d565b6001600160a01b038116611e415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f09565b611e4a816126b7565b50565b6005546001600160a01b031633146112c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610f09565b6001600160a01b038316611f095760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610f09565b6001600160a01b038216611f6a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610f09565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000611fd78484611d07565b9050600019811461203f57818110156120325760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f09565b61203f8484848403611ea7565b50505050565b6001600160a01b03831661206b5760405162461bcd60e51b8152600401610f0990613120565b6001600160a01b0382166120915760405162461bcd60e51b8152600401610f0990613165565b6001600160a01b03831660009081526015602052604090205460ff161580156120d357506001600160a01b03821660009081526015602052604090205460ff16155b80156120e95750600754600160a01b900460ff16155b1561234c57600754600160b81b900460ff1661213c5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610f09565b6001600160a01b03821660009081526016602052604090205460ff16156121b457600c548111156121af5760405162461bcd60e51b815260206004820152601f60248201527f596f752061726520657863656564696e67206d617853656c6c416d6f756e74006044820152606401610f09565b6122b8565b6001600160a01b03831660009081526016602052604090205460ff16156122b857600b548111156122275760405162461bcd60e51b815260206004820152601e60248201527f596f752061726520657863656564696e67206d6178427579416d6f756e7400006044820152606401610f09565b600754600160c01b900460ff168061226c5750600754600160c01b900460ff1615801561226c57506001600160a01b03821660009081526015602052604090205460ff165b6122b85760405162461bcd60e51b815260206004820152601960248201527f5075626c69632074726164696e67206e6f7420616374697665000000000000006044820152606401610f09565b6001600160a01b03821660009081526017602052604090205460ff1661234c57600d546001600160a01b0383166000908152602081905260409020546122fe90836130a0565b111561234c5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610f09565b80600003612365576123608383600061286e565b505050565b30600090815260208190526040902054600a54811080159081906123935750600754600160a01b900460ff16155b80156123a85750600754600160a81b900460ff165b80156123cc57506001600160a01b03841660009081526016602052604090205460ff165b80156123f157506001600160a01b03851660009081526015602052604090205460ff16155b801561241657506001600160a01b03841660009081526015602052604090205460ff16155b1561244d576007805460ff60a01b1916600160a01b1790556013541561243f5761243f82612998565b6007805460ff60a01b191690555b6007546001600160a01b03861660009081526015602052604090205460ff600160a01b90920482161591168061249b57506001600160a01b03851660009081526015602052604090205460ff165b156124a4575060005b6001600160a01b03851660009081526016602052604090205460ff161580156124e657506001600160a01b03861660009081526016602052604090205460ff16155b156124ef575060005b801561258e576001600160a01b03851660009081526016602052604081205460ff16156125375760646013548661252691906130b8565b61253091906131a8565b9050612575565b6001600160a01b03871660009081526016602052604090205460ff16156125755760646012548661256891906130b8565b61257291906131a8565b90505b61257f81866131ca565b945061258c87308361286e565b505b61259986868661286e565b6008546001600160a01b031663e30443bc876125ca816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561261057600080fd5b505af1925050508015612621575060015b506008546001600160a01b031663e30443bc86612653816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561269957600080fd5b505af19250505080156126aa575060015b15610cf457505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361279f5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610f09565b6001600160a01b0382166000908152601660205260409020805460ff191682158015919091179091556128325760085460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b15801561281957600080fd5b505af115801561282d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166128945760405162461bcd60e51b8152600401610f0990613120565b6001600160a01b0382166128ba5760405162461bcd60e51b8152600401610f0990613165565b6001600160a01b038316600090815260208190526040902054818110156129325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610f09565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361203f565b6013546010546000916002916129ae90856130b8565b6129b891906131a8565b6129c291906131a8565b905060006002601354601060000154856129dc91906130b8565b6129e691906131a8565b6129f091906131a8565b601354601154919250600091612a0690866130b8565b612a1091906131a8565b9050612a1b83612c84565b478015612a2c57612a2c8382612da8565b612a3582612c84565b47808015612ae2576009546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612a8a576040519150601f19603f3d011682016040523d82523d6000602084013e612a8f565b606091505b5050905080612ae05760405162461bcd60e51b815260206004820181905260248201527f4661696c656420746f2073656e642045544820746f206465762077616c6c65746044820152606401610f09565b505b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4f9190613054565b9050808015612c795760075460085460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052600092919091169063a9059cbb906044016020604051808303816000875af1158015612bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd6919061306d565b90508015612c7757600854604051633b79ab6760e21b8152600481018490526001600160a01b039091169063ede6ad9c90602401600060405180830381600087803b158015612c2457600080fd5b505af1158015612c38573d6000803e3d6000fd5b5050604080518d8152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15b505b505050505050505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cb957612cb96131e1565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3691906131f7565b81600181518110612d4957612d496131e1565b6001600160a01b039283166020918202929092010152600654612d6f9130911684611ea7565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610cc6908590600090869030904290600401613214565b600654612dc09030906001600160a01b031684611ea7565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612e2d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110ca9190613285565b6001600160a01b0381168114611e4a57600080fd5b8015158114611e4a57600080fd5b60008060408385031215612e8857600080fd5b8235612e9381612e52565b91506020830135612ea381612e67565b809150509250929050565b600060208083528351808285015260005b81811015612edb57858101830151858201604001528201612ebf565b81811115612eed576000604083870101525b50601f01601f1916929092016040019392505050565b60008060408385031215612f1657600080fd5b8235612f2181612e52565b946020939093013593505050565b600060208284031215612f4157600080fd5b8135612f4c81612e52565b9392505050565b600080600060608486031215612f6857600080fd5b8335612f7381612e52565b92506020840135612f8381612e52565b929592945050506040919091013590565b60008060408385031215612fa757600080fd5b50508035926020909101359150565b600060208284031215612fc857600080fd5b8135612f4c81612e67565b600060208284031215612fe557600080fd5b5035919050565b60008060408385031215612fff57600080fd5b823561300a81612e52565b91506020830135612ea381612e52565b600181811c9082168061302e57607f821691505b60208210810361304e57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561306657600080fd5b5051919050565b60006020828403121561307f57600080fd5b8151612f4c81612e67565b634e487b7160e01b600052601160045260246000fd5b600082198211156130b3576130b361308a565b500190565b60008160001904831182151516156130d2576130d261308a565b500290565b600080600080600060a086880312156130ef57600080fd5b85516130fa81612e52565b602087015160408801516060890151608090990151929a91995097965090945092505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000826131c557634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156131dc576131dc61308a565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561320957600080fd5b8151612f4c81612e52565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132645784516001600160a01b03168352938301939183019160010161323f565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561329a57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220bf34a01511ce76da4d85012e45b26fefdb0d38b92453ae41cf486c677bf9c23a64736f6c634300080f0033

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

000000000000000000000000a5f92e6e5bb95334bc9a55f4e17fbd7f4f45f4b8000000000000000000000000efb7c8a67372781d13e0ce8eb8a783c8b18cdbce000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _developerwallet (address): 0xa5F92e6E5Bb95334BC9a55f4e17fBD7f4F45f4B8
Arg [1] : _lotterywallet (address): 0xEFB7C8A67372781D13e0CE8EB8a783c8B18CdBCe
Arg [2] : _referraltax (uint256): 10
Arg [3] : _minreferralamount (uint256): 1000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5f92e6e5bb95334bc9a55f4e17fbd7f4f45f4b8
Arg [1] : 000000000000000000000000efb7c8a67372781d13e0ce8eb8a783c8b18cdbce
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

261:17045:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7419:170;;;;;;;;;;-1:-1:-1;7419:170:3;;;;;:::i;:::-;;:::i;:::-;;2158:98:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4444:197;;;;;;;;;;-1:-1:-1;4444:197:6;;;;;:::i;:::-;;:::i;:::-;;;1747:14:10;;1740:22;1722:41;;1710:2;1695:18;4444:197:6;1582:187:10;6110:209:3;;;;;;;;;;-1:-1:-1;6110:209:3;;;;;:::i;:::-;;:::i;8568:148::-;;;;;;;;;;;;;:::i;6412:204::-;;;;;;;;;;;;;:::i;3255:106:6:-;;;;;;;;;;-1:-1:-1;3342:12:6;;3255:106;;;2172:25:10;;;2160:2;2145:18;3255:106:6;2026:177:10;960:31:3;;;;;;;;;;;;;;;;4264:175;;;;;;;;;;-1:-1:-1;4264:175:3;;;;;:::i;:::-;;:::i;7597:98::-;;;;;;;;;;-1:-1:-1;7597:98:3;;;;;:::i;:::-;;:::i;5203:256:6:-;;;;;;;;;;-1:-1:-1;5203:256:6;;;;;:::i;:::-;;:::i;427:24:3:-;;;;;;;;;;-1:-1:-1;427:24:3;;;;-1:-1:-1;;;427:24:3;;;;;;532:41;;;;;;;;;;-1:-1:-1;532:41:3;;;;-1:-1:-1;;;;;532:41:3;;;;;;-1:-1:-1;;;;;2860:32:10;;;2842:51;;2830:2;2815:18;532:41:3;2669:230:10;9256:117:3;;;;;;;;;;-1:-1:-1;9256:117:3;;;;;:::i;:::-;;:::i;10174:141::-;;;;;;;;;;;;;:::i;3104:91:6:-;;;;;;;;;;-1:-1:-1;3104:91:6;;3186:2;3046:36:10;;3034:2;3019:18;3104:91:6;2904:184:10;9110:138:3;;;;;;;;;;-1:-1:-1;9110:138:3;;;;;:::i;:::-;;:::i;5854:234:6:-;;;;;;;;;;-1:-1:-1;5854:234:6;;;;;:::i;:::-;;:::i;491:32:3:-;;;;;;;;;;-1:-1:-1;491:32:3;;;;-1:-1:-1;;;491:32:3;;;;;;923:30;;;;;;;;;;;;;;;;458:26;;;;;;;;;;-1:-1:-1;458:26:3;;;;-1:-1:-1;;;458:26:3;;;;;;10323:126;;;;;;;;;;-1:-1:-1;10323:126:3;;;;;:::i;:::-;-1:-1:-1;;;;;10413:28:3;10389:4;10413:28;;;:19;:28;;;;;;;;;10323:126;689:28;;;;;;;;;;;;;;;;10997:171;;;;;;;;;;-1:-1:-1;10997:171:3;;;;;:::i;:::-;;:::i;8724:173::-;;;;;;;;;;;;;:::i;390:30::-;;;;;;;;;;-1:-1:-1;390:30:3;;;;-1:-1:-1;;;390:30:3;;;;;;3419:125:6;;;;;;;;;;-1:-1:-1;3419:125:6;;;;;:::i;:::-;-1:-1:-1;;;;;3519:18:6;3493:7;3519:18;;;;;;;;;;;;3419:125;1824:101:4;;;;;;;;;;;;;:::i;5346:340:3:-;;;;;;;;;;-1:-1:-1;5346:340:3;;;;;:::i;:::-;;:::i;11176:278::-;;;;;;;;;;-1:-1:-1;11176:278:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3623:32:10;;;3605:51;;3687:2;3672:18;;3665:34;;;;3715:18;;;3708:34;;;;3773:2;3758:18;;3751:34;3816:3;3801:19;;3794:35;3592:3;3577:19;11176:278:3;3346:489:10;10649:170:3;;;;;;;;;;-1:-1:-1;10649:170:3;;;;;:::i;:::-;;:::i;836:35::-;;;;;;;;;;-1:-1:-1;836:35:3;;;;;;;;;;;;;4014:25:10;;;4070:2;4055:18;;4048:34;;;;3987:18;836:35:3;3840:248:10;3644:568:3;;;;;;;;;;-1:-1:-1;3644:568:3;;;;;:::i;:::-;;:::i;655:27::-;;;;;;;;;;;;;;;;4950:195;;;;;;;;;;-1:-1:-1;4950:195:3;;;;;:::i;:::-;;:::i;6624:160::-;;;;;;;;;;-1:-1:-1;6624:160:3;;;;;:::i;:::-;;:::i;1201:85:4:-;;;;;;;;;;-1:-1:-1;1273:6:4;;-1:-1:-1;;;;;1273:6:4;1201:85;;582:24:3;;;;;;;;;;-1:-1:-1;582:24:3;;;;-1:-1:-1;;;;;582:24:3;;;8905:95;;;;;;;;;;-1:-1:-1;8905:95:3;;;;;:::i;:::-;;:::i;10827:162::-;;;;;;;;;;;;;:::i;2369:102:6:-;;;;;;;;;;;;;:::i;9443:171:3:-;;;;;;;;;;-1:-1:-1;9443:171:3;;;;;:::i;:::-;;:::i;7703:125::-;;;;;;;;;;-1:-1:-1;7703:125:3;;;;;:::i;:::-;;:::i;8078:237::-;;;;;;;;;;-1:-1:-1;8078:237:3;;;;;:::i;:::-;;:::i;4451:118::-;;;;;;;;;;-1:-1:-1;4451:118:3;;;;;:::i;:::-;;:::i;6575:427:6:-;;;;;;;;;;-1:-1:-1;6575:427:6;;;;;:::i;:::-;;:::i;334:19:3:-;;;;;;;;;;-1:-1:-1;334:19:3;;;;-1:-1:-1;;;;;334:19:3;;;10457:184;;;;;;;;;;-1:-1:-1;10457:184:3;;;;;:::i;:::-;;:::i;3740:189:6:-;;;;;;;;;;-1:-1:-1;3740:189:6;;;;;:::i;:::-;;:::i;7836:234:3:-;;;;;;;;;;-1:-1:-1;7836:234:3;;;;;:::i;:::-;;:::i;1000:38::-;;;;;;;;;;-1:-1:-1;1000:38:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;5694:119;;;;;;;;;;-1:-1:-1;5694:119:3;;;;;:::i;:::-;;:::i;1106:57::-;;;;;;;;;;-1:-1:-1;1106:57:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;4577:196;;;;;;;;;;-1:-1:-1;4577:196:3;;;;;:::i;:::-;;:::i;15964:320::-;;;;;;;;;;-1:-1:-1;15964:320:3;;;;;:::i;:::-;;:::i;7032:327::-;;;;;;;;;;-1:-1:-1;7032:327:3;;;;;:::i;:::-;;:::i;5153:185::-;;;;;;;;;;-1:-1:-1;5153:185:3;;;;;:::i;:::-;;:::i;6792:113::-;;;;;;;;;;-1:-1:-1;6792:113:3;;;;;:::i;:::-;;:::i;5821:165::-;;;;;;;;;;-1:-1:-1;5821:165:3;;;;;:::i;:::-;;:::i;3987:149:6:-;;;;;;;;;;-1:-1:-1;3987:149:6;;;;;:::i;:::-;;:::i;8461:99:3:-;;;;;;;;;;-1:-1:-1;8461:99:3;;;;;:::i;:::-;;:::i;615:33::-;;;;;;;;;;;;;;;;4781:161;;;;;;;;;;-1:-1:-1;4781:161:3;;;;;:::i;:::-;;:::i;2074:198:4:-;;;;;;;;;;-1:-1:-1;2074:198:4;;;;;:::i;:::-;;:::i;878:36:3:-;;;;;;;;;;-1:-1:-1;878:36:3;;;;;;;;;299:28;;;;;;;;;;-1:-1:-1;299:28:3;;;;-1:-1:-1;;;;;299:28:3;;;724:24;;;;;;;;;;;;;;;;7419:170;1094:13:4;:11;:13::i;:::-;7529:15:3::1;::::0;:52:::1;::::0;-1:-1:-1;;;7529:52:3;;-1:-1:-1;;;;;5541:32:10;;;7529:52:3::1;::::0;::::1;5523:51:10::0;5617:14;;5610:22;5590:18;;;5583:50;7529:15:3;;::::1;::::0;:36:::1;::::0;5496:18:10;;7529:52:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7419:170:::0;;:::o;2158:98:6:-;2212:13;2244:5;2237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2158:98;:::o;4444:197::-;4527:4;719:10:9;4581:32:6;719:10:9;4597:7:6;4606:6;4581:8;:32::i;:::-;-1:-1:-1;4630:4:6;;4444:197;-1:-1:-1;;;4444:197:6:o;6110:209:3:-;1094:13:4;:11;:13::i;:::-;6196:12:3::1;-1:-1:-1::0;;;;;6189:29:3::1;;6233:7;1273:6:4::0;;-1:-1:-1;;;;;1273:6:4;;1201:85;6233:7:3::1;6255:45;::::0;-1:-1:-1;;;6255:45:3;;6294:4:::1;6255:45;::::0;::::1;2842:51:10::0;-1:-1:-1;;;;;6255:30:3;::::1;::::0;::::1;::::0;2815:18:10;;6255:45:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6189:122;::::0;-1:-1:-1;;;;;;6189:122:3::1;::::0;;;;;;-1:-1:-1;;;;;6410:32:10;;;6189:122:3::1;::::0;::::1;6392:51:10::0;6459:18;;;6452:34;6365:18;;6189:122:3::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6110:209:::0;:::o;8568:148::-;1094:13:4;:11;:13::i;:::-;8634:14:3::1;::::0;-1:-1:-1;;;8634:14:3;::::1;;;8633:15;8625:51;;;::::0;-1:-1:-1;;;8625:51:3;;6949:2:10;8625:51:3::1;::::0;::::1;6931:21:10::0;6988:2;6968:18;;;6961:30;7027:25;7007:18;;;7000:53;7070:18;;8625:51:3::1;;;;;;;;;8687:14;:21:::0;;-1:-1:-1;;;;8687:21:3::1;-1:-1:-1::0;;;8687:21:3::1;::::0;;8568:148::o;6412:204::-;1094:13:4;:11;:13::i;:::-;6543:9:3::1;::::0;6535:46:::1;::::0;6484:21:::1;::::0;6463:18:::1;::::0;-1:-1:-1;;;;;6543:9:3;;::::1;::::0;6484:21;;6463:18;6535:46;6463:18;6535:46;6484:21;6543:9;6535:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6516:65;;;6600:7;6592:16;;;::::0;::::1;4264:175:::0;4325:12;;-1:-1:-1;;;4325:12:3;;;;4317:42;;;;-1:-1:-1;;;4317:42:3;;7511:2:10;4317:42:3;;;7493:21:10;7550:2;7530:18;;;7523:30;-1:-1:-1;;;7569:18:10;;;7562:47;7626:18;;4317:42:3;7309:341:10;4317:42:3;4370:15;;:61;;-1:-1:-1;;;4370:61:3;;4409:10;4370:61;;;7883:34:10;-1:-1:-1;;;;;7953:15:10;;;7933:18;;;7926:43;4370:15:3;;;;:30;;7818:18:10;;4370:61:3;7655:320:10;7597:98:3;1094:13:4;:11;:13::i;:::-;7666:9:3::1;:21:::0;;-1:-1:-1;;;;;;7666:21:3::1;-1:-1:-1::0;;;;;7666:21:3;;;::::1;::::0;;;::::1;::::0;;7597:98::o;5203:256:6:-;5300:4;719:10:9;5356:38:6;5372:4;719:10:9;5387:6:6;5356:15;:38::i;:::-;5404:27;5414:4;5420:2;5424:6;5404:9;:27::i;:::-;-1:-1:-1;5448:4:6;;5203:256;-1:-1:-1;;;;5203:256:6:o;9256:117:3:-;1094:13:4;:11;:13::i;:::-;9325:15:3::1;::::0;:40:::1;::::0;-1:-1:-1;;;9325:40:3;;-1:-1:-1;;;;;2860:32:10;;;9325:40:3::1;::::0;::::1;2842:51:10::0;9325:15:3;;::::1;::::0;:30:::1;::::0;2815:18:10;;9325:40:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9256:117:::0;:::o;10174:141::-;10264:15;;:43;;;-1:-1:-1;;;10264:43:3;;;;10237:7;;-1:-1:-1;;;;;10264:15:3;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10257:50;;10174:141;:::o;9110:138::-;1094:13:4;:11;:13::i;:::-;-1:-1:-1;;;;;9189:11:3;::::1;;::::0;;;:6:::1;:11;::::0;;;;;:20;::::1;;:11;::::0;;::::1;:20;;::::0;9181:29:::1;;;::::0;::::1;;-1:-1:-1::0;;;;;9221:11:3;;;::::1;;::::0;;;:6:::1;:11;::::0;;;;:19;;-1:-1:-1;;9221:19:3::1;::::0;::::1;;::::0;;;::::1;::::0;;9110:138::o;5854:234:6:-;5942:4;719:10:9;5996:64:6;719:10:9;6012:7:6;6049:10;6021:25;719:10:9;6012:7:6;6021:9;:25::i;:::-;:38;;;;:::i;:::-;5996:8;:64::i;10997:171:3:-;11126:15;;:34;;-1:-1:-1;;;11126:34:3;;-1:-1:-1;;;;;2860:32:10;;;11126:34:3;;;2842:51:10;11094:7:3;;11126:15;;:25;;2815:18:10;;11126:34:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11119:41;10997:171;-1:-1:-1;;10997:171:3:o;8724:173::-;1094:13:4;:11;:13::i;:::-;8796:20:3::1;::::0;-1:-1:-1;;;8796:20:3;::::1;;;8795:21;8787:64;;;::::0;-1:-1:-1;;;8787:64:3;;8447:2:10;8787:64:3::1;::::0;::::1;8429:21:10::0;8486:2;8466:18;;;8459:30;8525:32;8505:18;;;8498:60;8575:18;;8787:64:3::1;8245:354:10::0;8787:64:3::1;8862:20;:27:::0;;-1:-1:-1;;;;8862:27:3::1;-1:-1:-1::0;;;8862:27:3::1;::::0;;8724:173::o;1824:101:4:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;5346:340:3:-;1094:13:4;:11;:13::i;:::-;5474:7:3::1;5464:6;:17;;5456:62;;;::::0;-1:-1:-1;;;5456:62:3;;8806:2:10;5456:62:3::1;::::0;::::1;8788:21:10::0;;;8825:18;;;8818:30;8884:34;8864:18;;;8857:62;8936:18;;5456:62:3::1;8604:356:10::0;5456:62:3::1;5548:6;5537:7;:17;;5529:65;;;::::0;-1:-1:-1;;;5529:65:3;;9167:2:10;5529:65:3::1;::::0;::::1;9149:21:10::0;9206:2;9186:18;;;9179:30;9245:34;9225:18;;;9218:62;-1:-1:-1;;;9296:18:10;;;9289:33;9339:19;;5529:65:3::1;8965:399:10::0;5529:65:3::1;5620:15;:6:::0;5629::::1;5620:15;:::i;:::-;5605:12;:30:::0;5662:16:::1;:7:::0;5672:6:::1;5662:16;:::i;:::-;5646:13;:32:::0;-1:-1:-1;;5346:340:3:o;11176:278::-;11411:15;;:35;;-1:-1:-1;;;11411:35:3;;-1:-1:-1;;;;;2860:32:10;;;11411:35:3;;;2842:51:10;11281:7:3;;;;;;;;;;11411:15;;;:26;;2815:18:10;;11411:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11404:42;;;;-1:-1:-1;11404:42:3;;-1:-1:-1;11404:42:3;-1:-1:-1;11404:42:3;;-1:-1:-1;11176:278:3;-1:-1:-1;;11176:278:3:o;10649:170::-;10768:15;;:43;;-1:-1:-1;;;10768:43:3;;-1:-1:-1;;;;;2860:32:10;;;10768:43:3;;;2842:51:10;10736:7:3;;10768:15;;:33;;2815:18:10;;10768:43:3;2669:230:10;3644:568:3;1094:13:4;:11;:13::i;:::-;3837:111:3::1;::::0;-1:-1:-1;;;3837:111:3;;-1:-1:-1;;;;;3837:39:3;::::1;:111;::::0;::::1;5523:51:10::0;;;3933:4:3::1;5590:18:10::0;;;5583:50;3804:10:3;;3837:39:::1;::::0;5496:18:10;;3837:111:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;3959:60:3::1;::::0;-1:-1:-1;;;3959:60:3;;4007:4:::1;3959:60;::::0;::::1;5523:51:10::0;4014:4:3::1;5590:18:10::0;;;5583:50;-1:-1:-1;;;;;3959:39:3;::::1;::::0;-1:-1:-1;3959:39:3::1;::::0;-1:-1:-1;5496:18:10;;3959:60:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4030:18;-1:-1:-1::0;;;;;4030:39:3::1;;4070:7;1273:6:4::0;;-1:-1:-1;;;;;1273:6:4;;1201:85;4070:7:3::1;4030:54;::::0;-1:-1:-1;;;;;;4030:54:3::1;::::0;;;;;;-1:-1:-1;;;;;5541:32:10;;;4030:54:3::1;::::0;::::1;5523:51:10::0;4079:4:3::1;5590:18:10::0;;;5583:50;5496:18;;4030:54:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;4143:6:3::1;::::0;4095:62:::1;::::0;-1:-1:-1;;;4095:62:3;;-1:-1:-1;;;;;4143:6:3;;::::1;4095:62;::::0;::::1;5523:51:10::0;4143:6:3;5590:18:10;;;5583:50;4095:39:3;;::::1;::::0;-1:-1:-1;4095:39:3::1;::::0;-1:-1:-1;5496:18:10;;4095:62:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;4168:15:3::1;:36:::0;;-1:-1:-1;;;;;;4168:36:3::1;-1:-1:-1::0;;;;;4168:36:3;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;3644:568:3:o;4950:195::-;1094:13:4;:11;:13::i;:::-;5053:1:3::1;5047:3;:7;5039:36;;;::::0;-1:-1:-1;;;5039:36:3;;10246:2:10;5039:36:3::1;::::0;::::1;10228:21:10::0;10285:2;10265:18;;;10258:30;-1:-1:-1;;;10304:18:10;;;10297:46;10360:18;;5039:36:3::1;10044:340:10::0;5039:36:3::1;5086:15;::::0;:51:::1;::::0;-1:-1:-1;;;5086:51:3;;-1:-1:-1;;;;;6410:32:10;;;5086:51:3::1;::::0;::::1;6392::10::0;6459:18;;;6452:34;;;5086:15:3;;::::1;::::0;:37:::1;::::0;6365:18:10;;5086:51:3::1;6218:274:10::0;6624:160:3;1094:13:4;:11;:13::i;:::-;6710:15:3::1;::::0;:66:::1;::::0;-1:-1:-1;;;6710:66:3;;6751:10:::1;6710:66;::::0;::::1;7883:34:10::0;-1:-1:-1;;;;;7953:15:10;;;7933:18;;;7926:43;6710:15:3;;::::1;::::0;:40:::1;::::0;7818:18:10;;6710:66:3::1;7655:320:10::0;8905:95:3;1094:13:4;:11;:13::i;:::-;8972:12:3::1;:20:::0;;;::::1;;-1:-1:-1::0;;;8972:20:3::1;-1:-1:-1::0;;;;8972:20:3;;::::1;::::0;;;::::1;::::0;;8905:95::o;10827:162::-;10935:15;;:46;;-1:-1:-1;;;10935:46:3;;10970:10;10935:46;;;2842:51:10;10903:7:3;;-1:-1:-1;;;;;10935:15:3;;:34;;2815:18:10;;10935:46:3;;;;;;;;;;;;;;;;;;;;;;2369:102:6;2425:13;2457:7;2450:14;;;;;:::i;9443:171:3:-;1094:13:4;:11;:13::i;:::-;9562:44:3::1;9591:7;9600:5;9562:28;:44::i;7703:125::-:0;1094:13:4;:11;:13::i;:::-;7776:15:3::1;::::0;:44:::1;::::0;-1:-1:-1;;;7776:44:3;;-1:-1:-1;;;;;2860:32:10;;;7776:44:3::1;::::0;::::1;2842:51:10::0;7776:15:3;;::::1;::::0;:33:::1;::::0;2815:18:10;;7776:44:3::1;2669:230:10::0;8078:237:3;1094:13:4;:11;:13::i;:::-;8193:2:3::1;8172:17;8185:4:::0;8172:10;:17:::1;:::i;:::-;:23;;8164:54;;;::::0;-1:-1:-1;;;8164:54:3;;10900:2:10;8164:54:3::1;::::0;::::1;10882:21:10::0;10939:2;10919:18;;;10912:30;-1:-1:-1;;;10958:18:10;;;10951:48;11016:18;;8164:54:3::1;10698:342:10::0;8164:54:3::1;8241:23;::::0;;;;::::1;::::0;;;;;;::::1;;::::0;;;8229:9:::1;:35:::0;;;;;;;8290:17:::1;8259:4:::0;8247:10;8290:17:::1;:::i;:::-;8275:12;:32:::0;-1:-1:-1;;8078:237:3:o;4451:118::-;4511:15;;:50;;-1:-1:-1;;;4511:50:3;;-1:-1:-1;;;;;7901:15:10;;;4511:50:3;;;7883:34:10;4550:10:3;7933:18:10;;;7926:43;4511:15:3;;;;:27;;7818:18:10;;4511:50:3;7655:320:10;6575:427:6;6668:4;719:10:9;6668:4:6;6749:25;719:10:9;6766:7:6;6749:9;:25::i;:::-;6722:52;;6812:15;6792:16;:35;;6784:85;;;;-1:-1:-1;;;6784:85:6;;11247:2:10;6784:85:6;;;11229:21:10;11286:2;11266:18;;;11259:30;11325:34;11305:18;;;11298:62;-1:-1:-1;;;11376:18:10;;;11369:35;11421:19;;6784:85:6;11045:401:10;6784:85:6;6903:60;6912:5;6919:7;6947:15;6928:16;:34;6903:8;:60::i;10457:184:3:-;10586:15;;:47;;-1:-1:-1;;;10586:47:3;;-1:-1:-1;;;;;2860:32:10;;;10586:47:3;;;2842:51:10;10554:7:3;;10586:15;;:38;;2815:18:10;;10586:47:3;2669:230:10;3740:189:6;3819:4;719:10:9;3873:28:6;719:10:9;3890:2:6;3894:6;3873:9;:28::i;7836:234:3:-;1094:13:4;:11;:13::i;:::-;7950:2:3::1;7929:17;7942:4:::0;7929:10;:17:::1;:::i;:::-;:23;;7921:54;;;::::0;-1:-1:-1;;;7921:54:3;;10900:2:10;7921:54:3::1;::::0;::::1;10882:21:10::0;10939:2;10919:18;;;10912:30;-1:-1:-1;;;10958:18:10;;;10951:48;11016:18;;7921:54:3::1;10698:342:10::0;7921:54:3::1;7997:23;::::0;;;;::::1;::::0;;;;;;::::1;;::::0;;;7986:8:::1;:34:::0;;;;;;;8045:17:::1;8015:4:::0;8003:10;8045:17:::1;:::i;:::-;8031:11;:31:::0;-1:-1:-1;;7836:234:3:o;5694:119::-;1094:13:4;:11;:13::i;:::-;5790:15:3::1;:6:::0;5799::::1;5790:15;:::i;:::-;5769:18;:36:::0;-1:-1:-1;5694:119:3:o;4577:196::-;1094:13:4;:11;:13::i;:::-;4671:1:3::1;4662:6;:10;4654:56;;;::::0;-1:-1:-1;;;4654:56:3;;11653:2:10;4654:56:3::1;::::0;::::1;11635:21:10::0;11692:2;11672:18;;;11665:30;11731:34;11711:18;;;11704:62;-1:-1:-1;;;11782:18:10;;;11775:31;11823:19;;4654:56:3::1;11451:397:10::0;4654:56:3::1;4721:15;::::0;:44:::1;::::0;-1:-1:-1;;;4721:44:3;;::::1;::::0;::::1;2172:25:10::0;;;-1:-1:-1;;;;;4721:15:3;;::::1;::::0;:36:::1;::::0;2145:18:10;;4721:44:3::1;2026:177:10::0;15964:320:3;1094:13:4;:11;:13::i;:::-;16067:4:3::1;::::0;16133:15:::1;::::0;16060:121:::1;::::0;-1:-1:-1;;;16060:121:3;;16100:10:::1;16060:121;::::0;::::1;12093:34:10::0;-1:-1:-1;;;;;16133:15:3;;::::1;12143:18:10::0;;;12136:43;12195:18;;;12188:34;;;16045:12:3::1;::::0;16067:4;;;::::1;::::0;16060:25:::1;::::0;12028:18:10;;16060:121:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16045:136;;16196:7;16192:85;;;16220:15;::::0;:45:::1;::::0;-1:-1:-1;;;16220:45:3;;::::1;::::0;::::1;2172:25:10::0;;;-1:-1:-1;;;;;16220:15:3;;::::1;::::0;:37:::1;::::0;2145:18:10;;16220:45:3::1;2026:177:10::0;7032:327:3;1094:13:4;:11;:13::i;:::-;-1:-1:-1;;;;;7139:28:3;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;7117:132:::1;;;::::0;-1:-1:-1;;;7117:132:3;;12435:2:10;7117:132:3::1;::::0;::::1;12417:21:10::0;12474:2;12454:18;;;12447:30;12513:34;12493:18;;;12486:62;-1:-1:-1;;;12564:18:10;;;12557:40;12614:19;;7117:132:3::1;12233:406:10::0;7117:132:3::1;-1:-1:-1::0;;;;;7260:28:3;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;7260:39:3::1;::::0;::::1;;::::0;;::::1;::::0;;;7317:34;;1722:41:10;;;7317:34:3::1;::::0;1695:18:10;7317:34:3::1;;;;;;;7032:327:::0;;:::o;5153:185::-;1094:13:4;:11;:13::i;:::-;5246:7:3::1;5236:6;:17;;5228:64;;;::::0;-1:-1:-1;;;5228:64:3;;12846:2:10;5228:64:3::1;::::0;::::1;12828:21:10::0;12885:2;12865:18;;;12858:30;12924:34;12904:18;;;12897:62;-1:-1:-1;;;12975:18:10;;;12968:32;13017:19;;5228:64:3::1;12644:398:10::0;5228:64:3::1;5315:15;:6:::0;5324::::1;5315:15;:::i;:::-;5303:9;:27:::0;-1:-1:-1;5153:185:3:o;6792:113::-;1094:13:4;:11;:13::i;:::-;6863:6:3::1;:34:::0;;-1:-1:-1;;;;;;6863:34:3::1;-1:-1:-1::0;;;;;6863:34:3;;;::::1;::::0;;;::::1;::::0;;6792:113::o;5821:165::-;1094:13:4;:11;:13::i;:::-;-1:-1:-1;;;;;5934:33:3;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:44;;-1:-1:-1;;5934:44:3::1;::::0;::::1;;::::0;;;::::1;::::0;;5821:165::o;3987:149:6:-;-1:-1:-1;;;;;4102:18:6;;;4076:7;4102:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3987:149::o;8461:99:3:-;1094:13:4;:11;:13::i;:::-;8530:11:3::1;:22:::0;;;::::1;;-1:-1:-1::0;;;8530:22:3::1;-1:-1:-1::0;;;;8530:22:3;;::::1;::::0;;;::::1;::::0;;8461:99::o;4781:161::-;1094:13:4;:11;:13::i;:::-;4863:1:3::1;4857:3;:7;4849:36;;;::::0;-1:-1:-1;;;4849:36:3;;10246:2:10;4849:36:3::1;::::0;::::1;10228:21:10::0;10285:2;10265:18;;;10258:30;-1:-1:-1;;;10304:18:10;;;10297:46;10360:18;;4849:36:3::1;10044:340:10::0;4849:36:3::1;4896:15;::::0;:38:::1;::::0;-1:-1:-1;;;4896:38:3;;::::1;::::0;::::1;2172:25:10::0;;;-1:-1:-1;;;;;4896:15:3;;::::1;::::0;:33:::1;::::0;2145:18:10;;4896:38:3::1;2026:177:10::0;2074:198:4;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:4;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:4;;13249:2:10;2154:73:4::1;::::0;::::1;13231:21:10::0;13288:2;13268:18;;;13261:30;13327:34;13307:18;;;13300:62;-1:-1:-1;;;13378:18:10;;;13371:36;13424:19;;2154:73:4::1;13047:402:10::0;2154:73:4::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1273:6;;-1:-1:-1;;;;;1273:6:4;719:10:9;1422:23:4;1414:68;;;;-1:-1:-1;;;1414:68:4;;13656:2:10;1414:68:4;;;13638:21:10;;;13675:18;;;13668:30;13734:34;13714:18;;;13707:62;13786:18;;1414:68:4;13454:356:10;10457:340:6;-1:-1:-1;;;;;10558:19:6;;10550:68;;;;-1:-1:-1;;;10550:68:6;;14017:2:10;10550:68:6;;;13999:21:10;14056:2;14036:18;;;14029:30;14095:34;14075:18;;;14068:62;-1:-1:-1;;;14146:18:10;;;14139:34;14190:19;;10550:68:6;13815:400:10;10550:68:6;-1:-1:-1;;;;;10636:21:6;;10628:68;;;;-1:-1:-1;;;10628:68:6;;14422:2:10;10628:68:6;;;14404:21:10;14461:2;14441:18;;;14434:30;14500:34;14480:18;;;14473:62;-1:-1:-1;;;14551:18:10;;;14544:32;14593:19;;10628:68:6;14220:398:10;10628:68:6;-1:-1:-1;;;;;10707:18:6;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10758:32;;2172:25:10;;;10758:32:6;;2145:18:10;10758:32:6;;;;;;;10457:340;;;:::o;11078:411::-;11178:24;11205:25;11215:5;11222:7;11205:9;:25::i;:::-;11178:52;;-1:-1:-1;;11244:16:6;:37;11240:243;;11325:6;11305:16;:26;;11297:68;;;;-1:-1:-1;;;11297:68:6;;14825:2:10;11297:68:6;;;14807:21:10;14864:2;14844:18;;;14837:30;14903:31;14883:18;;;14876:59;14952:18;;11297:68:6;14623:353:10;11297:68:6;11407:51;11416:5;11423:7;11451:6;11432:16;:25;11407:8;:51::i;:::-;11168:321;11078:411;;;:::o;11554:2864:3:-;-1:-1:-1;;;;;11686:18:3;;11678:68;;;;-1:-1:-1;;;11678:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11765:16:3;;11757:64;;;;-1:-1:-1;;;11757:64:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;11853:25:3;;;;;;:19;:25;;;;;;;;11852:26;:54;;;;-1:-1:-1;;;;;;11883:23:3;;;;;;:19;:23;;;;;;;;11882:24;11852:54;:67;;;;-1:-1:-1;11911:8:3;;-1:-1:-1;;;11911:8:3;;;;11910:9;11852:67;11834:998;;;11954:14;;-1:-1:-1;;;11954:14:3;;;;11946:45;;;;-1:-1:-1;;;11946:45:3;;15993:2:10;11946:45:3;;;15975:21:10;16032:2;16012:18;;;16005:30;-1:-1:-1;;;16051:18:10;;;16044:48;16109:18;;11946:45:3;15791:342:10;11946:45:3;-1:-1:-1;;;;;12012:29:3;;;;;;:25;:29;;;;;;;;12008:593;;;12102:13;;12092:6;:23;;12062:128;;;;-1:-1:-1;;;12062:128:3;;16340:2:10;12062:128:3;;;16322:21:10;16379:2;16359:18;;;16352:30;16418:33;16398:18;;;16391:61;16469:18;;12062:128:3;16138:355:10;12062:128:3;12008:593;;;-1:-1:-1;;;;;12216:31:3;;;;;;:25;:31;;;;;;;;12212:389;;;12307:12;;12297:6;:22;;12267:126;;;;-1:-1:-1;;;12267:126:3;;16700:2:10;12267:126:3;;;16682:21:10;16739:2;16719:18;;;16712:30;16778:32;16758:18;;;16751:60;16828:18;;12267:126:3;16498:354:10;12267:126:3;12442:20;;-1:-1:-1;;;12442:20:3;;;;;:74;;-1:-1:-1;12468:20:3;;-1:-1:-1;;;12468:20:3;;;;12467:21;:48;;;;-1:-1:-1;;;;;;12492:23:3;;;;;;:19;:23;;;;;;;;12467:48;12412:173;;;;-1:-1:-1;;;12412:173:3;;17059:2:10;12412:173:3;;;17041:21:10;17098:2;17078:18;;;17071:30;17137:27;17117:18;;;17110:55;17182:18;;12412:173:3;16857:349:10;12412:173:3;-1:-1:-1;;;;;12620:28:3;;;;;;:24;:28;;;;;;;;12615:206;;12725:9;;-1:-1:-1;;;;;3519:18:6;;3493:7;3519:18;;;;;;;;;;;12699:22:3;;:6;:22;:::i;:::-;:35;;12669:136;;;;-1:-1:-1;;;12669:136:3;;17413:2:10;12669:136:3;;;17395:21:10;17452:2;17432:18;;;17425:30;17491:29;17471:18;;;17464:57;17538:18;;12669:136:3;17211:351:10;12669:136:3;12848:6;12858:1;12848:11;12844:93;;12876:28;12892:4;12898:2;12902:1;12876:15;:28::i;:::-;11554:2864;;;:::o;12844:93::-;12998:4;12949:28;3519:18:6;;;;;;;;;;;13054::3;;13030:42;;;;;;;13103:33;;-1:-1:-1;13128:8:3;;-1:-1:-1;;;13128:8:3;;;;13127:9;13103:33;:61;;;;-1:-1:-1;13153:11:3;;-1:-1:-1;;;13153:11:3;;;;13103:61;:107;;;;-1:-1:-1;;;;;;13181:29:3;;;;;;:25;:29;;;;;;;;13103:107;:150;;;;-1:-1:-1;;;;;;13228:25:3;;;;;;:19;:25;;;;;;;;13227:26;13103:150;:191;;;;-1:-1:-1;;;;;;13271:23:3;;;;;;:19;:23;;;;;;;;13270:24;13103:191;13085:405;;;13321:8;:15;;-1:-1:-1;;;;13321:15:3;-1:-1:-1;;;13321:15:3;;;13357:12;;:16;13353:93;;13394:36;13409:20;13394:14;:36::i;:::-;13462:8;:16;;-1:-1:-1;;;;13462:16:3;;;13085:405;13518:8;;-1:-1:-1;;;;;13628:25:3;;13502:12;13628:25;;;:19;:25;;;;;;13518:8;-1:-1:-1;;;13518:8:3;;;;;13517:9;;13628:25;;:52;;-1:-1:-1;;;;;;13657:23:3;;;;;;:19;:23;;;;;;;;13628:52;13624:100;;;-1:-1:-1;13707:5:3;13624:100;-1:-1:-1;;;;;13741:29:3;;;;;;:25;:29;;;;;;;;13740:30;:66;;;;-1:-1:-1;;;;;;13775:31:3;;;;;;:25;:31;;;;;;;;13774:32;13740:66;13736:100;;;-1:-1:-1;13831:5:3;13736:100;13853:7;13849:370;;;-1:-1:-1;;;;;13910:29:3;;13877:14;13910:29;;;:25;:29;;;;;;;;13906:201;;;13993:3;13977:12;;13968:6;:21;;;;:::i;:::-;13967:29;;;;:::i;:::-;13958:38;;13906:201;;;-1:-1:-1;;;;;14020:31:3;;;;;;:25;:31;;;;;;;;14016:91;;;14104:3;14089:11;;14080:6;:20;;;;:::i;:::-;14079:28;;;;:::i;:::-;14070:37;;14016:91;14133:15;14142:6;14133;:15;:::i;:::-;14124:24;;14163:44;14179:4;14193;14200:6;14163:15;:44::i;:::-;13862:357;13849:370;14229:33;14245:4;14251:2;14255:6;14229:15;:33::i;:::-;14279:15;;-1:-1:-1;;;;;14279:15:3;:26;14306:4;14312:15;14306:4;-1:-1:-1;;;;;3519:18:6;3493:7;3519:18;;;;;;;;;;;;3419:125;14312:15:3;14279:49;;-1:-1:-1;;;;;;14279:49:3;;;;;;;-1:-1:-1;;;;;6410:32:10;;;14279:49:3;;;6392:51:10;6459:18;;;6452:34;6365:18;;14279:49:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14275:65;14354:15;;-1:-1:-1;;;;;14354:15:3;:26;14381:2;14385:13;14381:2;-1:-1:-1;;;;;3519:18:6;3493:7;3519:18;;;;;;;;;;;;3419:125;14385:13:3;14354:45;;-1:-1:-1;;;;;;14354:45:3;;;;;;;-1:-1:-1;;;;;6410:32:10;;;14354:45:3;;;6392:51:10;6459:18;;;6452:34;6365:18;;14354:45:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14350:61;;;11667:2751;;;11554:2864;;;:::o;2426:187:4:-;2518:6;;;-1:-1:-1;;;;;2534:17:4;;;-1:-1:-1;;;;;;2534:17:4;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;9622:458:3:-;-1:-1:-1;;;;;9730:34:3;;;;;;:25;:34;;;;;;:43;;;:34;;;;:43;;;9708:149;;;;-1:-1:-1;;;9708:149:3;;18121:2:10;9708:149:3;;;18103:21:10;18160:2;18140:18;;;18133:30;18199:34;18179:18;;;18172:62;18270:26;18250:18;;;18243:54;18314:19;;9708:149:3;17919:420:10;9708:149:3;-1:-1:-1;;;;;9868:34:3;;;;;;:25;:34;;;;;:42;;-1:-1:-1;;9868:42:3;;;;;;;;;;;;9923:89;;9949:15;;:51;;-1:-1:-1;;;9949:51:3;;-1:-1:-1;;;;;5541:32:10;;;9949:51:3;;;5523::10;9949:15:3;5590:18:10;;;5583:50;9949:15:3;;;;:36;;5496:18:10;;9949:51:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9923:89;10029:43;;;;;;-1:-1:-1;;;;;10029:43:3;;;;;;;;9622:458;;:::o;7456:788:6:-;-1:-1:-1;;;;;7552:18:6;;7544:68;;;;-1:-1:-1;;;7544:68:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;7630:16:6;;7622:64;;;;-1:-1:-1;;;7622:64:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;7768:15:6;;7746:19;7768:15;;;;;;;;;;;7801:21;;;;7793:72;;;;-1:-1:-1;;;7793:72:6;;18546:2:10;7793:72:6;;;18528:21:10;18585:2;18565:18;;;18558:30;18624:34;18604:18;;;18597:62;-1:-1:-1;;;18675:18:10;;;18668:36;18721:19;;7793:72:6;18344:402:10;7793:72:6;-1:-1:-1;;;;;7899:15:6;;;:9;:15;;;;;;;;;;;7917:20;;;7899:38;;8114:13;;;;;;;;;;:23;;;;;;8163:26;;2172:25:10;;;8114:13:6;;8163:26;;2145:18:10;8163:26:6;;;;;;;8200:37;11554:2864:3;14426:1412;14542:12;;14519:9;:19;14485:20;;14558:1;;14510:28;;:6;:28;:::i;:::-;14509:45;;;;:::i;:::-;14508:51;;;;:::i;:::-;14485:74;;14570:32;14655:1;14639:12;;14616:9;:19;;;14607:6;:28;;;;:::i;:::-;14606:45;;;;:::i;:::-;14605:51;;;;:::i;:::-;14717:12;;14700:13;;14570:86;;-1:-1:-1;14667:20:3;;14691:22;;:6;:22;:::i;:::-;14690:39;;;;:::i;:::-;14667:62;;14742:30;14759:12;14742:16;:30::i;:::-;14810:21;14848:18;;14844:142;;14920:54;14933:24;14959:14;14920:12;:54::i;:::-;14998:30;15015:12;14998:16;:30::i;:::-;15065:21;;15174:10;;15170:171;;15228:9;;15220:42;;15202:12;;-1:-1:-1;;;;;15228:9:3;;15251:6;;15202:12;15220:42;15202:12;15220:42;15251:6;15228:9;15220:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15201:61;;;15285:7;15277:52;;;;-1:-1:-1;;;15277:52:3;;18953:2:10;15277:52:3;;;18935:21:10;;;18972:18;;;18965:30;19031:34;19011:18;;;19004:62;19083:18;;15277:52:3;18751:356:10;15277:52:3;15186:155;15170:171;15380:4;;15373:37;;-1:-1:-1;;;15373:37:3;;15404:4;15373:37;;;2842:51:10;15353:17:3;;-1:-1:-1;;;;;15380:4:3;;15373:22;;2815:18:10;;15373:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15353:57;-1:-1:-1;15353:57:3;15501:13;;15497:334;;15553:4;;15594:15;;15546:107;;-1:-1:-1;;;15546:107:3;;-1:-1:-1;;;;;15594:15:3;;;15546:107;;;6392:51:10;6459:18;;;6452:34;;;15531:12:3;;15553:4;;;;;15546:21;;6365:18:10;;15546:107:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15531:122;;15672:7;15668:152;;;15700:15;;:48;;-1:-1:-1;;;15700:48:3;;;;;2172:25:10;;;-1:-1:-1;;;;;15700:15:3;;;;:37;;2145:18:10;;15700:48:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15772:32:3;;;4014:25:10;;;4070:2;4055:18;;4048:34;;;15772:32:3;;-1:-1:-1;3987:18:10;;-1:-1:-1;15772:32:3;;;;;;;15668:152;15516:315;15497:334;14474:1364;;;;;;;;14426:1412;:::o;16292:502::-;16382:16;;;16396:1;16382:16;;;;;;;;16358:21;;16382:16;;;;;;;;;;-1:-1:-1;16382:16:3;16358:40;;16427:4;16409;16414:1;16409:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16409:23:3;;;:7;;;;;;;;;;:23;;;;16453:6;;:13;;;-1:-1:-1;;;16453:13:3;;;;:6;;;;;:11;;:13;;;;;16409:7;;16453:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16443:4;16448:1;16443:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16443:23:3;;;:7;;;;;;;;;:23;16511:6;;16479:53;;16496:4;;16511:6;16520:11;16479:8;:53::i;:::-;16571:6;;:215;;-1:-1:-1;;;16571:215:3;;-1:-1:-1;;;;;16571:6:3;;;;:57;;:215;;16643:11;;16571:6;;16713:4;;16740;;16760:15;;16571:215;;;:::i;16802:501::-;16982:6;;16950:53;;16967:4;;-1:-1:-1;;;;;16982:6:3;16991:11;16950:8;:53::i;:::-;17046:6;;:249;;-1:-1:-1;;;17046:249:3;;17109:4;17046:249;;;20958:34:10;;;21008:18;;;21001:34;;;17046:6:3;21051:18:10;;;21044:34;;;21094:18;;;21087:34;21137:19;;;21130:44;17269:15:3;21190:19:10;;;21183:35;-1:-1:-1;;;;;17046:6:3;;;;:22;;17076:9;;20892:19:10;;17046:249:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:131:10:-;-1:-1:-1;;;;;89:31:10;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:10;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:597::-;772:4;801:2;830;819:9;812:21;862:6;856:13;905:6;900:2;889:9;885:18;878:34;930:1;940:140;954:6;951:1;948:13;940:140;;;1049:14;;;1045:23;;1039:30;1015:17;;;1034:2;1011:26;1004:66;969:10;;940:140;;;1098:6;1095:1;1092:13;1089:91;;;1168:1;1163:2;1154:6;1143:9;1139:22;1135:31;1128:42;1089:91;-1:-1:-1;1241:2:10;1220:15;-1:-1:-1;;1216:29:10;1201:45;;;;1248:2;1197:54;;660:597;-1:-1:-1;;;660:597:10:o;1262:315::-;1330:6;1338;1391:2;1379:9;1370:7;1366:23;1362:32;1359:52;;;1407:1;1404;1397:12;1359:52;1446:9;1433:23;1465:31;1490:5;1465:31;:::i;:::-;1515:5;1567:2;1552:18;;;;1539:32;;-1:-1:-1;;;1262:315:10:o;1774:247::-;1833:6;1886:2;1874:9;1865:7;1861:23;1857:32;1854:52;;;1902:1;1899;1892:12;1854:52;1941:9;1928:23;1960:31;1985:5;1960:31;:::i;:::-;2010:5;1774:247;-1:-1:-1;;;1774:247:10:o;2208:456::-;2285:6;2293;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2409:9;2396:23;2428:31;2453:5;2428:31;:::i;:::-;2478:5;-1:-1:-1;2535:2:10;2520:18;;2507:32;2548:33;2507:32;2548:33;:::i;:::-;2208:456;;2600:7;;-1:-1:-1;;;2654:2:10;2639:18;;;;2626:32;;2208:456::o;3093:248::-;3161:6;3169;3222:2;3210:9;3201:7;3197:23;3193:32;3190:52;;;3238:1;3235;3228:12;3190:52;-1:-1:-1;;3261:23:10;;;3331:2;3316:18;;;3303:32;;-1:-1:-1;3093:248:10:o;4301:241::-;4357:6;4410:2;4398:9;4389:7;4385:23;4381:32;4378:52;;;4426:1;4423;4416:12;4378:52;4465:9;4452:23;4484:28;4506:5;4484:28;:::i;4547:180::-;4606:6;4659:2;4647:9;4638:7;4634:23;4630:32;4627:52;;;4675:1;4672;4665:12;4627:52;-1:-1:-1;4698:23:10;;4547:180;-1:-1:-1;4547:180:10:o;4732:388::-;4800:6;4808;4861:2;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4916:9;4903:23;4935:31;4960:5;4935:31;:::i;:::-;4985:5;-1:-1:-1;5042:2:10;5027:18;;5014:32;5055:33;5014:32;5055:33;:::i;5644:380::-;5723:1;5719:12;;;;5766;;;5787:61;;5841:4;5833:6;5829:17;5819:27;;5787:61;5894:2;5886:6;5883:14;5863:18;5860:38;5857:161;;5940:10;5935:3;5931:20;5928:1;5921:31;5975:4;5972:1;5965:15;6003:4;6000:1;5993:15;5857:161;;5644:380;;;:::o;6029:184::-;6099:6;6152:2;6140:9;6131:7;6127:23;6123:32;6120:52;;;6168:1;6165;6158:12;6120:52;-1:-1:-1;6191:16:10;;6029:184;-1:-1:-1;6029:184:10:o;6497:245::-;6564:6;6617:2;6605:9;6596:7;6592:23;6588:32;6585:52;;;6633:1;6630;6623:12;6585:52;6665:9;6659:16;6684:28;6706:5;6684:28;:::i;7980:127::-;8041:10;8036:3;8032:20;8029:1;8022:31;8072:4;8069:1;8062:15;8096:4;8093:1;8086:15;8112:128;8152:3;8183:1;8179:6;8176:1;8173:13;8170:39;;;8189:18;;:::i;:::-;-1:-1:-1;8225:9:10;;8112:128::o;9369:168::-;9409:7;9475:1;9471;9467:6;9463:14;9460:1;9457:21;9452:1;9445:9;9438:17;9434:45;9431:71;;;9482:18;;:::i;:::-;-1:-1:-1;9522:9:10;;9369:168::o;9542:497::-;9648:6;9656;9664;9672;9680;9733:3;9721:9;9712:7;9708:23;9704:33;9701:53;;;9750:1;9747;9740:12;9701:53;9782:9;9776:16;9801:31;9826:5;9801:31;:::i;:::-;9896:2;9881:18;;9875:25;9940:2;9925:18;;9919:25;9984:2;9969:18;;9963:25;10028:3;10013:19;;;10007:26;9851:5;;9875:25;;-1:-1:-1;9919:25:10;9963;-1:-1:-1;10007:26:10;;-1:-1:-1;9542:497:10;-1:-1:-1;;;9542:497:10:o;14981:401::-;15183:2;15165:21;;;15222:2;15202:18;;;15195:30;15261:34;15256:2;15241:18;;15234:62;-1:-1:-1;;;15327:2:10;15312:18;;15305:35;15372:3;15357:19;;14981:401::o;15387:399::-;15589:2;15571:21;;;15628:2;15608:18;;;15601:30;15667:34;15662:2;15647:18;;15640:62;-1:-1:-1;;;15733:2:10;15718:18;;15711:33;15776:3;15761:19;;15387:399::o;17567:217::-;17607:1;17633;17623:132;;17677:10;17672:3;17668:20;17665:1;17658:31;17712:4;17709:1;17702:15;17740:4;17737:1;17730:15;17623:132;-1:-1:-1;17769:9:10;;17567:217::o;17789:125::-;17829:4;17857:1;17854;17851:8;17848:34;;;17862:18;;:::i;:::-;-1:-1:-1;17899:9:10;;17789:125::o;19244:127::-;19305:10;19300:3;19296:20;19293:1;19286:31;19336:4;19333:1;19326:15;19360:4;19357:1;19350:15;19376:251;19446:6;19499:2;19487:9;19478:7;19474:23;19470:32;19467:52;;;19515:1;19512;19505:12;19467:52;19547:9;19541:16;19566:31;19591:5;19566:31;:::i;19632:980::-;19894:4;19942:3;19931:9;19927:19;19973:6;19962:9;19955:25;19999:2;20037:6;20032:2;20021:9;20017:18;20010:34;20080:3;20075:2;20064:9;20060:18;20053:31;20104:6;20139;20133:13;20170:6;20162;20155:22;20208:3;20197:9;20193:19;20186:26;;20247:2;20239:6;20235:15;20221:29;;20268:1;20278:195;20292:6;20289:1;20286:13;20278:195;;;20357:13;;-1:-1:-1;;;;;20353:39:10;20341:52;;20448:15;;;;20413:12;;;;20389:1;20307:9;20278:195;;;-1:-1:-1;;;;;;;20529:32:10;;;;20524:2;20509:18;;20502:60;-1:-1:-1;;;20593:3:10;20578:19;20571:35;20490:3;19632:980;-1:-1:-1;;;19632:980:10:o;21229:306::-;21317:6;21325;21333;21386:2;21374:9;21365:7;21361:23;21357:32;21354:52;;;21402:1;21399;21392:12;21354:52;21431:9;21425:16;21415:26;;21481:2;21470:9;21466:18;21460:25;21450:35;;21525:2;21514:9;21510:18;21504:25;21494:35;;21229:306;;;;;:::o

Swarm Source

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