ETH Price: $2,359.92 (+1.28%)
Gas: 1.94 Gwei

Token

Blurry Shiba (Blurry)
 

Overview

Max Total Supply

100,000,000,000 Blurry

Holders

20

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,192,904,052.19029278144414647 Blurry

Value
$0.00
0x64cb2aa6fcb7a47c7337e2206dc689c31360ffb3
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BlurryShiba

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-15
*/

/**
https://t.me/blurryshiba
https://twitter.com/blurryshiba
*/

pragma solidity ^0.8.10;
//SPDX-License-Identifier: none


interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }



    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IDividendPayingTokenOptional {

  function withdrawableDividendOf(address _owner) external view returns(uint256);

  function withdrawnDividendOf(address _owner) external view returns(uint256);

  function accumulativeDividendOf(address _owner) external view returns(uint256);
}

interface IDividendPayingToken {

  function dividendOf(address _owner) external view returns(uint256);

  function distributeDividends() external payable;

  function withdrawDividend() external;

  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}

library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));

    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }

  function div(int256 a, int256 b) internal pure returns (int256) {

    require(!(a == - 2**255 && b == -1) && (b > 0));

    return a / b;
  }

  function sub(int256 a, int256 b) internal pure returns (int256) {
    require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));

    return a - b;
  }

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

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

library SafeMathUint {
  function toInt256Safe(uint256 a) internal pure returns (int256) {
    int256 b = int256(a);
    require(b >= 0);
    return b;
  }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

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

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

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

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

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

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

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

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

library SafeMath {

    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

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

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

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

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

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

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

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

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

contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
  uint256 internal lastAmount;

  address public DividendsToken = address(0x5283D291DBCF85356A21bA090E6db59121208b44);

  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;

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

  }

  receive() external payable {
  }
  
  function updateDividendToken(address _DividendsToken) public onlyOwner {
      DividendsToken = _DividendsToken;
  }

  function distributeDividends() public override payable onlyOwner{
    require(totalSupply() > 0);

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

      totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
    }
  }

  function distributeDividends(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 withdrawDividend() public virtual override onlyOwner {
    _withdrawDividendOfUser(payable(msg.sender));
  }

  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
      emit DividendWithdrawn(user, _withdrawableDividend);
      bool success = IERC20(DividendsToken).transfer(user, _withdrawableDividend);

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

      return _withdrawableDividend;
    }

    return 0;
  }

  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }

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

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

  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

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

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

contract BlurryShiba is Context, ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    address public DividendsToken = address(0x5283D291DBCF85356A21bA090E6db59121208b44);

    bool private swapping;
	bool private trading;
    bool public burning;

   BlurryDividendTracker public dividendTracker;

	address private marketingWallet;
    address private liquidityWallet;
    address private devWallet;
    address private _devWallet;

    uint256 public swapTokensAtAmount;

    uint256 private _buyLiquidityFee;
    uint256 private _buyRewardsFee;
    uint256 private _buyMarketingFee;
    uint256 private _buyDevFee;

    uint256 private _sellRewardsFee;
    uint256 private _sellLiquidityFee;
	uint256 private _sellMarketingFee;
    uint256 private _sellDevFee;

    uint256 public _maxWallet;
    uint256 public _maxBuy;
    uint256 public _maxSell;
    uint256 private _previousMaxWallet;
    uint256 private _previousMaxSell;
    uint256 private _previousMaxBuy;
    uint256 private previousDevFee;

    uint256 public totalBuyFees;
    uint256 public totalSellFees;

	uint256 public contractTokenBalanceAmount;

    uint256 public gasForProcessing = 500000;
    uint256 private biggestBuyReward;
    uint256 private biggestBuyTimer;

    uint256 private constant DefaultTime = 1 days;

    mapping (address => bool) private _isExcludedFromFees;

    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public _isBlacklisted;

    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event UpdateDividendsToken(address indexed newAddress, address indexed oldAddress);

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event blacklist(address indexed account, bool isBlacklisted);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event Rewards(bool _enabled);
    event tradingUpdated(bool _enabled);
    event burningUpdated(bool _enabled);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);
    event MarketingWalletUpdated(address indexed newMarketingWallet, address indexed oldMarketingWallet);

    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);

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

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

    event ProcessedDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );

    constructor() ERC20 ("Blurry Shiba", "Blurry") {
        _buyRewardsFee = 2;
        _buyLiquidityFee = 2;
		_buyMarketingFee = 6;
        _buyDevFee = 0;

        _sellRewardsFee = 2;
        _sellLiquidityFee = 2;
		_sellMarketingFee = 14;
        _sellDevFee = 0;

		contractTokenBalanceAmount = 250000000 * 10**18;
        
        swapTokensAtAmount = 250000000 * (10**18);
        _maxWallet = 1500000000 * (10**18);
        _maxBuy = 1500000000 * (10**18);
        _maxSell = 1500000000 * (10**18);

        totalBuyFees = _buyRewardsFee.add(_buyLiquidityFee).add(_buyMarketingFee).add(_buyDevFee);
        totalSellFees = _sellRewardsFee.add(_sellLiquidityFee).add(_sellMarketingFee).add(_sellDevFee);

    	dividendTracker = new BlurryDividendTracker();

    	liquidityWallet = owner();
		
		marketingWallet = payable(0x9E41AD4Cd914ADBa82c8E063373b495B57955619);
        _devWallet = payable(0x6218F83a8aF288f3a0b6FF005F53d0fc0b6A71AA);

    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    	//0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 Testnet
    	//0x10ED43C718714eb63d5aA57B78B54704E256024E Mainnet
    	//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D Ropsten
    	//0xCDe540d7eAFE93aC5fE6233Bee57E1270D3E330F BakerySwap
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));

        // exclude from paying fees or having max transaction amount
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(marketingWallet, true);
        excludeFromFees(address(this), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 100000000000 * (10**18));
    }

    receive() external payable {

  	}

    function excludeFromDividends(address _toExclude) public onlyOwner {
          dividendTracker.excludeFromDividends(address(_toExclude));
      }

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

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(newAddress != address(dividendTracker), "Blurry: The dividend tracker already has that address");

        BlurryDividendTracker newDividendTracker = BlurryDividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "Blurry: The new dividend tracker must be owned by the Blurry token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateDividendToken(address newAddress) public onlyOwner {
        require(newAddress != address(DividendsToken), "Blurry: The router already has that address");
        emit UpdateDividendsToken(newAddress, address(DividendsToken));
        DividendsToken = address(newAddress);
        dividendTracker.updateDividendToken(newAddress);
    }
    
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "Blurry: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

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

        emit ExcludeFromFees(account, excluded);
    }
    
    function addToBlacklist(address account, bool blacklisted) public onlyOwner {
        require(_isBlacklisted[account] != blacklisted, "Blurry: Account is already the value of 'blacklisted'");
        _isBlacklisted[account] = blacklisted;

        emit blacklist(account, blacklisted);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "Blurry: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }
    address private _liquidityTokenAddress;
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) public onlyOwner{
        _liquidityTokenAddress=liquidityTokenAddress;
        _liquidityUnlockTime=block.timestamp+DefaultTime;
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
     uint256 private _liquidityUnlockTime;

    //Sets Liquidity Release to 20% at a time and prolongs liquidity Lock for a Week after Release.
    //Should be called once start was successful.
    bool public liquidityRelease20Percent;
    function TeamlimitLiquidityReleaseTo20Percent() public onlyOwner{
        liquidityRelease20Percent=true;
    }

    function TeamUnlockLiquidityInSeconds(uint256 secondsUntilUnlock) public onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
    }
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime);
        _liquidityUnlockTime=newUnlockTime;
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() public onlyOwner {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");

        IERC20 liquidityToken = IERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        if(liquidityRelease20Percent)
        {
            _liquidityUnlockTime=block.timestamp+DefaultTime;
            //regular liquidity release, only releases 20% at a time and locks liquidity for another week
            amount=amount*2/10;
            liquidityToken.transfer(liquidityWallet, amount);
        }
        else
        {
            //Liquidity release if something goes wrong at start
            //liquidityRelease20Percent should be called once everything is clear
            liquidityToken.transfer(liquidityWallet, amount);
        }
    }

    function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner {
        require(newLiquidityWallet != liquidityWallet, "Blurry: The liquidity wallet is already this address");
        excludeFromFees(newLiquidityWallet, true);
        emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet);
        liquidityWallet = newLiquidityWallet;
    }

    function updateMarketingWallet(address newMarketingWallet) public onlyOwner {
        require(newMarketingWallet != marketingWallet, "Blurry: The marketing wallet is already this address");
        excludeFromFees(newMarketingWallet, true);
        emit MarketingWalletUpdated(newMarketingWallet, marketingWallet);
        marketingWallet = newMarketingWallet;
    }

    function getLiquidityReleaseTimeInSeconds() public view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 500000, "Blurry: gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "Blurry: Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }
    
    function updateMinimumTokenRequirement(uint256 minimumTokenBalanceForDividends) external onlyOwner {
        dividendTracker.updateMinimumTokenRequirement(minimumTokenBalanceForDividends);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

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

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

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

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

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

	function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return dividendTracker.getAccountAtIndex(index);
    }

	function processDividendTracker(uint256 gas) external {
		(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
		emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

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

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
	
	function tradingEnabled(bool _enabled) public onlyOwner {
        trading = _enabled;
        
        emit tradingUpdated(_enabled);
    }

    function updateBiggestBuy(uint256 timerInMinutes, address payable biggestBuyWallet) public onlyOwner {
        require(biggestBuyTimer != timerInMinutes, "That is already the timer");
        require(biggestBuyWallet != devWallet, "That is already the Dev Wallet");
        biggestBuyTimer = timerInMinutes.mul(60);
        biggestBuyReward = block.timestamp.add(biggestBuyTimer);
        devWallet = payable(biggestBuyWallet);
        previousDevFee = _sellDevFee;
        _sellDevFee = 1;
    }

    function burningEnabled(bool _enabled) public onlyOwner {
        burning = _enabled;
        
        emit burningUpdated(_enabled);
    }

    function checkBiggestBuyTimer() internal {
        if(block.timestamp <= biggestBuyReward)
            return;
        else if (devWallet != _devWallet) {
            devWallet = _devWallet;
            _sellDevFee = previousDevFee;
            return;
        }
        return;
    }

    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");
        require(!_isBlacklisted[from]  && !_isBlacklisted[to]);

        if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && to != uniswapV2Pair && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) 
        {
            require(trading == true);

            require(amount <= _maxBuy, "Transfer amount exceeds the maxTxAmount.");

            uint256 contractBalanceRecepient = balanceOf(to);
            require(contractBalanceRecepient + amount <= _maxWallet, "Exceeds maximum wallet token amount.");
            
        }
            
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if(!swapping && automatedMarketMakerPairs[to] && from != address(uniswapV2Router) && from != owner() && to != owner() && !_isExcludedFromFees[to] && !_isExcludedFromFees[from])
        {
            require(trading == true);

            require(amount <= _maxSell, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

		uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
		
		if(canSwap && !swapping && !automatedMarketMakerPairs[from] && from != liquidityWallet && to != liquidityWallet && from != marketingWallet && to != marketingWallet && !_isExcludedFromFees[to] && !_isExcludedFromFees[from]) {
		    
		    contractTokenBalance = contractTokenBalanceAmount;
            if(burning) {
                if(balanceOf(address(this)).sub(contractTokenBalanceAmount) > contractTokenBalanceAmount) {
                    uint256 burningAmount = contractTokenBalanceAmount;
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                } else {
                    uint256 burningAmount = balanceOf(address(this)).sub(contractTokenBalanceAmount);
                    super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);

                    emit Transfer(address(this), 0x000000000000000000000000000000000000dEaD, burningAmount);
                }
            }
		    uint256 swapTokens;
			uint256 swapAmount = _sellMarketingFee.add(_sellRewardsFee).add(_sellLiquidityFee).add(_sellDevFee);
			uint256 liquidityAmount = contractTokenBalance.mul(_sellLiquidityFee).div(swapAmount);
			uint256 half = liquidityAmount.div(2);
			uint256 otherHalf = liquidityAmount.sub(half);
            
            swapping = true;
            
            if (_sellMarketingFee > 0) {

            swapTokens = contractTokenBalance.sub(half);
            swapTokensForEth(swapTokens);
            uint256 marketingAmount = address(this).balance.mul(_sellMarketingFee).div(swapAmount);
            transferToWallet(payable(marketingWallet), marketingAmount);

            emit Transfer(address(this), marketingWallet, address(this).balance.mul(_sellMarketingFee).div(swapAmount));
            }

            if (_sellDevFee > 0) {

            checkBiggestBuyTimer();
            uint256 devAmount = address(this).balance.mul(_sellDevFee).div(swapAmount);
            transferToWallet(payable(devWallet), devAmount);

            emit Transfer(address(this), devWallet, devAmount);
            }

			if (_sellLiquidityFee > 0) {
			    
		    uint256 newBalance = address(this).balance.mul(_sellLiquidityFee).div(swapAmount);
			
            // add liquidity to uniswap
             addLiquidity(half, newBalance);

             emit SwapAndLiquify(otherHalf, newBalance, half);
            }
			
			if (_sellRewardsFee > 0) {
			
			uint256 sellTokens = contractTokenBalanceAmount.mul(_sellRewardsFee).div(swapAmount);
            swapAndSendDividends(sellTokens);
			}
			
            swapping = false;
        }

        bool takeFee = !swapping;

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

        if(takeFee) {
            uint256 BuyFees = amount.mul(totalBuyFees).div(100);
            uint256 SellFees = amount.mul(totalSellFees).div(100);

            // if sell
            if(to == uniswapV2Pair) {
                amount = amount.sub(SellFees);
                super._transfer(from, address(this), SellFees);
                super._transfer(from, to, amount);

            }

            // if buy or wallet to wallet transfer
            else {
                amount = amount.sub(BuyFees);
                super._transfer(from, address(this), BuyFees);
                super._transfer(from, to, amount);
            }

        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            super._transfer(from, to, amount);

        }

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

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {}
        }
    }
    function swapTokensForEth(uint256 tokenAmount) private {

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

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

    function swapETHForRewards(address recipient) private {

        // generate the uniswap pair path of weth -> Rewards
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = DividendsToken;

        _approve(address(this), address(uniswapV2Router), address(this).balance);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: address(this).balance} (
            0,
            path,
            recipient,
            block.timestamp.add(300)
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {

        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function swapAndSendDividends(uint256 tokens) private {
        swapETHForRewards(address(this));
        uint256 dividends = IERC20(DividendsToken).balanceOf(address(this));
        bool success = IERC20(DividendsToken).transfer(address(dividendTracker), dividends);

        if (success) {
            emit SendDividends(tokens, dividends);
        }
    }

    function addLP() external onlyOwner() {
        updateBuyFees(0,0,0,0);
        updateSellFees(0,0,0,0);

		trading = false;

        updateMaxWallet(100000000000);
        updateMaxBuySell((100000000000), (100000000000));
    }
    
	function letsGoLive() external onlyOwner() {
        updateBuyFees(2,2,6,0);
        updateSellFees(2,2,14,0);

        updateMaxWallet(3000000000);
        updateMaxBuySell(3000000000, 3000000000);

		trading = true;
        burning = false;
    }

    function letsGetStarted() external onlyOwner() {
        updateBuyFees(30,30,30,9);
        updateSellFees(5,8,5,2);

        updateMaxWallet(1000000000);
        updateMaxBuySell(1000000000, 1000000000);

		trading = true;
        burning = false;
    }
    
    function updateBuyFees(uint8 newBuyLiquidityFee, uint8 newBuyMarketingFee, uint8 newBuyRewardsFee, uint8 newBuyDevFee) public onlyOwner {
        _buyLiquidityFee = newBuyLiquidityFee;
        _buyMarketingFee = newBuyMarketingFee;
        _buyRewardsFee = newBuyRewardsFee;
        _buyDevFee = newBuyDevFee;
        
        totalFees();
    }

    function updateSellFees(uint8 newSellLiquidityFee, uint8 newSellMarketingFee, uint8 newSellRewardsFee, uint8 newSellDevFee) public onlyOwner {
        _sellLiquidityFee = newSellLiquidityFee;
        _sellMarketingFee = newSellMarketingFee;
        _sellRewardsFee = newSellRewardsFee;
        _sellDevFee = newSellDevFee;
        
        totalFees();
    }

    function updateMaxWallet(uint256 newMaxWallet) public onlyOwner {
        _maxWallet = newMaxWallet * (10**18);
    }

    function updateMaxBuySell(uint256 newMaxBuy, uint256 newMaxSell) public onlyOwner {
        _maxBuy = newMaxBuy * (10**18);
        _maxSell = newMaxSell * (10**18);
    }
    
    function totalFees() private {
        totalBuyFees = _buyRewardsFee.add(_buyLiquidityFee).add(_buyMarketingFee).add(_buyDevFee);
        totalSellFees = _sellRewardsFee.add(_sellLiquidityFee).add(_sellMarketingFee).add(_sellDevFee);
    }
    
    function withdrawRemainingToken(address account) public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), account, balance);
    }
    
    function withdrawRemainingBEP20Token(address bep20, address account) public onlyOwner {
        ERC20 BEP20 = ERC20(bep20);
        uint256 balance = BEP20.balanceOf(address(this));
        BEP20.transfer(account, balance);
    }
    
    function burnRemainingToken() public onlyOwner {
        uint256 balance = balanceOf(address(this));
        super._transfer(address(this), 0x000000000000000000000000000000000000dEaD, balance);
    }
	
	function transferToWallet(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }
}

contract BlurryDividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;
    mapping (address => bool) private isAuth;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event MinimumTokenRequirementUpdated(uint256 indexed newValue, uint256 indexed oldValue);

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

    constructor() DividendPayingToken("Blurry_Dividend_Tracker", "Blurry_Dividend_Tracker") {
    	claimWait = 1800;
        minimumTokenBalanceForDividends = 1 * (10**18);
        isAuth[owner()] = true;
    }

    function addToAuth(address newAuth) public {
        require(isAuth[msg.sender]);
        require(isAuth[newAuth] != true);

        isAuth[newAuth] = true;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(isAuth[msg.sender], "You do not have perrmission to transfer");

        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function withdrawDividend() public pure override {
        require(false, "Blurry_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Blurry contract.");
    }

    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account]);
    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 0 && newClaimWait <= 86400, "Blurry_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Blurry_Dividend_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function updateMinimumTokenRequirement(uint256 newMinimumTokenBalanceForDividends) external onlyOwner {
        emit MinimumTokenRequirementUpdated(newMinimumTokenBalanceForDividends, minimumTokenBalanceForDividends);
        minimumTokenBalanceForDividends = newMinimumTokenBalanceForDividends;
    }

    function getLastProcessedIndex() external view returns(uint256) {
    	return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
    	if(lastClaimTime > block.timestamp)  {
    		return false;
    	}

    	return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

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

    	if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
    		tokenHoldersMap.set(account, newBalance);
    	}
    	else {
            _setBalance(account, 0);
    		tokenHoldersMap.remove(account);
    	}

    	processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        address canClaim = tokenHoldersMap.keys[lastProcessedIndex++];

        if(lastProcessedIndex++ >= tokenHoldersMap.keys.length) {
            canClaim = tokenHoldersMap.keys[0];
        }
        if(canAutoClaim(lastClaimTimes[canClaim])) {
            uint256 dividends = ERC20(DividendsToken).balanceOf(address(this));
            distributeDividends(dividends);
        }

    	if(numberOfTokenHolders == 0) {
    		return (0, 0, lastProcessedIndex);
    	}

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

    	while(gasUsed < gas && iterations < numberOfTokenHolders) {
    		_lastProcessedIndex++;

    		if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
    			_lastProcessedIndex = 0;
    		}

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

    		if(canAutoClaim(lastClaimTimes[account])) {
                if(processAccount(payable(account), true)) {
                    claims++;
                }
    		}

    		iterations++;

    		uint256 newGasLeft = gasleft();

    		if(gasLeft > newGasLeft) {
    			gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
    		}

    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

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

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

    	return false;
    }
      
    function withdrawRemainingBEP20Token(address token, address account) public {
        require(isAuth[msg.sender]);
        IERC20(token).transfer(address(account), IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","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":"bool","name":"_enabled","type":"bool"}],"name":"Rewards","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendsToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"blacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"tradingUpdated","type":"event"},{"inputs":[],"name":"DividendsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamUnlockLiquidityInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamlimitLiquidityReleaseTo20Percent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSell","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":"addLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"addToBlacklist","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":"burnRemainingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burning","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"burningEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractTokenBalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BlurryDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toExclude","type":"address"}],"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":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"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":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"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":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"letsGetStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsGoLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityRelease20Percent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","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":"totalBuyFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellFees","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":"bool","name":"_enabled","type":"bool"}],"name":"tradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timerInMinutes","type":"uint256"},{"internalType":"address payable","name":"biggestBuyWallet","type":"address"}],"name":"updateBiggestBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBuyLiquidityFee","type":"uint8"},{"internalType":"uint8","name":"newBuyMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newBuyRewardsFee","type":"uint8"},{"internalType":"uint8","name":"newBuyDevFee","type":"uint8"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxBuy","type":"uint256"},{"internalType":"uint256","name":"newMaxSell","type":"uint256"}],"name":"updateMaxBuySell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minimumTokenBalanceForDividends","type":"uint256"}],"name":"updateMinimumTokenRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSellLiquidityFee","type":"uint8"},{"internalType":"uint8","name":"newSellMarketingFee","type":"uint8"},{"internalType":"uint8","name":"newSellRewardsFee","type":"uint8"},{"internalType":"uint8","name":"newSellDevFee","type":"uint8"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateSwapAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bep20","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingBEP20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawRemainingToken","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"}]

60a0604052600780546001600160a01b031916735283d291dbcf85356a21ba090e6db59121208b441790556207a1206020553480156200003e57600080fd5b50604080518082018252600c81526b426c7572727920536869626160a01b602080830191825283518085019094526006845265426c7572727960d01b908401528151919291620000919160039162000a37565b508051620000a790600490602084019062000a37565b50506005805460ff19166012179055506000620000c13390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506002600f819055600e81815560066010819055600060118190556012849055601384905560149290925560158290556acecb8f27f4200f3a000000601f819055600d556b04d8c55aefb8c05b5c00000060168190556017819055601855620001a8926200019491908290806200061b602090811b62002bc717901c565b6200061b60201b62002bc71790919060201c565b601d81905550620001da60155462000194601454620001946013546012546200061b60201b62002bc71790919060201c565b601e55604051620001eb9062000ac6565b604051809103906000f08015801562000208573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03928316179055600554610100900416600a80546001600160a01b03929092166001600160a01b0319928316179055600980548216739e41ad4cd914adba82c8e063373b495b57955619179055600c8054909116736218f83a8af288f3a0b6ff005f53d0fc0b6a71aa1790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a01559160048083019260209291908290030181865afa158015620002e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000306919062000aeb565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a919062000aeb565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ee919062000aeb565b600680546001600160a01b0319166001600160a01b0385811691909117909155811660805290506200042281600162000689565b60085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200046957600080fd5b505af11580156200047e573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004c857600080fd5b505af1158015620004dd573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200052957600080fd5b505af11580156200053e573d6000803e3d6000fd5b505060085460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200058a57600080fd5b505af11580156200059f573d6000803e3d6000fd5b5050600a54620005bd92506001600160a01b031690506001620007ee565b600954620005d6906001600160a01b03166001620007ee565b620005e3306001620007ee565b62000613620005ff60055461010090046001600160a01b031690565b6c01431e0fae6d7217caa00000006200093b565b505062000b7a565b6000806200062a838562000b16565b905083811015620006825760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b9392505050565b6001600160a01b03821660009081526024602052604090205460ff161515811515141562000722576040805162461bcd60e51b81526020600482015260248101919091527f426c757272793a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c7565606482015260840162000679565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155620007b25760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200079857600080fd5b505af1158015620007ad573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620008505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000679565b6001600160a01b03821660009081526023602052604090205460ff1615158115151415620008dc5760405162461bcd60e51b815260206004820152603260248201527f426c757272793a204163636f756e7420697320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b606482015260840162000679565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620009935760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000679565b620009af816002546200061b60201b62002bc71790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620009e291839062002bc76200061b821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b82805462000a459062000b3d565b90600052602060002090601f01602090048101928262000a69576000855562000ab4565b82601f1062000a8457805160ff191683800117855562000ab4565b8280016001018555821562000ab4579182015b8281111562000ab457825182559160200191906001019062000a97565b5062000ac292915062000ad4565b5090565b61287f806200550883390190565b5b8082111562000ac2576000815560010162000ad5565b60006020828403121562000afe57600080fd5b81516001600160a01b03811681146200068257600080fd5b6000821982111562000b3857634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000b5257607f821691505b6020821081141562000b7457634e487b7160e01b600052602260045260246000fd5b50919050565b60805161495d62000bab600039600081816106fc01528181611f6401528181612e5301526135f0015261495d6000f3fe60806040526004361061042a5760003560e01c806388bdd9be11610229578063b9e937001161012e578063e1ccbba6116100b6578063f27fd2541161007a578063f27fd25414610cc7578063f298f42c14610ce7578063f2fde38b14610d07578063f657099014610d27578063fe575a8714610d4757600080fd5b8063e1ccbba614610c3c578063e2f4560514610c5c578063e37ba8f914610c72578063e7841ec014610c92578063e98030c714610ca757600080fd5b8063c3a3c032116100fd578063c3a3c03214610b96578063c492f04614610bab578063d0a3981414610bcb578063d63607d814610be1578063dd62ed3e14610bf657600080fd5b8063b9e9370014610b2b578063bc37e1a314610b41578063c024666814610b56578063c23be47f14610b7657600080fd5b8063a457c2d7116101b1578063aacebbe311610180578063aacebbe314610a40578063ab3b554514610a60578063ad56c13c14610a80578063b1ff3b5c14610ae5578063b62496f514610afb57600080fd5b8063a457c2d7146109ca578063a8b9d240146109ea578063a9059cbb14610a0a578063a9dec43614610a2a57600080fd5b80639693ec09116101f85780639693ec091461094a57806396c74c641461096a5780639a7a23d61461097f5780639c1b8af51461099f578063a26579ad146109b557600080fd5b806388bdd9be146108d25780638da5cb5b146108f257806395b0a1e01461091557806395d89b411461093557600080fd5b80633320f5851161032f57806364b0f653116102b7578063700bb19111610286578063700bb1911461084757806370a0823114610867578063715018a61461088757806382247ec01461089c578063871c128d146108b257600080fd5b806364b0f653146107d257806365b8dbc0146107e75780636843cd84146108075780636ec0227a1461082757600080fd5b806349bdf873116102fe57806349bdf8731461071e5780634c12b33f146107385780634cdaf0ae146107595780634fbee19314610779578063553ad0dc146107b257600080fd5b80633320f5851461069557806339509351146106b55780633c7a309b146106d557806349bd5a5e146106ea57600080fd5b806323b872dd116103b25780632c889d18116103815780632c889d18146105fe5780632de3f9561461061e57806330bb4cff1461063e578063313ce5671461065357806331e79db01461067557600080fd5b806323b872dd14610589578063270924c7146105a9578063296d3de0146105be5780632c1f5216146105de57600080fd5b8063095ea7b3116103f9578063095ea7b3146104bc5780631694505e146104ec57806318160ddd146105245780631c499ab0146105395780631cdd3be31461055957600080fd5b8063021954661461043657806306fdde031461044d5780630773d31d146104785780630920dacb1461049c57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610d80565b005b34801561045957600080fd5b50610462610e09565b60405161046f91906141cb565b60405180910390f35b34801561048457600080fd5b5061048e60185481565b60405190815260200161046f565b3480156104a857600080fd5b5061044b6104b7366004614235565b610e9b565b3480156104c857600080fd5b506104dc6104d736600461426e565b610fb6565b604051901515815260200161046f565b3480156104f857600080fd5b5060065461050c906001600160a01b031681565b6040516001600160a01b03909116815260200161046f565b34801561053057600080fd5b5060025461048e565b34801561054557600080fd5b5061044b61055436600461429a565b610fcd565b34801561056557600080fd5b506104dc6105743660046142b3565b60256020526000908152604090205460ff1681565b34801561059557600080fd5b506104dc6105a43660046142d0565b611015565b3480156105b557600080fd5b5061044b61107e565b3480156105ca57600080fd5b5061044b6105d9366004614311565b6110e3565b3480156105ea57600080fd5b5060085461050c906001600160a01b031681565b34801561060a57600080fd5b5061044b61061936600461429a565b611141565b34801561062a57600080fd5b5061044b610639366004614341565b611186565b34801561064a57600080fd5b5061048e61120e565b34801561065f57600080fd5b5060055460405160ff909116815260200161046f565b34801561068157600080fd5b5061044b6106903660046142b3565b611281565b3480156106a157600080fd5b5061044b6106b0366004614374565b61130d565b3480156106c157600080fd5b506104dc6106d036600461426e565b611364565b3480156106e157600080fd5b5061044b61139a565b3480156106f657600080fd5b5061050c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072a57600080fd5b506028546104dc9060ff1681565b34801561074457600080fd5b506007546104dc90600160b01b900460ff1681565b34801561076557600080fd5b5061044b6107743660046142b3565b611571565b34801561078557600080fd5b506104dc6107943660046142b3565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107be57600080fd5b5061044b6107cd366004614341565b6115cf565b3480156107de57600080fd5b5061048e61164c565b3480156107f357600080fd5b5061044b6108023660046142b3565b611696565b34801561081357600080fd5b5061048e6108223660046142b3565b611751565b34801561083357600080fd5b5061044b610842366004614374565b6117c1565b34801561085357600080fd5b5061044b61086236600461429a565b611812565b34801561087357600080fd5b5061048e6108823660046142b3565b6118e4565b34801561089357600080fd5b5061044b6118ff565b3480156108a857600080fd5b5061048e60165481565b3480156108be57600080fd5b5061044b6108cd36600461429a565b61197f565b3480156108de57600080fd5b5061044b6108ed3660046142b3565b611ad9565b3480156108fe57600080fd5b5060055461010090046001600160a01b031661050c565b34801561092157600080fd5b5061044b6109303660046142b3565b611df7565b34801561094157600080fd5b50610462611ed9565b34801561095657600080fd5b5060075461050c906001600160a01b031681565b34801561097657600080fd5b5061044b611ee8565b34801561098b57600080fd5b5061044b61099a3660046143c8565b611f32565b3480156109ab57600080fd5b5061048e60205481565b3480156109c157600080fd5b5061048e61202a565b3480156109d657600080fd5b506104dc6109e536600461426e565b612074565b3480156109f657600080fd5b5061048e610a053660046142b3565b6120c3565b348015610a1657600080fd5b506104dc610a2536600461426e565b6120f6565b348015610a3657600080fd5b5061048e60175481565b348015610a4c57600080fd5b5061044b610a5b3660046142b3565b612103565b348015610a6c57600080fd5b5061044b610a7b36600461429a565b612216565b348015610a8c57600080fd5b50610aa0610a9b3660046142b3565b612273565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046f565b348015610af157600080fd5b5061048e601f5481565b348015610b0757600080fd5b506104dc610b163660046142b3565b60246020526000908152604090205460ff1681565b348015610b3757600080fd5b5061048e601d5481565b348015610b4d57600080fd5b5061044b61230e565b348015610b6257600080fd5b5061044b610b713660046143c8565b612386565b348015610b8257600080fd5b5061044b610b913660046142b3565b6124a0565b348015610ba257600080fd5b5061048e6124e8565b348015610bb757600080fd5b5061044b610bc63660046143f6565b612508565b348015610bd757600080fd5b5061048e601e5481565b348015610bed57600080fd5b5061044b6125ea565b348015610c0257600080fd5b5061048e610c11366004614235565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c4857600080fd5b5061044b610c5736600461429a565b612629565b348015610c6857600080fd5b5061048e600d5481565b348015610c7e57600080fd5b5061044b610c8d3660046142b3565b61268a565b348015610c9e57600080fd5b5061048e61279d565b348015610cb357600080fd5b5061044b610cc236600461429a565b6127e7565b348015610cd357600080fd5b50610aa0610ce236600461429a565b612848565b348015610cf357600080fd5b5061044b610d023660046143c8565b61288a565b348015610d1357600080fd5b5061044b610d223660046142b3565b61299f565b348015610d3357600080fd5b5061044b610d4236600461447c565b612a9b565b348015610d5357600080fd5b506104dc610d623660046142b3565b6001600160a01b031660009081526025602052604090205460ff1690565b6005546001600160a01b03610100909104163314610db95760405162461bcd60e51b8152600401610db0906144a1565b60405180910390fd5b610dc8601e80601e60096117c1565b610dd8600560086005600261130d565b610de5633b9aca00610fcd565b610df3633b9aca00806110e3565b6007805461ffff60a81b1916600160a81b179055565b606060038054610e18906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e44906144d6565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b6005546001600160a01b03610100909104163314610ecb5760405162461bcd60e51b8152600401610db0906144a1565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f389190614511565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf919061452a565b5050505050565b6000610fc3338484612c2d565b5060015b92915050565b6005546001600160a01b03610100909104163314610ffd5760405162461bcd60e51b8152600401610db0906144a1565b61100f81670de0b6b3a764000061455d565b60165550565b6000611022848484612d52565b611074843361106f856040518060600160405280602881526020016148bb602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061388b565b612c2d565b5060019392505050565b6005546001600160a01b036101009091041633146110ae5760405162461bcd60e51b8152600401610db0906144a1565b6110bd600280600660006117c1565b6110cc600280600e600061130d565b6110d963b2d05e00610fcd565b610df363b2d05e00805b6005546001600160a01b036101009091041633146111135760405162461bcd60e51b8152600401610db0906144a1565b61112582670de0b6b3a764000061455d565b60175561113a81670de0b6b3a764000061455d565b6018555050565b6005546001600160a01b036101009091041633146111715760405162461bcd60e51b8152600401610db0906144a1565b61118361117e428361457c565b6138c2565b50565b6005546001600160a01b036101009091041633146111b65760405162461bcd60e51b8152600401610db0906144a1565b60078054821515600160a81b0260ff60a81b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061120390831515815260200190565b60405180910390a150565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127c9190614511565b905090565b6005546001600160a01b036101009091041633146112b15760405162461bcd60e51b8152600401610db0906144a1565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112f957600080fd5b505af1158015610faf573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461133d5760405162461bcd60e51b8152600401610db0906144a1565b60ff808516601355838116601455828116601255811660155561135e6138d5565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc391859061106f9086612bc7565b6005546001600160a01b036101009091041633146113ca5760405162461bcd60e51b8152600401610db0906144a1565b60275442101561140f5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610db0565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561145c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114809190614511565b60285490915060ff16156115345761149b620151804261457c565b602755600a6114ab82600261455d565b6114b59190614594565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f919061452a565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016114ec565b5050565b6005546001600160a01b036101009091041633146115a15760405162461bcd60e51b8152600401610db0906144a1565b602680546001600160a01b0319166001600160a01b0383161790556115c9620151804261457c565b60275550565b6005546001600160a01b036101009091041633146115ff5760405162461bcd60e51b8152600401610db0906144a1565b60078054821515600160b01b0260ff60b01b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb09061120390831515815260200190565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146116c65760405162461bcd60e51b8152600401610db0906144a1565b6006546001600160a01b03828116911614156116f45760405162461bcd60e51b8152600401610db0906145b6565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561179d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614511565b6005546001600160a01b036101009091041633146117f15760405162461bcd60e51b8152600401610db0906144a1565b60ff808516600e55838116601055828116600f55811660115561135e6138d5565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118899190614601565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461192f5760405162461bcd60e51b8152600401610db0906144a1565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146119af5760405162461bcd60e51b8152600401610db0906144a1565b62030d4081101580156119c557506207a1208111155b611a375760405162461bcd60e51b815260206004820152603c60248201527f426c757272793a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c303030000000006064820152608401610db0565b602054811415611aa65760405162461bcd60e51b815260206004820152603460248201527f426c757272793a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b6064820152608401610db0565b60205460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602055565b6005546001600160a01b03610100909104163314611b095760405162461bcd60e51b8152600401610db0906144a1565b6008546001600160a01b0382811691161415611b855760405162461bcd60e51b815260206004820152603560248201527f426c757272793a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b6064820152608401610db0565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf6919061462f565b6001600160a01b031614611c865760405162461bcd60e51b815260206004820152604b60248201527f426c757272793a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e65642062792074686520426c7572727920746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610db0565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611cc857600080fd5b505af1158015611cdc573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03610100909104163314611e275760405162461bcd60e51b8152600401610db0906144a1565b6007546001600160a01b0382811691161415611e555760405162461bcd60e51b8152600401610db0906145b6565b6007546040516001600160a01b03918216918316907f523400a476dc1f49f3cc8e7dc4ea8fbd97c0b7c17be259fbc3a8ff8f67a71fd290600090a3600780546001600160a01b0319166001600160a01b038381169182179092556008546040516304ad850f60e51b81526004810192909252909116906395b0a1e0906024016112df565b606060048054610e18906144d6565b6005546001600160a01b03610100909104163314611f185760405162461bcd60e51b8152600401610db0906144a1565b6000611f23306118e4565b90506111833061dead83613926565b6005546001600160a01b03610100909104163314611f625760405162461bcd60e51b8152600401610db0906144a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156120205760405162461bcd60e51b815260206004820152604d60248201527f426c757272793a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a401610db0565b61156d8282613a1d565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6000610fc3338461106f85604051806060016040528060258152602001614903602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061388b565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611780565b6000610fc3338484612d52565b6005546001600160a01b036101009091041633146121335760405162461bcd60e51b8152600401610db0906144a1565b6009546001600160a01b03828116911614156121ae5760405162461bcd60e51b815260206004820152603460248201527f426c757272793a20546865206d61726b6574696e672077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b6064820152608401610db0565b6121b9816001612386565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122465760405162461bcd60e51b8152600401610db0906144a1565b61225881670de0b6b3a764000061455d565b601f5561226d81670de0b6b3a764000061455d565b600d5550565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156122cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f3919061464c565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461233e5760405162461bcd60e51b8152600401610db0906144a1565b61234c6000806000806117c1565b61235a60008060008061130d565b6007805460ff60a81b1916905561237564174876e800610fcd565b61238464174876e800806110e3565b565b6005546001600160a01b036101009091041633146123b65760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b03821660009081526023602052604090205460ff16151581151514156124405760405162461bcd60e51b815260206004820152603260248201527f426c757272793a204163636f756e7420697320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b6064820152608401610db0565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b036101009091041633146124d05760405162461bcd60e51b8152600401610db0906144a1565b60006124db306118e4565b905061156d308383613926565b6000602754421015612502574260275461127c91906146b6565b50600090565b6005546001600160a01b036101009091041633146125385760405162461bcd60e51b8152600401610db0906144a1565b60005b828110156125a957816023600086868581811061255a5761255a6146cd565b905060200201602081019061256f91906142b3565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806125a1816146e3565b91505061253b565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516125dd939291906146fe565b60405180910390a1505050565b6005546001600160a01b0361010090910416331461261a5760405162461bcd60e51b8152600401610db0906144a1565b6028805460ff19166001179055565b6005546001600160a01b036101009091041633146126595760405162461bcd60e51b8152600401610db0906144a1565b6008546040516370e65dd360e11b8152600481018390526001600160a01b039091169063e1ccbba6906024016112df565b6005546001600160a01b036101009091041633146126ba5760405162461bcd60e51b8152600401610db0906144a1565b600a546001600160a01b03828116911614156127355760405162461bcd60e51b815260206004820152603460248201527f426c757272793a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b6064820152608401610db0565b612740816001612386565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146128175760405162461bcd60e51b8152600401610db0906144a1565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016112df565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016122b1565b6005546001600160a01b036101009091041633146128ba5760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156129475760405162461bcd60e51b815260206004820152603560248201527f426c757272793a204163636f756e7420697320616c7265616479207468652076604482015274616c7565206f662027626c61636b6c69737465642760581b6064820152608401610db0565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c9101612494565b6005546001600160a01b036101009091041633146129cf5760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b038116612a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db0565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314612acb5760405162461bcd60e51b8152600401610db0906144a1565b816022541415612b1d5760405162461bcd60e51b815260206004820152601960248201527f5468617420697320616c7265616479207468652074696d6572000000000000006044820152606401610db0565b600b546001600160a01b0382811691161415612b7b5760405162461bcd60e51b815260206004820152601e60248201527f5468617420697320616c726561647920746865204465762057616c6c657400006044820152606401610db0565b612b8682603c613b7d565b6022819055612b96904290612bc7565b602155600b80546001600160a01b0319166001600160a01b03929092169190911790555060158054601c5560019055565b600080612bd4838561457c565b905083811015612c265760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610db0565b9392505050565b6001600160a01b038316612c8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610db0565b6001600160a01b038216612cf05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610db0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612d785760405162461bcd60e51b8152600401610db090614757565b6001600160a01b038216612d9e5760405162461bcd60e51b8152600401610db09061479c565b6001600160a01b03831660009081526025602052604090205460ff16158015612de057506001600160a01b03821660009081526025602052604090205460ff16155b612de957600080fd5b6005546001600160a01b038481166101009092041614801590612e1f57506005546001600160a01b038381166101009092041614155b8015612e3357506001600160a01b03821615155b8015612e4a57506001600160a01b03821661dead14155b8015612e8857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015612ead57506001600160a01b03821660009081526023602052604090205460ff16155b8015612ed257506001600160a01b03831660009081526023602052604090205460ff16155b15612fcc57600754600160a81b900460ff161515600114612ef257600080fd5b601754811115612f555760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610db0565b6000612f60836118e4565b601654909150612f70838361457c565b1115612fca5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610db0565b505b80612fdd5761152f83836000613926565b600754600160a01b900460ff1615801561300f57506001600160a01b03821660009081526024602052604090205460ff165b801561302957506006546001600160a01b03848116911614155b801561304857506005546001600160a01b038481166101009092041614155b801561306757506005546001600160a01b038381166101009092041614155b801561308c57506001600160a01b03821660009081526023602052604090205460ff16155b80156130b157506001600160a01b03831660009081526023602052604090205460ff16155b1561314957600754600160a81b900460ff1615156001146130d157600080fd5b6018548111156131495760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610db0565b6000613154306118e4565b600d54909150811080159081906131755750600754600160a01b900460ff16155b801561319a57506001600160a01b03851660009081526024602052604090205460ff16155b80156131b45750600a546001600160a01b03868116911614155b80156131ce5750600a546001600160a01b03858116911614155b80156131e857506009546001600160a01b03868116911614155b801561320257506009546001600160a01b03858116911614155b801561322757506001600160a01b03841660009081526023602052604090205460ff16155b801561324c57506001600160a01b03851660009081526023602052604090205460ff16155b1561355557601f54600754909250600160b01b900460ff161561330b57601f5461327f81613279306118e4565b90613bfc565b11156132c257601f546132953061dead83613926565b60405181815261dead9030906000805160206148e38339815191529060200160405180910390a35061330b565b60006132d3601f54613279306118e4565b90506132e23061dead83613926565b60405181815261dead9030906000805160206148e38339815191529060200160405180910390a3505b600080613337601554613331601354613331601254601454612bc790919063ffffffff16565b90612bc7565b9050600061335a8261335460135488613b7d90919063ffffffff16565b90613c58565b90506000613369826002613c58565b905060006133778383613bfc565b6007805460ff60a01b1916600160a01b179055601454909150156134265761339f8783613bfc565b94506133aa85613cb3565b60006133c58561335460145447613b7d90919063ffffffff16565b6009549091506133de906001600160a01b031682613e05565b6009546014546001600160a01b039091169030906000805160206148e383398151915290613413908990613354904790613b7d565b60405190815260200160405180910390a3505b6015541561349e57613436613e3b565b60006134518561335460155447613b7d90919063ffffffff16565b600b5490915061346a906001600160a01b031682613e05565b600b546040518281526001600160a01b039091169030906000805160206148e38339815191529060200160405180910390a3505b601354156135105760006134c18561335460135447613b7d90919063ffffffff16565b90506134cd8382613e88565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b6012541561354257600061353585613354601254601f54613b7d90919063ffffffff16565b905061354081613f32565b505b50506007805460ff60a01b191690555050505b6007546001600160a01b03861660009081526023602052604090205460ff600160a01b9092048216159116806135a357506001600160a01b03851660009081526023602052604090205460ff165b156135ac575060005b80156136745760006135ce6064613354601d5488613b7d90919063ffffffff16565b905060006135ec6064613354601e5489613b7d90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316141561364f576136328682613bfc565b955061363f883083613926565b61364a888888613926565b613671565b6136598683613bfc565b9550613666883084613926565b613671888888613926565b50505b6001600160a01b03861660009081526023602052604090205460ff16806136b357506001600160a01b03851660009081526023602052604090205460ff165b156136c3576136c3868686613926565b6008546001600160a01b031663e30443bc876136de816118e4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561372457600080fd5b505af1925050508015613735575060015b506008546001600160a01b031663e30443bc86613751816118e4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561379757600080fd5b505af19250505080156137a8575060015b50600754600160a01b900460ff16613883576020546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613827575060408051601f3d908101601f1916820190925261382491810190614601565b60015b61383057613881565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600081848411156138af5760405162461bcd60e51b8152600401610db091906141cb565b506138ba83856146b6565b949350505050565b60275481116138d057600080fd5b602755565b6138f8601154613331601054613331600e54600f54612bc790919063ffffffff16565b601d81905550613921601554613331601454613331601354601254612bc790919063ffffffff16565b601e55565b6001600160a01b03831661394c5760405162461bcd60e51b8152600401610db090614757565b6001600160a01b0382166139725760405162461bcd60e51b8152600401610db09061479c565b6139af81604051806060016040528060268152602001614895602691396001600160a01b038616600090815260208190526040902054919061388b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546139de9082612bc7565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206148e38339815191529101612d45565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415613ab4576040805162461bcd60e51b81526020600482015260248101919091527f426c757272793a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c75656064820152608401610db0565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155613b415760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613b2857600080fd5b505af1158015613b3c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600082613b8c57506000610fc7565b6000613b98838561455d565b905082613ba58583614594565b14612c265760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610db0565b600082821115613c4e5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610db0565b612c2682846146b6565b6000808211613ca95760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610db0565b612c268284614594565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613ce857613ce86146cd565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d65919061462f565b81600181518110613d7857613d786146cd565b6001600160a01b039283166020918202929092010152600654613d9e9130911684612c2d565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613dd7908590600090869030904290600401614823565b600060405180830381600087803b158015613df157600080fd5b505af1158015613883573d6000803e3d6000fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561152f573d6000803e3d6000fd5b6021544211613e4657565b600c54600b546001600160a01b0390811691161461238457600c54600b80546001600160a01b0319166001600160a01b03909216919091179055601c54601555565b600654613ea09030906001600160a01b031684612c2d565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613f0d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610faf9190614601565b613f3b30614065565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa89190614511565b60075460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb906044016020604051808303816000875af1158015614003573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614027919061452a565b9050801561152f5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc391016125dd565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f3919061462f565b81600081518110614106576141066146cd565b6001600160a01b039283166020918202929092010152600754825191169082906001908110614137576141376146cd565b6001600160a01b03928316602091820292909201015260065461415d9130911647612c2d565b6006546001600160a01b031663b6f9de95476000848661417f4261012c612bc7565b6040518663ffffffff1660e01b815260040161419e949392919061485f565b6000604051808303818588803b1580156141b757600080fd5b505af1158015613881573d6000803e3d6000fd5b600060208083528351808285015260005b818110156141f8578581018301518582016040015282016141dc565b8181111561420a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461118357600080fd5b6000806040838503121561424857600080fd5b823561425381614220565b9150602083013561426381614220565b809150509250929050565b6000806040838503121561428157600080fd5b823561428c81614220565b946020939093013593505050565b6000602082840312156142ac57600080fd5b5035919050565b6000602082840312156142c557600080fd5b8135612c2681614220565b6000806000606084860312156142e557600080fd5b83356142f081614220565b9250602084013561430081614220565b929592945050506040919091013590565b6000806040838503121561432457600080fd5b50508035926020909101359150565b801515811461118357600080fd5b60006020828403121561435357600080fd5b8135612c2681614333565b803560ff8116811461436f57600080fd5b919050565b6000806000806080858703121561438a57600080fd5b6143938561435e565b93506143a16020860161435e565b92506143af6040860161435e565b91506143bd6060860161435e565b905092959194509250565b600080604083850312156143db57600080fd5b82356143e681614220565b9150602083013561426381614333565b60008060006040848603121561440b57600080fd5b833567ffffffffffffffff8082111561442357600080fd5b818601915086601f83011261443757600080fd5b81358181111561444657600080fd5b8760208260051b850101111561445b57600080fd5b6020928301955093505084013561447181614333565b809150509250925092565b6000806040838503121561448f57600080fd5b82359150602083013561426381614220565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144ea57607f821691505b6020821081141561450b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561452357600080fd5b5051919050565b60006020828403121561453c57600080fd5b8151612c2681614333565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561457757614577614547565b500290565b6000821982111561458f5761458f614547565b500190565b6000826145b157634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602b908201527f426c757272793a2054686520726f7574657220616c726561647920686173207460408201526a686174206164647265737360a81b606082015260800190565b60008060006060848603121561461657600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561464157600080fd5b8151612c2681614220565b600080600080600080600080610100898b03121561466957600080fd5b885161467481614220565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000828210156146c8576146c8614547565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156146f7576146f7614547565b5060010190565b6040808252810183905260008460608301825b8681101561474157823561472481614220565b6001600160a01b0316825260209283019290910190600101614711565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081518084526020808501945080840160005b838110156148185781516001600160a01b0316875295820195908201906001016147f3565b509495945050505050565b85815284602082015260a06040820152600061484260a08301866147df565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600061487860808301866147df565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203175f6ca08f2ecd9504eefd8cb3851aabb92da6312bbb5735041394daf21d6fd64736f6c634300080a00336080604052600880546001600160a01b031916735283d291dbcf85356a21ba090e6db59121208b441790553480156200003757600080fd5b5060408051808201825260178082527f426c757272795f4469766964656e645f547261636b65720000000000000000006020808401828152855180870190965292855284015281519192918391839162000094916003916200017a565b508051620000aa9060049060208401906200017a565b50506005805460ff19166012179055506000620000c43390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505061070860145550670de0b6b3a76400006015556001601260006200014c60055461010090046001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200025d565b828054620001889062000220565b90600052602060002090601f016020900481019282620001ac5760008555620001f7565b82601f10620001c757805160ff1916838001178555620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b506200020592915062000209565b5090565b5b808211156200020557600081556001016200020a565b600181811c908216806200023557607f821691505b602082108114156200025757634e487b7160e01b600052602260045260246000fd5b50919050565b612612806200026d6000396000f3fe60806040526004361061024a5760003560e01c806385a6b3ae11610139578063aafd847a116100b6578063e30443bc1161007a578063e30443bc14610733578063e7841ec014610753578063e98030c714610768578063f2fde38b14610788578063fbcbc0f1146107a8578063ffb2c479146107c857600080fd5b8063aafd847a14610661578063bc4c4b3714610697578063be10b614146106b7578063dd62ed3e146106cd578063e1ccbba61461071357600080fd5b806395d89b41116100fd57806395d89b41146105cc5780639693ec09146105e1578063a457c2d714610601578063a8b9d24014610621578063a9059cbb1461064157600080fd5b806385a6b3ae1461051f5780638da5cb5b1461053557806391b89fba1461056c578063927bf1e91461058c57806395b0a1e0146105ac57600080fd5b8063313ce567116101c75780635183d6fd1161018b5780635183d6fd146104445780636a474002146104a95780636f2789ec146104be57806370a08231146104d4578063715018a61461050a57600080fd5b8063313ce5671461039257806331e79db0146103b45780633243c791146103d457806339509351146103f45780634e7b827f1461041457600080fd5b806318160ddd1161020e57806318160ddd146102fa578063226cfa3d1461030f57806323b872dd1461033c57806327ce01471461035c5780633009a6091461037c57600080fd5b806303c833021461025657806306fdde03146102605780630920dacb1461028b578063095ea7b3146102ab57806309bbedde146102db57600080fd5b3661025157005b600080fd5b61025e610803565b005b34801561026c57600080fd5b506102756108cf565b60405161028291906121f1565b60405180910390f35b34801561029757600080fd5b5061025e6102a636600461225b565b610961565b3480156102b757600080fd5b506102cb6102c6366004612294565b610a63565b6040519015158152602001610282565b3480156102e757600080fd5b50600c545b604051908152602001610282565b34801561030657600080fd5b506002546102ec565b34801561031b57600080fd5b506102ec61032a3660046122c0565b60136020526000908152604090205481565b34801561034857600080fd5b506102cb6103573660046122dd565b610a7a565b34801561036857600080fd5b506102ec6103773660046122c0565b610ae3565b34801561038857600080fd5b506102ec60105481565b34801561039e57600080fd5b5060055460405160ff9091168152602001610282565b3480156103c057600080fd5b5061025e6103cf3660046122c0565b610b3f565b3480156103e057600080fd5b5061025e6103ef36600461231e565b610c6c565b34801561040057600080fd5b506102cb61040f366004612294565b610d1d565b34801561042057600080fd5b506102cb61042f3660046122c0565b60116020526000908152604090205460ff1681565b34801561045057600080fd5b5061046461045f36600461231e565b610d53565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610282565b3480156104b557600080fd5b5061025e610ea7565b3480156104ca57600080fd5b506102ec60145481565b3480156104e057600080fd5b506102ec6104ef3660046122c0565b6001600160a01b031660009081526020819052604090205490565b34801561051657600080fd5b5061025e610f4d565b34801561052b57600080fd5b506102ec600b5481565b34801561054157600080fd5b5060055461010090046001600160a01b03165b6040516001600160a01b039091168152602001610282565b34801561057857600080fd5b506102ec6105873660046122c0565b610fcd565b34801561059857600080fd5b5061025e6105a73660046122c0565b610fd8565b3480156105b857600080fd5b5061025e6105c73660046122c0565b611043565b3480156105d857600080fd5b50610275611095565b3480156105ed57600080fd5b50600854610554906001600160a01b031681565b34801561060d57600080fd5b506102cb61061c366004612294565b6110a4565b34801561062d57600080fd5b506102ec61063c3660046122c0565b6110f3565b34801561064d57600080fd5b506102cb61065c366004612294565b61111f565b34801561066d57600080fd5b506102ec61067c3660046122c0565b6001600160a01b03166000908152600a602052604090205490565b3480156106a357600080fd5b506102cb6106b2366004612345565b611199565b3480156106c357600080fd5b506102ec60155481565b3480156106d957600080fd5b506102ec6106e836600461225b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561071f57600080fd5b5061025e61072e36600461231e565b61124d565b34801561073f57600080fd5b5061025e61074e366004612294565b6112b0565b34801561075f57600080fd5b506010546102ec565b34801561077457600080fd5b5061025e61078336600461231e565b61141f565b34801561079457600080fd5b5061025e6107a33660046122c0565b611588565b3480156107b457600080fd5b506104646107c33660046122c0565b611684565b3480156107d457600080fd5b506107e86107e336600461231e565b6117ed565b60408051938452602084019290925290820152606001610282565b6005546001600160a01b0361010090910416331461083c5760405162461bcd60e51b815260040161083390612373565b60405180910390fd5b600061084760025490565b1161085157600080fd5b34156108cd5761088461086360025490565b61087134600160801b611a32565b61087b91906123be565b60065490611ab8565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b546108c99034611ab8565b600b555b565b6060600380546108de906123e0565b80601f016020809104026020016040519081016040528092919081815260200182805461090a906123e0565b80156109575780601f1061092c57610100808354040283529160200191610957565b820191906000526020600020905b81548152906001019060200180831161093a57829003601f168201915b5050505050905090565b3360009081526012602052604090205460ff1661097d57600080fd5b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa1580156109cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ef919061241b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612434565b505050565b6000610a70338484611b17565b5060015b92915050565b6000610a87848484600080fd5b610ad98433610ad485604051806060016040528060288152602001612590602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611c3b565b611b17565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b92610b3592610b3092610b2a91610b259190611a32565b611c72565b90611c82565b611cc0565b610a7491906123be565b6005546001600160a01b03610100909104163314610b6f5760405162461bcd60e51b815260040161083390612373565b6001600160a01b03811660009081526011602052604090205460ff1615610b9557600080fd5b6001600160a01b0381166000908152601160205260408120805460ff19166001179055610bc3908290611cd3565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152739bfcc854bcfae88775533f0552cb11824437636790634c60db9c9060440160006040518083038186803b158015610c1d57600080fd5b505af4158015610c31573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6005546001600160a01b03610100909104163314610c9c5760405162461bcd60e51b815260040161083390612373565b6000610ca760025490565b11610cb157600080fd5b8015610d1a57610cd1610cc360025490565b61087183600160801b611a32565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b54610d169082611ab8565b600b555b50565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a70918590610ad49086611ab8565b600080600080600080600080600c739bfcc854bcfae88775533f0552cb11824437636763deb3d89690916040518263ffffffff1660e01b8152600401610d9b91815260200190565b602060405180830381865af4158015610db8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddc919061241b565b8910610e01575060009650600019955085945086935083925082915081905080610e9c565b6040516368d54f3f60e11b8152600c6004820152602481018a9052600090739bfcc854bcfae88775533f0552cb1182443763679063d1aa9e7e90604401602060405180830381865af4158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f9190612451565b9050610e8a81611684565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152606960248201527f426c757272795f4469766964656e645f547261636b65723a207769746864726160448201527f774469766964656e642064697361626c65642e20557365207468652027636c6160648201527f696d272066756e6374696f6e206f6e20746865206d61696e20426c757272792060848201526831b7b73a3930b1ba1760b91b60a482015260c401610833565b6005546001600160a01b03610100909104163314610f7d5760405162461bcd60e51b815260040161083390612373565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6000610a74826110f3565b3360009081526012602052604090205460ff16610ff457600080fd5b6001600160a01b03811660009081526012602052604090205460ff1615156001141561101f57600080fd5b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b6005546001600160a01b036101009091041633146110735760405162461bcd60e51b815260040161083390612373565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6060600480546108de906123e0565b6000610a703384610ad4856040518060600160405280602581526020016125b8602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611c3b565b6001600160a01b0381166000908152600a6020526040812054610a749061111984610ae3565b90611d32565b3360009081526012602052604081205460ff1661118e5760405162461bcd60e51b815260206004820152602760248201527f596f7520646f206e6f74206861766520706572726d697373696f6e20746f20746044820152663930b739b332b960c91b6064820152608401610833565b610a70338484600080fd5b6005546000906001600160a01b036101009091041633146111cc5760405162461bcd60e51b815260040161083390612373565b60006111d784611d8e565b90508015611243576001600160a01b038416600081815260136020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906112319085815260200190565b60405180910390a36001915050610a74565b5060009392505050565b6005546001600160a01b0361010090910416331461127d5760405162461bcd60e51b815260040161083390612373565b60155460405182907f512469f9f8a9fc56d42c21fcb6664be0954f18a308cebed44dc3bcf34add033090600090a3601555565b6005546001600160a01b036101009091041633146112e05760405162461bcd60e51b815260040161083390612373565b6001600160a01b03821660009081526011602052604090205460ff1615611305575050565b6015548110611396576113188282611cd3565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052739bfcc854bcfae88775533f0552cb1182443763679063bc2b405c9060640160006040518083038186803b15801561137957600080fd5b505af415801561138d573d6000803e3d6000fd5b50505050611414565b6113a1826000611cd3565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152739bfcc854bcfae88775533f0552cb11824437636790634c60db9c9060440160006040518083038186803b1580156113fb57600080fd5b505af415801561140f573d6000803e3d6000fd5b505050505b610a5e826001611199565b6005546001600160a01b0361010090910416331461144f5760405162461bcd60e51b815260040161083390612373565b620151808111156114dd5760405162461bcd60e51b815260206004820152604c60248201527f426c757272795f4469766964656e645f547261636b65723a20636c61696d576160448201527f6974206d757374206265207570646174656420746f206265747765656e20312060648201526b616e6420323420686f75727360a01b608482015260a401610833565b6014548114156115555760405162461bcd60e51b815260206004820152603e60248201527f426c757272795f4469766964656e645f547261636b65723a2043616e6e6f742060448201527f75706461746520636c61696d5761697420746f2073616d652076616c756500006064820152608401610833565b60145460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601455565b6005546001600160a01b036101009091041633146115b85760405162461bcd60e51b815260040161083390612373565b6001600160a01b03811661161d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610833565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b03821660248201528190600090819081908190819081908190739bfcc854bcfae88775533f0552cb118244376367906317e142d190604401602060405180830381865af41580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611718919061241b565b965060001995506000871261177a576010548711156117465760105461173f908890611ef3565b955061177a565b601054600c546000911061175b57600061176a565b601054600c5461176a91611d32565b90506117768882611c82565b9650505b611783886110f3565b945061178e88610ae3565b6001600160a01b0389166000908152601360205260409020549094509250826117b85760006117c6565b6014546117c6908490611ab8565b91504282116117d65760006117e0565b6117e08242611d32565b9050919395975091939597565b600c8054601080546000938493849390928492918361180b8361246e565b919050558154811061181f5761181f612489565b6000918252602082200154600c54601080546001600160a01b03909316945090926118498361246e565b919050551061187d57600c805460009061186557611865612489565b6000918252602090912001546001600160a01b031690505b6001600160a01b03811660009081526013602052604090205461189f90611f3f565b1561191e576008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156118ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611911919061241b565b905061191c81610c6c565b505b81611936576000806010549450945094505050611a2b565b6010546000805a90506000805b8a8410801561195157508682105b15611a1957846119608161246e565b600c549096508610905061197357600094505b6000600c600001868154811061198b5761198b612489565b60009182526020808320909101546001600160a01b031680835260139091526040909120549091506119bc90611f3f565b156119df576119cc816001611199565b156119df57816119db8161246e565b9250505b826119e98161246e565b93505060005a905080851115611a1057611a0d611a068683611d32565b8790611ab8565b95505b93506119439050565b60108590559098509650919450505050505b9193909250565b600082611a4157506000610a74565b6000611a4d838561249f565b905082611a5a85836123be565b14611ab15760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610833565b9392505050565b600080611ac583856124be565b905083811015611ab15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610833565b6001600160a01b038316611b795760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610833565b6001600160a01b038216611bda5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610833565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008184841115611c5f5760405162461bcd60e51b815260040161083391906121f1565b50611c6a83856124d6565b949350505050565b60008181811215610a7457600080fd5b600080611c8f83856124ed565b905060008312158015611ca25750838112155b80611cb75750600083128015611cb757508381125b611ab157600080fd5b600080821215611ccf57600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611d12576000611d008383611d32565b9050611d0c8482611f66565b50505050565b80821015610a5e576000611d268284611d32565b9050611d0c8482611fca565b600082821115611d845760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610833565b611ab182846124d6565b600080611d9a836110f3565b90508015611eea576001600160a01b0383166000908152600a6020526040902054611dc59082611ab8565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611e149084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611e70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e949190612434565b905080611ee3576001600160a01b0384166000908152600a6020526040902054611ebe9083611d32565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6000808212158015611f0e575082611f0b838261252e565b13155b80611f2c5750600082128015611f2c575082611f2a838261252e565b135b611f3557600080fd5b611ab1828461252e565b600042821115611f5157506000919050565b601454611f5e4284611d32565b101592915050565b611f70828261200e565b611faa611f8b610b2583600654611a3290919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611ef3565b6001600160a01b0390921660009081526009602052604090209190915550565b611fd482826120ed565b611faa611fef610b2583600654611a3290919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611c82565b6001600160a01b0382166120645760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610833565b6002546120719082611ab8565b6002556001600160a01b0382166000908152602081905260409020546120979082611ab8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661214d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610833565b61218a8160405180606001604052806022815260200161256e602291396001600160a01b0385166000908152602081905260409020549190611c3b565b6001600160a01b0383166000908152602081905260409020556002546121b09082611d32565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016120e1565b600060208083528351808285015260005b8181101561221e57858101830151858201604001528201612202565b81811115612230576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610d1a57600080fd5b6000806040838503121561226e57600080fd5b823561227981612246565b9150602083013561228981612246565b809150509250929050565b600080604083850312156122a757600080fd5b82356122b281612246565b946020939093013593505050565b6000602082840312156122d257600080fd5b8135611ab181612246565b6000806000606084860312156122f257600080fd5b83356122fd81612246565b9250602084013561230d81612246565b929592945050506040919091013590565b60006020828403121561233057600080fd5b5035919050565b8015158114610d1a57600080fd5b6000806040838503121561235857600080fd5b823561236381612246565b9150602083013561228981612337565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000826123db57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806123f457607f821691505b6020821081141561241557634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561242d57600080fd5b5051919050565b60006020828403121561244657600080fd5b8151611ab181612337565b60006020828403121561246357600080fd5b8151611ab181612246565b6000600019821415612482576124826123a8565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156124b9576124b96123a8565b500290565b600082198211156124d1576124d16123a8565b500190565b6000828210156124e8576124e86123a8565b500390565b600080821280156001600160ff1b038490038513161561250f5761250f6123a8565b600160ff1b8390038412811615612528576125286123a8565b50500190565b60008083128015600160ff1b85018412161561254c5761254c6123a8565b6001600160ff1b0384018313811615612567576125676123a8565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202e5869ed84cfcc3ec5ea716557f2ee23ddbea2e3fd37d214a76ff30d79e5e7ae64736f6c634300080a0033

Deployed Bytecode

0x60806040526004361061042a5760003560e01c806388bdd9be11610229578063b9e937001161012e578063e1ccbba6116100b6578063f27fd2541161007a578063f27fd25414610cc7578063f298f42c14610ce7578063f2fde38b14610d07578063f657099014610d27578063fe575a8714610d4757600080fd5b8063e1ccbba614610c3c578063e2f4560514610c5c578063e37ba8f914610c72578063e7841ec014610c92578063e98030c714610ca757600080fd5b8063c3a3c032116100fd578063c3a3c03214610b96578063c492f04614610bab578063d0a3981414610bcb578063d63607d814610be1578063dd62ed3e14610bf657600080fd5b8063b9e9370014610b2b578063bc37e1a314610b41578063c024666814610b56578063c23be47f14610b7657600080fd5b8063a457c2d7116101b1578063aacebbe311610180578063aacebbe314610a40578063ab3b554514610a60578063ad56c13c14610a80578063b1ff3b5c14610ae5578063b62496f514610afb57600080fd5b8063a457c2d7146109ca578063a8b9d240146109ea578063a9059cbb14610a0a578063a9dec43614610a2a57600080fd5b80639693ec09116101f85780639693ec091461094a57806396c74c641461096a5780639a7a23d61461097f5780639c1b8af51461099f578063a26579ad146109b557600080fd5b806388bdd9be146108d25780638da5cb5b146108f257806395b0a1e01461091557806395d89b411461093557600080fd5b80633320f5851161032f57806364b0f653116102b7578063700bb19111610286578063700bb1911461084757806370a0823114610867578063715018a61461088757806382247ec01461089c578063871c128d146108b257600080fd5b806364b0f653146107d257806365b8dbc0146107e75780636843cd84146108075780636ec0227a1461082757600080fd5b806349bdf873116102fe57806349bdf8731461071e5780634c12b33f146107385780634cdaf0ae146107595780634fbee19314610779578063553ad0dc146107b257600080fd5b80633320f5851461069557806339509351146106b55780633c7a309b146106d557806349bd5a5e146106ea57600080fd5b806323b872dd116103b25780632c889d18116103815780632c889d18146105fe5780632de3f9561461061e57806330bb4cff1461063e578063313ce5671461065357806331e79db01461067557600080fd5b806323b872dd14610589578063270924c7146105a9578063296d3de0146105be5780632c1f5216146105de57600080fd5b8063095ea7b3116103f9578063095ea7b3146104bc5780631694505e146104ec57806318160ddd146105245780631c499ab0146105395780631cdd3be31461055957600080fd5b8063021954661461043657806306fdde031461044d5780630773d31d146104785780630920dacb1461049c57600080fd5b3661043157005b600080fd5b34801561044257600080fd5b5061044b610d80565b005b34801561045957600080fd5b50610462610e09565b60405161046f91906141cb565b60405180910390f35b34801561048457600080fd5b5061048e60185481565b60405190815260200161046f565b3480156104a857600080fd5b5061044b6104b7366004614235565b610e9b565b3480156104c857600080fd5b506104dc6104d736600461426e565b610fb6565b604051901515815260200161046f565b3480156104f857600080fd5b5060065461050c906001600160a01b031681565b6040516001600160a01b03909116815260200161046f565b34801561053057600080fd5b5060025461048e565b34801561054557600080fd5b5061044b61055436600461429a565b610fcd565b34801561056557600080fd5b506104dc6105743660046142b3565b60256020526000908152604090205460ff1681565b34801561059557600080fd5b506104dc6105a43660046142d0565b611015565b3480156105b557600080fd5b5061044b61107e565b3480156105ca57600080fd5b5061044b6105d9366004614311565b6110e3565b3480156105ea57600080fd5b5060085461050c906001600160a01b031681565b34801561060a57600080fd5b5061044b61061936600461429a565b611141565b34801561062a57600080fd5b5061044b610639366004614341565b611186565b34801561064a57600080fd5b5061048e61120e565b34801561065f57600080fd5b5060055460405160ff909116815260200161046f565b34801561068157600080fd5b5061044b6106903660046142b3565b611281565b3480156106a157600080fd5b5061044b6106b0366004614374565b61130d565b3480156106c157600080fd5b506104dc6106d036600461426e565b611364565b3480156106e157600080fd5b5061044b61139a565b3480156106f657600080fd5b5061050c7f0000000000000000000000002c98676c9dfe9460f1557f7ddf6daad1eab19ca981565b34801561072a57600080fd5b506028546104dc9060ff1681565b34801561074457600080fd5b506007546104dc90600160b01b900460ff1681565b34801561076557600080fd5b5061044b6107743660046142b3565b611571565b34801561078557600080fd5b506104dc6107943660046142b3565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107be57600080fd5b5061044b6107cd366004614341565b6115cf565b3480156107de57600080fd5b5061048e61164c565b3480156107f357600080fd5b5061044b6108023660046142b3565b611696565b34801561081357600080fd5b5061048e6108223660046142b3565b611751565b34801561083357600080fd5b5061044b610842366004614374565b6117c1565b34801561085357600080fd5b5061044b61086236600461429a565b611812565b34801561087357600080fd5b5061048e6108823660046142b3565b6118e4565b34801561089357600080fd5b5061044b6118ff565b3480156108a857600080fd5b5061048e60165481565b3480156108be57600080fd5b5061044b6108cd36600461429a565b61197f565b3480156108de57600080fd5b5061044b6108ed3660046142b3565b611ad9565b3480156108fe57600080fd5b5060055461010090046001600160a01b031661050c565b34801561092157600080fd5b5061044b6109303660046142b3565b611df7565b34801561094157600080fd5b50610462611ed9565b34801561095657600080fd5b5060075461050c906001600160a01b031681565b34801561097657600080fd5b5061044b611ee8565b34801561098b57600080fd5b5061044b61099a3660046143c8565b611f32565b3480156109ab57600080fd5b5061048e60205481565b3480156109c157600080fd5b5061048e61202a565b3480156109d657600080fd5b506104dc6109e536600461426e565b612074565b3480156109f657600080fd5b5061048e610a053660046142b3565b6120c3565b348015610a1657600080fd5b506104dc610a2536600461426e565b6120f6565b348015610a3657600080fd5b5061048e60175481565b348015610a4c57600080fd5b5061044b610a5b3660046142b3565b612103565b348015610a6c57600080fd5b5061044b610a7b36600461429a565b612216565b348015610a8c57600080fd5b50610aa0610a9b3660046142b3565b612273565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161046f565b348015610af157600080fd5b5061048e601f5481565b348015610b0757600080fd5b506104dc610b163660046142b3565b60246020526000908152604090205460ff1681565b348015610b3757600080fd5b5061048e601d5481565b348015610b4d57600080fd5b5061044b61230e565b348015610b6257600080fd5b5061044b610b713660046143c8565b612386565b348015610b8257600080fd5b5061044b610b913660046142b3565b6124a0565b348015610ba257600080fd5b5061048e6124e8565b348015610bb757600080fd5b5061044b610bc63660046143f6565b612508565b348015610bd757600080fd5b5061048e601e5481565b348015610bed57600080fd5b5061044b6125ea565b348015610c0257600080fd5b5061048e610c11366004614235565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c4857600080fd5b5061044b610c5736600461429a565b612629565b348015610c6857600080fd5b5061048e600d5481565b348015610c7e57600080fd5b5061044b610c8d3660046142b3565b61268a565b348015610c9e57600080fd5b5061048e61279d565b348015610cb357600080fd5b5061044b610cc236600461429a565b6127e7565b348015610cd357600080fd5b50610aa0610ce236600461429a565b612848565b348015610cf357600080fd5b5061044b610d023660046143c8565b61288a565b348015610d1357600080fd5b5061044b610d223660046142b3565b61299f565b348015610d3357600080fd5b5061044b610d4236600461447c565b612a9b565b348015610d5357600080fd5b506104dc610d623660046142b3565b6001600160a01b031660009081526025602052604090205460ff1690565b6005546001600160a01b03610100909104163314610db95760405162461bcd60e51b8152600401610db0906144a1565b60405180910390fd5b610dc8601e80601e60096117c1565b610dd8600560086005600261130d565b610de5633b9aca00610fcd565b610df3633b9aca00806110e3565b6007805461ffff60a81b1916600160a81b179055565b606060038054610e18906144d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e44906144d6565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b6005546001600160a01b03610100909104163314610ecb5760405162461bcd60e51b8152600401610db0906144a1565b6040516370a0823160e01b815230600482015282906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f389190614511565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509083169063a9059cbb906044016020604051808303816000875af1158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf919061452a565b5050505050565b6000610fc3338484612c2d565b5060015b92915050565b6005546001600160a01b03610100909104163314610ffd5760405162461bcd60e51b8152600401610db0906144a1565b61100f81670de0b6b3a764000061455d565b60165550565b6000611022848484612d52565b611074843361106f856040518060600160405280602881526020016148bb602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919061388b565b612c2d565b5060019392505050565b6005546001600160a01b036101009091041633146110ae5760405162461bcd60e51b8152600401610db0906144a1565b6110bd600280600660006117c1565b6110cc600280600e600061130d565b6110d963b2d05e00610fcd565b610df363b2d05e00805b6005546001600160a01b036101009091041633146111135760405162461bcd60e51b8152600401610db0906144a1565b61112582670de0b6b3a764000061455d565b60175561113a81670de0b6b3a764000061455d565b6018555050565b6005546001600160a01b036101009091041633146111715760405162461bcd60e51b8152600401610db0906144a1565b61118361117e428361457c565b6138c2565b50565b6005546001600160a01b036101009091041633146111b65760405162461bcd60e51b8152600401610db0906144a1565b60078054821515600160a81b0260ff60a81b199091161790556040517fd92566aec3731c43bc7ec6a90c119de538d83f226f301b29d5139a4b670abfb29061120390831515815260200190565b60405180910390a150565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127c9190614511565b905090565b6005546001600160a01b036101009091041633146112b15760405162461bcd60e51b8152600401610db0906144a1565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156112f957600080fd5b505af1158015610faf573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461133d5760405162461bcd60e51b8152600401610db0906144a1565b60ff808516601355838116601455828116601255811660155561135e6138d5565b50505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610fc391859061106f9086612bc7565b6005546001600160a01b036101009091041633146113ca5760405162461bcd60e51b8152600401610db0906144a1565b60275442101561140f5760405162461bcd60e51b815260206004820152601060248201526f139bdd081e595d081d5b9b1bd8dad95960821b6044820152606401610db0565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561145c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114809190614511565b60285490915060ff16156115345761149b620151804261457c565b602755600a6114ab82600261455d565b6114b59190614594565b600a5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044015b6020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f919061452a565b505050565b600a5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016114ec565b5050565b6005546001600160a01b036101009091041633146115a15760405162461bcd60e51b8152600401610db0906144a1565b602680546001600160a01b0319166001600160a01b0383161790556115c9620151804261457c565b60275550565b6005546001600160a01b036101009091041633146115ff5760405162461bcd60e51b8152600401610db0906144a1565b60078054821515600160b01b0260ff60b01b199091161790556040517f6225104598bca03a23e6426058f298b0ff0510d263e9c7c61317dbbf41da0eb09061120390831515815260200190565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146116c65760405162461bcd60e51b8152600401610db0906144a1565b6006546001600160a01b03828116911614156116f45760405162461bcd60e51b8152600401610db0906145b6565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561179d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc79190614511565b6005546001600160a01b036101009091041633146117f15760405162461bcd60e51b8152600401610db0906144a1565b60ff808516600e55838116601055828116600f55811660115561135e6138d5565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611865573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118899190614601565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461192f5760405162461bcd60e51b8152600401610db0906144a1565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146119af5760405162461bcd60e51b8152600401610db0906144a1565b62030d4081101580156119c557506207a1208111155b611a375760405162461bcd60e51b815260206004820152603c60248201527f426c757272793a20676173466f7250726f63657373696e67206d75737420626560448201527f206265747765656e203230302c30303020616e64203530302c303030000000006064820152608401610db0565b602054811415611aa65760405162461bcd60e51b815260206004820152603460248201527f426c757272793a2043616e6e6f742075706461746520676173466f7250726f63604482015273657373696e6720746f2073616d652076616c756560601b6064820152608401610db0565b60205460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602055565b6005546001600160a01b03610100909104163314611b095760405162461bcd60e51b8152600401610db0906144a1565b6008546001600160a01b0382811691161415611b855760405162461bcd60e51b815260206004820152603560248201527f426c757272793a20546865206469766964656e6420747261636b657220616c7260448201527465616479206861732074686174206164647265737360581b6064820152608401610db0565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf6919061462f565b6001600160a01b031614611c865760405162461bcd60e51b815260206004820152604b60248201527f426c757272793a20546865206e6577206469766964656e6420747261636b657260448201527f206d757374206265206f776e65642062792074686520426c7572727920746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610db0565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611cc857600080fd5b505af1158015611cdc573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03610100909104163314611e275760405162461bcd60e51b8152600401610db0906144a1565b6007546001600160a01b0382811691161415611e555760405162461bcd60e51b8152600401610db0906145b6565b6007546040516001600160a01b03918216918316907f523400a476dc1f49f3cc8e7dc4ea8fbd97c0b7c17be259fbc3a8ff8f67a71fd290600090a3600780546001600160a01b0319166001600160a01b038381169182179092556008546040516304ad850f60e51b81526004810192909252909116906395b0a1e0906024016112df565b606060048054610e18906144d6565b6005546001600160a01b03610100909104163314611f185760405162461bcd60e51b8152600401610db0906144a1565b6000611f23306118e4565b90506111833061dead83613926565b6005546001600160a01b03610100909104163314611f625760405162461bcd60e51b8152600401610db0906144a1565b7f0000000000000000000000002c98676c9dfe9460f1557f7ddf6daad1eab19ca96001600160a01b0316826001600160a01b031614156120205760405162461bcd60e51b815260206004820152604d60248201527f426c757272793a205468652050616e63616b655377617020706169722063616e60448201527f6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d617260648201526c6b65744d616b6572506169727360981b608482015260a401610db0565b61156d8282613a1d565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6000610fc3338461106f85604051806060016040528060258152602001614903602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919061388b565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611780565b6000610fc3338484612d52565b6005546001600160a01b036101009091041633146121335760405162461bcd60e51b8152600401610db0906144a1565b6009546001600160a01b03828116911614156121ae5760405162461bcd60e51b815260206004820152603460248201527f426c757272793a20546865206d61726b6574696e672077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b6064820152608401610db0565b6121b9816001612386565b6009546040516001600160a01b03918216918316907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122465760405162461bcd60e51b8152600401610db0906144a1565b61225881670de0b6b3a764000061455d565b601f5561226d81670de0b6b3a764000061455d565b600d5550565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156122cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f3919061464c565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0361010090910416331461233e5760405162461bcd60e51b8152600401610db0906144a1565b61234c6000806000806117c1565b61235a60008060008061130d565b6007805460ff60a81b1916905561237564174876e800610fcd565b61238464174876e800806110e3565b565b6005546001600160a01b036101009091041633146123b65760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b03821660009081526023602052604090205460ff16151581151514156124405760405162461bcd60e51b815260206004820152603260248201527f426c757272793a204163636f756e7420697320616c7265616479207468652076604482015271616c7565206f6620276578636c756465642760701b6064820152608401610db0565b6001600160a01b038216600081815260236020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b036101009091041633146124d05760405162461bcd60e51b8152600401610db0906144a1565b60006124db306118e4565b905061156d308383613926565b6000602754421015612502574260275461127c91906146b6565b50600090565b6005546001600160a01b036101009091041633146125385760405162461bcd60e51b8152600401610db0906144a1565b60005b828110156125a957816023600086868581811061255a5761255a6146cd565b905060200201602081019061256f91906142b3565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806125a1816146e3565b91505061253b565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516125dd939291906146fe565b60405180910390a1505050565b6005546001600160a01b0361010090910416331461261a5760405162461bcd60e51b8152600401610db0906144a1565b6028805460ff19166001179055565b6005546001600160a01b036101009091041633146126595760405162461bcd60e51b8152600401610db0906144a1565b6008546040516370e65dd360e11b8152600481018390526001600160a01b039091169063e1ccbba6906024016112df565b6005546001600160a01b036101009091041633146126ba5760405162461bcd60e51b8152600401610db0906144a1565b600a546001600160a01b03828116911614156127355760405162461bcd60e51b815260206004820152603460248201527f426c757272793a20546865206c69717569646974792077616c6c657420697320604482015273616c72656164792074686973206164647265737360601b6064820152608401610db0565b612740816001612386565b600a546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611258573d6000803e3d6000fd5b6005546001600160a01b036101009091041633146128175760405162461bcd60e51b8152600401610db0906144a1565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024016112df565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016122b1565b6005546001600160a01b036101009091041633146128ba5760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b03821660009081526025602052604090205460ff16151581151514156129475760405162461bcd60e51b815260206004820152603560248201527f426c757272793a204163636f756e7420697320616c7265616479207468652076604482015274616c7565206f662027626c61636b6c69737465642760581b6064820152608401610db0565b6001600160a01b038216600081815260256020908152604091829020805460ff191685151590811790915591519182527f404e512903f1ca111aaa7db3f548b1969d86eda85df18088582f13feba1e412c9101612494565b6005546001600160a01b036101009091041633146129cf5760405162461bcd60e51b8152600401610db0906144a1565b6001600160a01b038116612a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db0565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b03610100909104163314612acb5760405162461bcd60e51b8152600401610db0906144a1565b816022541415612b1d5760405162461bcd60e51b815260206004820152601960248201527f5468617420697320616c7265616479207468652074696d6572000000000000006044820152606401610db0565b600b546001600160a01b0382811691161415612b7b5760405162461bcd60e51b815260206004820152601e60248201527f5468617420697320616c726561647920746865204465762057616c6c657400006044820152606401610db0565b612b8682603c613b7d565b6022819055612b96904290612bc7565b602155600b80546001600160a01b0319166001600160a01b03929092169190911790555060158054601c5560019055565b600080612bd4838561457c565b905083811015612c265760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610db0565b9392505050565b6001600160a01b038316612c8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610db0565b6001600160a01b038216612cf05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610db0565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612d785760405162461bcd60e51b8152600401610db090614757565b6001600160a01b038216612d9e5760405162461bcd60e51b8152600401610db09061479c565b6001600160a01b03831660009081526025602052604090205460ff16158015612de057506001600160a01b03821660009081526025602052604090205460ff16155b612de957600080fd5b6005546001600160a01b038481166101009092041614801590612e1f57506005546001600160a01b038381166101009092041614155b8015612e3357506001600160a01b03821615155b8015612e4a57506001600160a01b03821661dead14155b8015612e8857507f0000000000000000000000002c98676c9dfe9460f1557f7ddf6daad1eab19ca96001600160a01b0316826001600160a01b031614155b8015612ead57506001600160a01b03821660009081526023602052604090205460ff16155b8015612ed257506001600160a01b03831660009081526023602052604090205460ff16155b15612fcc57600754600160a81b900460ff161515600114612ef257600080fd5b601754811115612f555760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610db0565b6000612f60836118e4565b601654909150612f70838361457c565b1115612fca5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610db0565b505b80612fdd5761152f83836000613926565b600754600160a01b900460ff1615801561300f57506001600160a01b03821660009081526024602052604090205460ff165b801561302957506006546001600160a01b03848116911614155b801561304857506005546001600160a01b038481166101009092041614155b801561306757506005546001600160a01b038381166101009092041614155b801561308c57506001600160a01b03821660009081526023602052604090205460ff16155b80156130b157506001600160a01b03831660009081526023602052604090205460ff16155b1561314957600754600160a81b900460ff1615156001146130d157600080fd5b6018548111156131495760405162461bcd60e51b815260206004820152603a60248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d617853656c6c5472616e73616374696f6e416d6f756e742e0000000000006064820152608401610db0565b6000613154306118e4565b600d54909150811080159081906131755750600754600160a01b900460ff16155b801561319a57506001600160a01b03851660009081526024602052604090205460ff16155b80156131b45750600a546001600160a01b03868116911614155b80156131ce5750600a546001600160a01b03858116911614155b80156131e857506009546001600160a01b03868116911614155b801561320257506009546001600160a01b03858116911614155b801561322757506001600160a01b03841660009081526023602052604090205460ff16155b801561324c57506001600160a01b03851660009081526023602052604090205460ff16155b1561355557601f54600754909250600160b01b900460ff161561330b57601f5461327f81613279306118e4565b90613bfc565b11156132c257601f546132953061dead83613926565b60405181815261dead9030906000805160206148e38339815191529060200160405180910390a35061330b565b60006132d3601f54613279306118e4565b90506132e23061dead83613926565b60405181815261dead9030906000805160206148e38339815191529060200160405180910390a3505b600080613337601554613331601354613331601254601454612bc790919063ffffffff16565b90612bc7565b9050600061335a8261335460135488613b7d90919063ffffffff16565b90613c58565b90506000613369826002613c58565b905060006133778383613bfc565b6007805460ff60a01b1916600160a01b179055601454909150156134265761339f8783613bfc565b94506133aa85613cb3565b60006133c58561335460145447613b7d90919063ffffffff16565b6009549091506133de906001600160a01b031682613e05565b6009546014546001600160a01b039091169030906000805160206148e383398151915290613413908990613354904790613b7d565b60405190815260200160405180910390a3505b6015541561349e57613436613e3b565b60006134518561335460155447613b7d90919063ffffffff16565b600b5490915061346a906001600160a01b031682613e05565b600b546040518281526001600160a01b039091169030906000805160206148e38339815191529060200160405180910390a3505b601354156135105760006134c18561335460135447613b7d90919063ffffffff16565b90506134cd8382613e88565b60408051838152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a1505b6012541561354257600061353585613354601254601f54613b7d90919063ffffffff16565b905061354081613f32565b505b50506007805460ff60a01b191690555050505b6007546001600160a01b03861660009081526023602052604090205460ff600160a01b9092048216159116806135a357506001600160a01b03851660009081526023602052604090205460ff165b156135ac575060005b80156136745760006135ce6064613354601d5488613b7d90919063ffffffff16565b905060006135ec6064613354601e5489613b7d90919063ffffffff16565b90507f0000000000000000000000002c98676c9dfe9460f1557f7ddf6daad1eab19ca96001600160a01b0316876001600160a01b0316141561364f576136328682613bfc565b955061363f883083613926565b61364a888888613926565b613671565b6136598683613bfc565b9550613666883084613926565b613671888888613926565b50505b6001600160a01b03861660009081526023602052604090205460ff16806136b357506001600160a01b03851660009081526023602052604090205460ff165b156136c3576136c3868686613926565b6008546001600160a01b031663e30443bc876136de816118e4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561372457600080fd5b505af1925050508015613735575060015b506008546001600160a01b031663e30443bc86613751816118e4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561379757600080fd5b505af19250505080156137a8575060015b50600754600160a01b900460ff16613883576020546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613827575060408051601f3d908101601f1916820190925261382491810190614601565b60015b61383057613881565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600081848411156138af5760405162461bcd60e51b8152600401610db091906141cb565b506138ba83856146b6565b949350505050565b60275481116138d057600080fd5b602755565b6138f8601154613331601054613331600e54600f54612bc790919063ffffffff16565b601d81905550613921601554613331601454613331601354601254612bc790919063ffffffff16565b601e55565b6001600160a01b03831661394c5760405162461bcd60e51b8152600401610db090614757565b6001600160a01b0382166139725760405162461bcd60e51b8152600401610db09061479c565b6139af81604051806060016040528060268152602001614895602691396001600160a01b038616600090815260208190526040902054919061388b565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546139de9082612bc7565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616916000805160206148e38339815191529101612d45565b6001600160a01b03821660009081526024602052604090205460ff1615158115151415613ab4576040805162461bcd60e51b81526020600482015260248101919091527f426c757272793a204175746f6d61746564206d61726b6574206d616b6572207060448201527f61697220697320616c72656164792073657420746f20746861742076616c75656064820152608401610db0565b6001600160a01b0382166000908152602460205260409020805460ff19168215801591909117909155613b415760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613b2857600080fd5b505af1158015613b3c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600082613b8c57506000610fc7565b6000613b98838561455d565b905082613ba58583614594565b14612c265760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610db0565b600082821115613c4e5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610db0565b612c2682846146b6565b6000808211613ca95760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610db0565b612c268284614594565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613ce857613ce86146cd565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d65919061462f565b81600181518110613d7857613d786146cd565b6001600160a01b039283166020918202929092010152600654613d9e9130911684612c2d565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613dd7908590600090869030904290600401614823565b600060405180830381600087803b158015613df157600080fd5b505af1158015613883573d6000803e3d6000fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561152f573d6000803e3d6000fd5b6021544211613e4657565b600c54600b546001600160a01b0390811691161461238457600c54600b80546001600160a01b0319166001600160a01b03909216919091179055601c54601555565b600654613ea09030906001600160a01b031684612c2d565b60065460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613f0d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610faf9190614601565b613f3b30614065565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613f84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fa89190614511565b60075460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb906044016020604051808303816000875af1158015614003573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614027919061452a565b9050801561152f5760408051848152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc391016125dd565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f3919061462f565b81600081518110614106576141066146cd565b6001600160a01b039283166020918202929092010152600754825191169082906001908110614137576141376146cd565b6001600160a01b03928316602091820292909201015260065461415d9130911647612c2d565b6006546001600160a01b031663b6f9de95476000848661417f4261012c612bc7565b6040518663ffffffff1660e01b815260040161419e949392919061485f565b6000604051808303818588803b1580156141b757600080fd5b505af1158015613881573d6000803e3d6000fd5b600060208083528351808285015260005b818110156141f8578581018301518582016040015282016141dc565b8181111561420a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461118357600080fd5b6000806040838503121561424857600080fd5b823561425381614220565b9150602083013561426381614220565b809150509250929050565b6000806040838503121561428157600080fd5b823561428c81614220565b946020939093013593505050565b6000602082840312156142ac57600080fd5b5035919050565b6000602082840312156142c557600080fd5b8135612c2681614220565b6000806000606084860312156142e557600080fd5b83356142f081614220565b9250602084013561430081614220565b929592945050506040919091013590565b6000806040838503121561432457600080fd5b50508035926020909101359150565b801515811461118357600080fd5b60006020828403121561435357600080fd5b8135612c2681614333565b803560ff8116811461436f57600080fd5b919050565b6000806000806080858703121561438a57600080fd5b6143938561435e565b93506143a16020860161435e565b92506143af6040860161435e565b91506143bd6060860161435e565b905092959194509250565b600080604083850312156143db57600080fd5b82356143e681614220565b9150602083013561426381614333565b60008060006040848603121561440b57600080fd5b833567ffffffffffffffff8082111561442357600080fd5b818601915086601f83011261443757600080fd5b81358181111561444657600080fd5b8760208260051b850101111561445b57600080fd5b6020928301955093505084013561447181614333565b809150509250925092565b6000806040838503121561448f57600080fd5b82359150602083013561426381614220565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144ea57607f821691505b6020821081141561450b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561452357600080fd5b5051919050565b60006020828403121561453c57600080fd5b8151612c2681614333565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561457757614577614547565b500290565b6000821982111561458f5761458f614547565b500190565b6000826145b157634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602b908201527f426c757272793a2054686520726f7574657220616c726561647920686173207460408201526a686174206164647265737360a81b606082015260800190565b60008060006060848603121561461657600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561464157600080fd5b8151612c2681614220565b600080600080600080600080610100898b03121561466957600080fd5b885161467481614220565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000828210156146c8576146c8614547565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156146f7576146f7614547565b5060010190565b6040808252810183905260008460608301825b8681101561474157823561472481614220565b6001600160a01b0316825260209283019290910190600101614711565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600081518084526020808501945080840160005b838110156148185781516001600160a01b0316875295820195908201906001016147f3565b509495945050505050565b85815284602082015260a06040820152600061484260a08301866147df565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600061487860808301866147df565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203175f6ca08f2ecd9504eefd8cb3851aabb92da6312bbb5735041394daf21d6fd64736f6c634300080a0033

Libraries Used


Deployed Bytecode Sourcemap

24602:27142:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49393:263;;;;;;;;;;;;;:::i;:::-;;13972:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25555:23;;;;;;;;;;;;;;;;;;;762:25:1;;;750:2;735:18;25555:23:0;616:177:1;51166:233:0;;;;;;;;;;-1:-1:-1;51166:233:0;;;;;:::i;:::-;;:::i;14866:169::-;;;;;;;;;;-1:-1:-1;14866:169:0;;;;;:::i;:::-;;:::i;:::-;;;1812:14:1;;1805:22;1787:41;;1775:2;1760:18;14866:169:0;1647:187:1;24692:41:0;;;;;;;;;;-1:-1:-1;24692:41:0;;;;-1:-1:-1;;;;;24692:41:0;;;;;;-1:-1:-1;;;;;2029:32:1;;;2011:51;;1999:2;1984:18;24692:41:0;1839:229:1;14273:108:0;;;;;;;;;;-1:-1:-1;14361:12:0;;14273:108;;50401:119;;;;;;;;;;-1:-1:-1;50401:119:0;;;;;:::i;:::-;;:::i;26167:47::-;;;;;;;;;;-1:-1:-1;26167:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;15043:321;;;;;;;;;;-1:-1:-1;15043:321:0;;;;;:::i;:::-;;:::i;49128:257::-;;;;;;;;;;;;;:::i;50528:174::-;;;;;;;;;;-1:-1:-1;50528:174:0;;;;;:::i;:::-;;:::i;24958:44::-;;;;;;;;;;-1:-1:-1;24958:44:0;;;;-1:-1:-1;;;;;24958:44:0;;;34643:158;;;;;;;;;;-1:-1:-1;34643:158:0;;;;;:::i;:::-;;:::i;39772:143::-;;;;;;;;;;-1:-1:-1;39772:143:0;;;;;:::i;:::-;;:::i;37871:141::-;;;;;;;;;;;;;:::i;14174:91::-;;;;;;;;;;-1:-1:-1;14248:9:0;;14174:91;;14248:9;;;;3981:36:1;;3969:2;3954:18;14174:91:0;3839:184:1;30173:147:0;;;;;;;;;;-1:-1:-1;30173:147:0;;;;;:::i;:::-;;:::i;50028:365::-;;;;;;;;;;-1:-1:-1;50028:365:0;;;;;:::i;:::-;;:::i;15372:218::-;;;;;;;;;;-1:-1:-1;15372:218:0;;;;;:::i;:::-;;:::i;35102:903::-;;;;;;;;;;;;;:::i;24740:38::-;;;;;;;;;;;;;;;34478:37;;;;;;;;;;-1:-1:-1;34478:37:0;;;;;;;;24931:19;;;;;;;;;;-1:-1:-1;24931:19:0;;;;-1:-1:-1;;;24931:19:0;;;;;;33693:205;;;;;;;;;;-1:-1:-1;33693:205:0;;;;;:::i;:::-;;:::i;38020:125::-;;;;;;;;;;-1:-1:-1;38020:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;38109:28:0;38085:4;38109:28;;;:19;:28;;;;;;;;;38020:125;40435:143;;;;;;;;;;-1:-1:-1;40435:143:0;;;;;:::i;:::-;;:::i;39625:141::-;;;;;;;;;;;;;:::i;31654:315::-;;;;;;;;;;-1:-1:-1;31654:315:0;;;;;:::i;:::-;;:::i;38433:130::-;;;;;;;;;;-1:-1:-1;38433:130:0;;;;;:::i;:::-;;:::i;49668:352::-;;;;;;;;;;-1:-1:-1;49668:352:0;;;;;:::i;:::-;;:::i;39224:259::-;;;;;;;;;;-1:-1:-1;39224:259:0;;;;;:::i;:::-;;:::i;14389:127::-;;;;;;;;;;-1:-1:-1;14389:127:0;;;;;:::i;:::-;;:::i;11372:148::-;;;;;;;;;;;;;:::i;25494:25::-;;;;;;;;;;;;;;;;36999:408;;;;;;;;;;-1:-1:-1;36999:408:0;;;;;:::i;:::-;;:::i;30497:781::-;;;;;;;;;;-1:-1:-1;30497:781:0;;;;;:::i;:::-;;:::i;11149:87::-;;;;;;;;;;-1:-1:-1;11222:6:0;;;;;-1:-1:-1;;;;;11222:6:0;11149:87;;31286:356;;;;;;;;;;-1:-1:-1;31286:356:0;;;;;:::i;:::-;;:::i;14071:95::-;;;;;;;;;;;;;:::i;24787:83::-;;;;;;;;;;-1:-1:-1;24787:83:0;;;;-1:-1:-1;;;;;24787:83:0;;;51411:202;;;;;;;;;;;;;:::i;32903:264::-;;;;;;;;;;-1:-1:-1;32903:264:0;;;;;:::i;:::-;;:::i;25860:40::-;;;;;;;;;;;;;;;;37755:108;;;;;;;;;;;;;:::i;15598:269::-;;;;;;;;;;-1:-1:-1;15598:269:0;;;;;:::i;:::-;;:::i;38281:147::-;;;;;;;;;;-1:-1:-1;38281:147:0;;;;;:::i;:::-;;:::i;14524:175::-;;;;;;;;;;-1:-1:-1;14524:175:0;;;;;:::i;:::-;;:::i;25526:22::-;;;;;;;;;;;;;;;;36392:371;;;;;;;;;;-1:-1:-1;36392:371:0;;;;;:::i;:::-;;:::i;30325:164::-;;;;;;;;;;-1:-1:-1;30325:164:0;;;;;:::i;:::-;;:::i;38571:318::-;;;;;;;;;;-1:-1:-1;38571:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5539:32:1;;;5521:51;;5603:2;5588:18;;5581:34;;;;5631:18;;;5624:34;;;;5689:2;5674:18;;5667:34;;;;5732:3;5717:19;;5710:35;5559:3;5761:19;;5754:35;5820:3;5805:19;;5798:35;5864:3;5849:19;;5842:35;5508:3;5493:19;38571:318:0;5182:701:1;25810:41:0;;;;;;;;;;;;;;;;26102:58;;;;;;;;;;-1:-1:-1;26102:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25742:27;;;;;;;;;;;;;;;;48883:236;;;;;;;;;;;;;:::i;31977:298::-;;;;;;;;;;-1:-1:-1;31977:298:0;;;;;:::i;:::-;;:::i;50968:186::-;;;;;;;;;;-1:-1:-1;50968:186:0;;;;;:::i;:::-;;:::i;36771:220::-;;;;;;;;;;;;;:::i;32591:304::-;;;;;;;;;;-1:-1:-1;32591:304:0;;;;;:::i;:::-;;:::i;25776:28::-;;;;;;;;;;;;;;;;34522:113;;;;;;;;;;;;;:::i;14707:151::-;;;;;;;;;;-1:-1:-1;14707:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;14823:18:0;;;14796:7;14823:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14707:151;37551:196;;;;;;;;;;-1:-1:-1;37551:196:0;;;;;:::i;:::-;;:::i;25151:33::-;;;;;;;;;;;;;;;;36013:371;;;;;;;;;;-1:-1:-1;36013:371:0;;;;;:::i;:::-;;:::i;39491:126::-;;;;;;;;;;;;;:::i;37415:124::-;;;;;;;;;;-1:-1:-1;37415:124:0;;;;;:::i;:::-;;:::i;38894:325::-;;;;;;;;;;-1:-1:-1;38894:325:0;;;;;:::i;:::-;;:::i;32287:296::-;;;;;;;;;;-1:-1:-1;32287:296:0;;;;;:::i;:::-;;:::i;11528:244::-;;;;;;;;;;-1:-1:-1;11528:244:0;;;;;:::i;:::-;;:::i;39923:504::-;;;;;;;;;;-1:-1:-1;39923:504:0;;;;;:::i;:::-;;:::i;38157:116::-;;;;;;;;;;-1:-1:-1;38157:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;38242:23:0;38218:4;38242:23;;;:14;:23;;;;;;;;;38157:116;49393:263;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;;;;;;;;;49451:25:::1;49465:2;49468::::0;49471::::1;49474:1;49451:13;:25::i;:::-;49487:23;49502:1;49504;49506;49508;49487:14;:23::i;:::-;49523:27;49539:10;49523:15;:27::i;:::-;49561:40;49578:10;49590::::0;49561:16:::1;:40::i;:::-;49608:7;:14:::0;;-1:-1:-1;;;;49633:15:0;-1:-1:-1;;;49633:15:0;;;49393:263::o;13972:91::-;14017:13;14050:5;14043:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13972:91;:::o;51166:233::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;51318:30:::1;::::0;-1:-1:-1;;;51318:30:0;;51342:4:::1;51318:30;::::0;::::1;2011:51:1::0;51283:5:0;;51263:11:::1;::::0;-1:-1:-1;;;;;51318:15:0;::::1;::::0;::::1;::::0;1984:18:1;;51318:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51359:32;::::0;-1:-1:-1;;;51359:32:0;;-1:-1:-1;;;;;8098:32:1;;;51359::0::1;::::0;::::1;8080:51:1::0;8147:18;;;8140:34;;;51300:48:0;;-1:-1:-1;51359:14:0;;::::1;::::0;::::1;::::0;8053:18:1;;51359:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51252:147;;51166:233:::0;;:::o;14866:169::-;14949:4;14966:39;955:10;14989:7;14998:6;14966:8;:39::i;:::-;-1:-1:-1;15023:4:0;14866:169;;;;;:::o;50401:119::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;50489:23:::1;:12:::0;50505:6:::1;50489:23;:::i;:::-;50476:10;:36:::0;-1:-1:-1;50401:119:0:o;15043:321::-;15149:4;15166:36;15176:6;15184:9;15195:6;15166:9;:36::i;:::-;15213:121;15222:6;955:10;15244:89;15282:6;15244:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15244:19:0;;;;;;:11;:19;;;;;;;;955:10;15244:33;;;;;;;;;;:37;:89::i;:::-;15213:8;:121::i;:::-;-1:-1:-1;15352:4:0;15043:321;;;;;:::o;49128:257::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;49182:22:::1;49196:1;49198::::0;49200::::1;49202;49182:13;:22::i;:::-;49215:24;49230:1;49232::::0;49234:2:::1;49237:1;49215:14;:24::i;:::-;49252:27;49268:10;49252:15;:27::i;:::-;49290:40;49307:10;49319::::0;50528:174;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;50631:20:::1;:9:::0;50644:6:::1;50631:20;:::i;:::-;50621:7;:30:::0;50673:21:::1;:10:::0;50687:6:::1;50673:21;:::i;:::-;50662:8;:32:::0;-1:-1:-1;;50528:174:0:o;34643:158::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;34736:57:::1;34758:34;34777:15;34758:18:::0;:34:::1;:::i;:::-;34736:21;:57::i;:::-;34643:158:::0;:::o;39772:143::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;39839:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;39839:18:0::1;-1:-1:-1::0;;;;39839:18:0;;::::1;;::::0;;39883:24:::1;::::0;::::1;::::0;::::1;::::0;39849:8;1812:14:1;1805:22;1787:41;;1775:2;1760:18;;1647:187;39883:24:0::1;;;;;;;;39772:143:::0;:::o;37871:141::-;37961:15;;:43;;;-1:-1:-1;;;37961:43:0;;;;37934:7;;-1:-1:-1;;;;;37961:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37954:50;;37871:141;:::o;30173:147::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;30253:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;30253:57:0;;-1:-1:-1;;;;;2029:32:1;;;30253:57:0::1;::::0;::::1;2011:51:1::0;30253:15:0;;::::1;::::0;:36:::1;::::0;1984:18:1;;30253:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;50028:365:::0;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;50180:39:::1;::::0;;::::1;:17;:39:::0;50230;;::::1;:17;:39:::0;50280:35;;::::1;:15;:35:::0;50326:27;::::1;:11;:27:::0;50374:11:::1;:9;:11::i;:::-;50028:365:::0;;;;:::o;15372:218::-;955:10;15460:4;15509:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15509:34:0;;;;;;;;;;15460:4;;15477:83;;15500:7;;15509:50;;15548:10;15509:38;:50::i;35102:903::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;35247:20:::1;;35228:15;:39;;35220:68;;;::::0;-1:-1:-1;;;35220:68:0;;9075:2:1;35220:68:0::1;::::0;::::1;9057:21:1::0;9114:2;9094:18;;;9087:30;-1:-1:-1;;;9133:18:1;;;9126:46;9189:18;;35220:68:0::1;8873:340:1::0;35220:68:0::1;35332:22;::::0;35383:39:::1;::::0;-1:-1:-1;;;35383:39:0;;35416:4:::1;35383:39;::::0;::::1;2011:51:1::0;-1:-1:-1;;;;;35332:22:0;;::::1;::::0;35301:21:::1;::::0;35332:22;;35383:24:::1;::::0;1984:18:1;;35383:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35436:25;::::0;35366:56;;-1:-1:-1;35436:25:0::1;;35433:565;;;35508:27;26025:6;35508:15;:27;:::i;:::-;35487:20;:48:::0;35673:2:::1;35664:8;:6:::0;35671:1:::1;35664:8;:::i;:::-;:11;;;;:::i;:::-;35714:15;::::0;35690:48:::1;::::0;-1:-1:-1;;;35690:48:0;;-1:-1:-1;;;;;35714:15:0;;::::1;35690:48;::::0;::::1;8080:51:1::0;8147:18;;;8140:34;;;35657:18:0;;-1:-1:-1;35690:23:0;::::1;::::0;::::1;::::0;8053:18:1;;35690:48:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35151:854;;35102:903::o:0;35433:565::-:1;35962:15;::::0;35938:48:::1;::::0;-1:-1:-1;;;35938:48:0;;-1:-1:-1;;;;;35962:15:0;;::::1;35938:48;::::0;::::1;8080:51:1::0;8147:18;;;8140:34;;;35938:23:0;;::::1;::::0;::::1;::::0;8053:18:1;;35938:48:0::1;7906:274:1::0;35433:565:0::1;35151:854;;35102:903::o:0;33693:205::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;33787:22:::1;:44:::0;;-1:-1:-1;;;;;;33787:44:0::1;-1:-1:-1::0;;;;;33787:44:0;::::1;;::::0;;33863:27:::1;26025:6;33863:15;:27;:::i;:::-;33842:20;:48:::0;-1:-1:-1;33693:205:0:o;40435:143::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;40502:7:::1;:18:::0;;;::::1;;-1:-1:-1::0;;;40502:18:0::1;-1:-1:-1::0;;;;40502:18:0;;::::1;;::::0;;40546:24:::1;::::0;::::1;::::0;::::1;::::0;40512:8;1812:14:1;1805:22;1787:41;;1775:2;1760:18;;1647:187;39625:141:0;39717:15;;:41;;;-1:-1:-1;;;39717:41:0;;;;39690:7;;-1:-1:-1;;;;;39717:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;31654:315;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;31763:15:::1;::::0;-1:-1:-1;;;;;31741:38:0;;::::1;31763:15:::0;::::1;31741:38;;31733:94;;;;-1:-1:-1::0;;;31733:94:0::1;;;;;;;:::i;:::-;31885:15;::::0;31843:59:::1;::::0;-1:-1:-1;;;;;31885:15:0;;::::1;::::0;31843:59;::::1;::::0;::::1;::::0;31885:15:::1;::::0;31843:59:::1;31913:15;:48:::0;;-1:-1:-1;;;;;;31913:48:0::1;-1:-1:-1::0;;;;;31913:48:0;;;::::1;::::0;;;::::1;::::0;;31654:315::o;38433:130::-;38524:15;;:34;;-1:-1:-1;;;38524:34:0;;-1:-1:-1;;;;;2029:32:1;;;38524:34:0;;;2011:51:1;38503:7:0;;38524:15;;:25;;1984:18:1;;38524:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49668:352::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;49815:37:::1;::::0;;::::1;:16;:37:::0;49863;;::::1;:16;:37:::0;49911:33;;::::1;:14;:33:::0;49955:25;::::1;:10;:25:::0;50001:11:::1;:9;:11::i;39224:259::-:0;39350:15;;:28;;-1:-1:-1;;;;;;39350:28:0;;;;;762:25:1;;;39284:18:0;;;;;;-1:-1:-1;;;;;39350:15:0;;:23;;735:18:1;;39350:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39388:87;;;10394:25:1;;;10450:2;10435:18;;10428:34;;;10478:18;;;10471:34;;;10536:2;10521:18;;10514:34;;;39283:95:0;;-1:-1:-1;39283:95:0;;-1:-1:-1;39283:95:0;-1:-1:-1;39465:9:0;;39453:5;;39388:87;;10381:3:1;10366:19;39388:87:0;;;;;;;39278:205;;;39224:259;:::o;14389:127::-;-1:-1:-1;;;;;14490:18:0;14463:7;14490:18;;;;;;;;;;;;14389:127::o;11372:148::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;11463:6:::1;::::0;11442:40:::1;::::0;11479:1:::1;::::0;11463:6:::1;::::0;::::1;-1:-1:-1::0;;;;;11463:6:0::1;::::0;11442:40:::1;::::0;11479:1;;11442:40:::1;11493:6;:19:::0;;-1:-1:-1;;;;;;11493:19:0::1;::::0;;11372:148::o;36999:408::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;37097:6:::1;37085:8;:18;;:40;;;;;37119:6;37107:8;:18;;37085:40;37077:113;;;::::0;-1:-1:-1;;;37077:113:0;;10761:2:1;37077:113:0::1;::::0;::::1;10743:21:1::0;10800:2;10780:18;;;10773:30;10839:34;10819:18;;;10812:62;10910:30;10890:18;;;10883:58;10958:19;;37077:113:0::1;10559:424:1::0;37077:113:0::1;37221:16;;37209:8;:28;;37201:93;;;::::0;-1:-1:-1;;;37201:93:0;;11190:2:1;37201:93:0::1;::::0;::::1;11172:21:1::0;11229:2;11209:18;;;11202:30;11268:34;11248:18;;;11241:62;-1:-1:-1;;;11319:18:1;;;11312:50;11379:19;;37201:93:0::1;10988:416:1::0;37201:93:0::1;37344:16;::::0;37310:51:::1;::::0;37334:8;;37310:51:::1;::::0;;;::::1;37372:16;:27:::0;36999:408::o;30497:781::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;30606:15:::1;::::0;-1:-1:-1;;;;;30584:38:0;;::::1;30606:15:::0;::::1;30584:38;;30576:104;;;::::0;-1:-1:-1;;;30576:104:0;;11611:2:1;30576:104:0::1;::::0;::::1;11593:21:1::0;11650:2;11630:18;;;11623:30;11689:34;11669:18;;;11662:62;-1:-1:-1;;;11740:18:1;;;11733:51;11801:19;;30576:104:0::1;11409:417:1::0;30576:104:0::1;30693:40;30766:10;30693:85;;30837:4;-1:-1:-1::0;;;;;30799:43:0::1;:18;-1:-1:-1::0;;;;;30799:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30799:43:0::1;;30791:131;;;::::0;-1:-1:-1;;;30791:131:0;;12289:2:1;30791:131:0::1;::::0;::::1;12271:21:1::0;12328:2;12308:18;;;12301:30;12367:34;12347:18;;;12340:62;12438:34;12418:18;;;12411:62;-1:-1:-1;;;12489:19:1;;;12482:42;12541:19;;30791:131:0::1;12087:479:1::0;30791:131:0::1;30935:68;::::0;-1:-1:-1;;;30935:68:0;;-1:-1:-1;;;;;30935:39:0;::::1;:68;::::0;::::1;2011:51:1::0;;;30935:39:0;::::1;::::0;1984:18:1;;30935:68:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31014:54:0::1;::::0;-1:-1:-1;;;31014:54:0;;31062:4:::1;31014:54;::::0;::::1;2011:51:1::0;-1:-1:-1;;;;;31014:39:0;::::1;::::0;-1:-1:-1;31014:39:0::1;::::0;-1:-1:-1;1984:18:1;;31014:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31127:15:0::1;::::0;31079:65:::1;::::0;-1:-1:-1;;;31079:65:0;;-1:-1:-1;;;;;31127:15:0;;::::1;31079:65;::::0;::::1;2011:51:1::0;31079:39:0;;::::1;::::0;-1:-1:-1;31079:39:0::1;::::0;-1:-1:-1;1984:18:1;;31079:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31204:15:0::1;::::0;31162:59:::1;::::0;-1:-1:-1;;;;;31204:15:0;;::::1;::::0;-1:-1:-1;31162:59:0;;::::1;::::0;-1:-1:-1;31162:59:0::1;::::0;31204:15:::1;::::0;31162:59:::1;31234:15;:36:::0;;-1:-1:-1;;;;;;31234:36:0::1;-1:-1:-1::0;;;;;31234:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;30497:781:0:o;31286:356::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;31393:14:::1;::::0;-1:-1:-1;;;;;31371:37:0;;::::1;31393:14:::0;::::1;31371:37;;31363:93;;;;-1:-1:-1::0;;;31363:93:0::1;;;;;;;:::i;:::-;31513:14;::::0;31472:57:::1;::::0;-1:-1:-1;;;;;31513:14:0;;::::1;::::0;31472:57;::::1;::::0;::::1;::::0;31513:14:::1;::::0;31472:57:::1;31540:14;:36:::0;;-1:-1:-1;;;;;;31540:36:0::1;-1:-1:-1::0;;;;;31540:36:0;;::::1;::::0;;::::1;::::0;;;31587:15:::1;::::0;:47:::1;::::0;-1:-1:-1;;;31587:47:0;;::::1;::::0;::::1;2011:51:1::0;;;;31587:15:0;;::::1;::::0;:35:::1;::::0;1984:18:1;;31587:47:0::1;1839:229:1::0;14071:95:0;14118:13;14151:7;14144:14;;;;;:::i;51411:202::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;51469:15:::1;51487:24;51505:4;51487:9;:24::i;:::-;51469:42;;51522:83;51546:4;51553:42;51597:7;51522:15;:83::i;32903:264::-:0;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;33010:13:::1;-1:-1:-1::0;;;;;33002:21:0::1;:4;-1:-1:-1::0;;;;;33002:21:0::1;;;32994:111;;;::::0;-1:-1:-1;;;32994:111:0;;12773:2:1;32994:111:0::1;::::0;::::1;12755:21:1::0;12812:2;12792:18;;;12785:30;12851:34;12831:18;;;12824:62;12922:34;12902:18;;;12895:62;-1:-1:-1;;;12973:19:1;;;12966:44;13027:19;;32994:111:0::1;12571:481:1::0;32994:111:0::1;33118:41;33147:4;33153:5;33118:28;:41::i;37755:108::-:0;37828:15;;:27;;;-1:-1:-1;;;37828:27:0;;;;37801:7;;-1:-1:-1;;;;;37828:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;15598:269;15691:4;15708:129;955:10;15731:7;15740:96;15779:15;15740:96;;;;;;;;;;;;;;;;;955:10;15740:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;15740:34:0;;;;;;;;;;;;:38;:96::i;38281:147::-;38374:15;;:47;;-1:-1:-1;;;38374:47:0;;-1:-1:-1;;;;;2029:32:1;;;38374:47:0;;;2011:51:1;38350:7:0;;38374:15;;:38;;1984:18:1;;38374:47:0;1839:229:1;14524:175:0;14610:4;14627:42;955:10;14651:9;14662:6;14627:9;:42::i;36392:371::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;36509:15:::1;::::0;-1:-1:-1;;;;;36487:37:0;;::::1;36509:15:::0;::::1;36487:37;;36479:102;;;::::0;-1:-1:-1;;;36479:102:0;;13259:2:1;36479:102:0::1;::::0;::::1;13241:21:1::0;13298:2;13278:18;;;13271:30;13337:34;13317:18;;;13310:62;-1:-1:-1;;;13388:18:1;;;13381:50;13448:19;;36479:102:0::1;13057:416:1::0;36479:102:0::1;36592:41;36608:18;36628:4;36592:15;:41::i;:::-;36692:15;::::0;36649:59:::1;::::0;-1:-1:-1;;;;;36692:15:0;;::::1;::::0;36649:59;::::1;::::0;::::1;::::0;36692:15:::1;::::0;36649:59:::1;36719:15;:36:::0;;-1:-1:-1;;;;;;36719:36:0::1;-1:-1:-1::0;;;;;36719:36:0;;;::::1;::::0;;;::::1;::::0;;36392:371::o;30325:164::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;30421:17:::1;:6:::0;30431::::1;30421:17;:::i;:::-;30392:26;:46:::0;30467:17:::1;:6:::0;30477::::1;30467:17;:::i;:::-;30446:18;:38:::0;-1:-1:-1;30325:164:0:o;38571:318::-;38846:15;;:35;;-1:-1:-1;;;38846:35:0;;-1:-1:-1;;;;;2029:32:1;;;38846:35:0;;;2011:51:1;38667:7:0;;;;;;;;;;;;;;;;38846:15;;;:26;;1984:18:1;;38846:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38839:42;;;;;;;;;;;;;;;;38571:318;;;;;;;;;:::o;48883:236::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;48932:22:::1;48946:1;48948::::0;48950::::1;48952::::0;48932:13:::1;:22::i;:::-;48965:23;48980:1;48982::::0;48984::::1;48986::::0;48965:14:::1;:23::i;:::-;48995:7;:15:::0;;-1:-1:-1;;;;48995:15:0::1;::::0;;49023:29:::1;49039:12;49023:15;:29::i;:::-;49063:48;49081:12;49097::::0;49063:16:::1;:48::i;:::-;48883:236::o:0;31977:298::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32070:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;:40;;::::0;::::1;;;;32062:103;;;::::0;-1:-1:-1;;;32062:103:0;;14366:2:1;32062:103:0::1;::::0;::::1;14348:21:1::0;14405:2;14385:18;;;14378:30;14444:34;14424:18;;;14417:62;-1:-1:-1;;;14495:18:1;;;14488:48;14553:19;;32062:103:0::1;14164:414:1::0;32062:103:0::1;-1:-1:-1::0;;;;;32176:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;32176:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32233:34;;1787:41:1;;;32233:34:0::1;::::0;1760:18:1;32233:34:0::1;;;;;;;;31977:298:::0;;:::o;50968:186::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;51045:15:::1;51063:24;51081:4;51063:9;:24::i;:::-;51045:42;;51098:48;51122:4;51129:7;51138;51098:15;:48::i;36771:220::-:0;36836:7;36874:20;;36858:15;:36;36855:110;;;36938:15;36917:20;;:36;;;;:::i;36855:110::-;-1:-1:-1;36982:1:0;;36771:220::o;32591:304::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;32708:9:::1;32704:115;32723:19:::0;;::::1;32704:115;;;32799:8;32764:19;:32;32784:8;;32793:1;32784:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32764:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32764:32:0;:43;;-1:-1:-1;;32764:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32744:3;::::1;::::0;::::1;:::i;:::-;;;;32704:115;;;;32836:51;32868:8;;32878;32836:51;;;;;;;;:::i;:::-;;;;;;;;32591:304:::0;;;:::o;34522:113::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;34597:25:::1;:30:::0;;-1:-1:-1;;34597:30:0::1;34623:4;34597:30;::::0;;34522:113::o;37551:196::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;37661:15:::1;::::0;:78:::1;::::0;-1:-1:-1;;;37661:78:0;;::::1;::::0;::::1;762:25:1::0;;;-1:-1:-1;;;;;37661:15:0;;::::1;::::0;:45:::1;::::0;735:18:1;;37661:78:0::1;616:177:1::0;36013:371:0;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;36130:15:::1;::::0;-1:-1:-1;;;;;36108:37:0;;::::1;36130:15:::0;::::1;36108:37;;36100:102;;;::::0;-1:-1:-1;;;36100:102:0;;15986:2:1;36100:102:0::1;::::0;::::1;15968:21:1::0;16025:2;16005:18;;;15998:30;16064:34;16044:18;;;16037:62;-1:-1:-1;;;16115:18:1;;;16108:50;16175:19;;36100:102:0::1;15784:416:1::0;36100:102:0::1;36213:41;36229:18;36249:4;36213:15;:41::i;:::-;36313:15;::::0;36270:59:::1;::::0;-1:-1:-1;;;;;36313:15:0;;::::1;::::0;36270:59;::::1;::::0;::::1;::::0;36313:15:::1;::::0;36270:59:::1;36340:15;:36:::0;;-1:-1:-1;;;;;;36340:36:0::1;-1:-1:-1::0;;;;;36340:36:0;;;::::1;::::0;;;::::1;::::0;;36013:371::o;39491:126::-;39570:15;;:39;;;-1:-1:-1;;;39570:39:0;;;;39546:7;;-1:-1:-1;;;;;39570:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;37415:124;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;37489:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;37489:42:0;;::::1;::::0;::::1;762:25:1::0;;;-1:-1:-1;;;;;37489:15:0;;::::1;::::0;:31:::1;::::0;735:18:1;;37489:42:0::1;616:177:1::0;38894:325:0;39171:15;;:40;;-1:-1:-1;;;39171:40:0;;;;;762:25:1;;;38995:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39171:15:0;;;;:33;;735:18:1;;39171:40:0;616:177:1;32287:296:0;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32382:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;:38;;::::0;::::1;;;;32374:104;;;::::0;-1:-1:-1;;;32374:104:0;;16407:2:1;32374:104:0::1;::::0;::::1;16389:21:1::0;16446:2;16426:18;;;16419:30;16485:34;16465:18;;;16458:62;-1:-1:-1;;;16536:18:1;;;16529:51;16597:19;;32374:104:0::1;16205:417:1::0;32374:104:0::1;-1:-1:-1::0;;;;;32489:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:37;;-1:-1:-1;;32489:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32544:31;;1787:41:1;;;32544:31:0::1;::::0;1760:18:1;32544:31:0::1;1647:187:1::0;11528:244:0;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11617:22:0;::::1;11609:73;;;::::0;-1:-1:-1;;;11609:73:0;;16829:2:1;11609:73:0::1;::::0;::::1;16811:21:1::0;16868:2;16848:18;;;16841:30;16907:34;16887:18;;;16880:62;-1:-1:-1;;;16958:18:1;;;16951:36;17004:19;;11609:73:0::1;16627:402:1::0;11609:73:0::1;11719:6;::::0;11698:38:::1;::::0;-1:-1:-1;;;;;11698:38:0;;::::1;::::0;11719:6:::1;::::0;::::1;;::::0;11698:38:::1;::::0;;;::::1;11747:6;:17:::0;;-1:-1:-1;;;;;11747:17:0;;::::1;;;-1:-1:-1::0;;;;;;11747:17:0;;::::1;::::0;;;::::1;::::0;;11528:244::o;39923:504::-;11222:6;;-1:-1:-1;;;;;11222:6:0;;;;;955:10;11284:23;11276:68;;;;-1:-1:-1;;;11276:68:0;;;;;;;:::i;:::-;40062:14:::1;40043:15;;:33;;40035:71;;;::::0;-1:-1:-1;;;40035:71:0;;17236:2:1;40035:71:0::1;::::0;::::1;17218:21:1::0;17275:2;17255:18;;;17248:30;17314:27;17294:18;;;17287:55;17359:18;;40035:71:0::1;17034:349:1::0;40035:71:0::1;40145:9;::::0;-1:-1:-1;;;;;40125:29:0;;::::1;40145:9:::0;::::1;40125:29;;40117:72;;;::::0;-1:-1:-1;;;40117:72:0;;17590:2:1;40117:72:0::1;::::0;::::1;17572:21:1::0;17629:2;17609:18;;;17602:30;17668:32;17648:18;;;17641:60;17718:18;;40117:72:0::1;17388:354:1::0;40117:72:0::1;40218:22;:14:::0;40237:2:::1;40218:18;:22::i;:::-;40200:15;:40:::0;;;40270:36:::1;::::0;:15:::1;::::0;:19:::1;:36::i;:::-;40251:16;:55:::0;40317:9:::1;:37:::0;;-1:-1:-1;;;;;;40317:37:0::1;-1:-1:-1::0;;;;;40317:37:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;40382:11:0::1;::::0;;40365:14:::1;:28:::0;-1:-1:-1;40404:15:0;;39923:504::o;18723:179::-;18781:7;;18813:5;18817:1;18813;:5;:::i;:::-;18801:17;;18842:1;18837;:6;;18829:46;;;;-1:-1:-1;;;18829:46:0;;17949:2:1;18829:46:0;;;17931:21:1;17988:2;17968:18;;;17961:30;18027:29;18007:18;;;18000:57;18074:18;;18829:46:0;17747:351:1;18829:46:0;18893:1;18723:179;-1:-1:-1;;;18723:179:0:o;17234:346::-;-1:-1:-1;;;;;17336:19:0;;17328:68;;;;-1:-1:-1;;;17328:68:0;;18305:2:1;17328:68:0;;;18287:21:1;18344:2;18324:18;;;18317:30;18383:34;18363:18;;;18356:62;-1:-1:-1;;;18434:18:1;;;18427:34;18478:19;;17328:68:0;18103:400:1;17328:68:0;-1:-1:-1;;;;;17415:21:0;;17407:68;;;;-1:-1:-1;;;17407:68:0;;18710:2:1;17407:68:0;;;18692:21:1;18749:2;18729:18;;;18722:30;18788:34;18768:18;;;18761:62;-1:-1:-1;;;18839:18:1;;;18832:32;18881:19;;17407:68:0;18508:398:1;17407:68:0;-1:-1:-1;;;;;17488:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17540:32;;762:25:1;;;17540:32:0;;735:18:1;17540:32:0;;;;;;;;17234:346;;;:::o;40887:5896::-;-1:-1:-1;;;;;41019:18:0;;41011:68;;;;-1:-1:-1;;;41011:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41098:16:0;;41090:64;;;;-1:-1:-1;;;41090:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41174:20:0;;;;;;:14;:20;;;;;;;;41173:21;:45;;;;-1:-1:-1;;;;;;41200:18:0;;;;;;:14;:18;;;;;;;;41199:19;41173:45;41165:54;;;;;;11222:6;;-1:-1:-1;;;;;41236:15:0;;;11222:6;;;;;41236:15;;;;:32;;-1:-1:-1;11222:6:0;;-1:-1:-1;;;;;41255:13:0;;;11222:6;;;;;41255:13;;41236:32;:52;;;;-1:-1:-1;;;;;;41272:16:0;;;;41236:52;:77;;;;-1:-1:-1;;;;;;41292:21:0;;41306:6;41292:21;;41236:77;:100;;;;;41323:13;-1:-1:-1;;;;;41317:19:0;:2;-1:-1:-1;;;;;41317:19:0;;;41236:100;:128;;;;-1:-1:-1;;;;;;41341:23:0;;;;;;:19;:23;;;;;;;;41340:24;41236:128;:158;;;;-1:-1:-1;;;;;;41369:25:0;;;;;;:19;:25;;;;;;;;41368:26;41236:158;41232:502;;;41429:7;;-1:-1:-1;;;41429:7:0;;;;:15;;41440:4;41429:15;41421:24;;;;;;41480:7;;41470:6;:17;;41462:70;;;;-1:-1:-1;;;41462:70:0;;19923:2:1;41462:70:0;;;19905:21:1;19962:2;19942:18;;;19935:30;20001:34;19981:18;;;19974:62;-1:-1:-1;;;20052:18:1;;;20045:38;20100:19;;41462:70:0;19721:404:1;41462:70:0;41549:32;41584:13;41594:2;41584:9;:13::i;:::-;41657:10;;41549:48;;-1:-1:-1;41620:33:0;41647:6;41549:48;41620:33;:::i;:::-;:47;;41612:96;;;;-1:-1:-1;;;41612:96:0;;20332:2:1;41612:96:0;;;20314:21:1;20371:2;20351:18;;;20344:30;20410:34;20390:18;;;20383:62;-1:-1:-1;;;20461:18:1;;;20454:34;20505:19;;41612:96:0;20130:400:1;41612:96:0;41406:328;41232:502;41761:11;41758:92;;41789:28;41805:4;41811:2;41815:1;41789:15;:28::i;41758:92::-;41866:8;;-1:-1:-1;;;41866:8:0;;;;41865:9;:42;;;;-1:-1:-1;;;;;;41878:29:0;;;;;;:25;:29;;;;;;;;41865:42;:78;;;;-1:-1:-1;41927:15:0;;-1:-1:-1;;;;;41911:32:0;;;41927:15;;41911:32;;41865:78;:97;;;;-1:-1:-1;11222:6:0;;-1:-1:-1;;;;;41947:15:0;;;11222:6;;;;;41947:15;;41865:97;:114;;;;-1:-1:-1;11222:6:0;;-1:-1:-1;;;;;41966:13:0;;;11222:6;;;;;41966:13;;41865:114;:142;;;;-1:-1:-1;;;;;;41984:23:0;;;;;;:19;:23;;;;;;;;41983:24;41865:142;:172;;;;-1:-1:-1;;;;;;42012:25:0;;;;;;:19;:25;;;;;;;;42011:26;41865:172;41862:343;;;42071:7;;-1:-1:-1;;;42071:7:0;;;;:15;;42082:4;42071:15;42063:24;;;;;;42122:8;;42112:6;:18;;42104:89;;;;-1:-1:-1;;;42104:89:0;;20737:2:1;42104:89:0;;;20719:21:1;20776:2;20756:18;;;20749:30;20815:34;20795:18;;;20788:62;20886:28;20866:18;;;20859:56;20932:19;;42104:89:0;20535:422:1;42104:89:0;42211:28;42242:24;42260:4;42242:9;:24::i;:::-;42318:18;;42211:55;;-1:-1:-1;42294:42:0;;;;;;;42348:20;;-1:-1:-1;42360:8:0;;-1:-1:-1;;;42360:8:0;;;;42359:9;42348:20;:56;;;;-1:-1:-1;;;;;;42373:31:0;;;;;;:25;:31;;;;;;;;42372:32;42348:56;:83;;;;-1:-1:-1;42416:15:0;;-1:-1:-1;;;;;42408:23:0;;;42416:15;;42408:23;;42348:83;:108;;;;-1:-1:-1;42441:15:0;;-1:-1:-1;;;;;42435:21:0;;;42441:15;;42435:21;;42348:108;:135;;;;-1:-1:-1;42468:15:0;;-1:-1:-1;;;;;42460:23:0;;;42468:15;;42460:23;;42348:135;:160;;;;-1:-1:-1;42493:15:0;;-1:-1:-1;;;;;42487:21:0;;;42493:15;;42487:21;;42348:160;:188;;;;-1:-1:-1;;;;;;42513:23:0;;;;;;:19;:23;;;;;;;;42512:24;42348:188;:218;;;;-1:-1:-1;;;;;;42541:25:0;;;;;;:19;:25;;;;;;;;42540:26;42348:218;42345:2792;;;42608:26;;42652:7;;42608:26;;-1:-1:-1;;;;42652:7:0;;;;42649:806;;;42742:26;;42683:56;42742:26;42683:24;42701:4;42683:9;:24::i;:::-;:28;;:56::i;:::-;:85;42680:760;;;42817:26;;42866:89;42890:4;42897:42;42817:26;42866:15;:89::i;:::-;42985:82;;762:25:1;;;43009:42:0;;43002:4;;-1:-1:-1;;;;;;;;;;;42985:82:0;750:2:1;735:18;42985:82:0;;;;;;;42770:317;42680:760;;;43116:21;43140:56;43169:26;;43140:24;43158:4;43140:9;:24::i;:56::-;43116:80;;43219:89;43243:4;43250:42;43294:13;43219:15;:89::i;:::-;43338:82;;762:25:1;;;43362:42:0;;43355:4;;-1:-1:-1;;;;;;;;;;;43338:82:0;750:2:1;735:18;43338:82:0;;;;;;;43093:347;42680:760;43463:18;43487;43508:78;43574:11;;43508:61;43551:17;;43508:38;43530:15;;43508:17;;:21;;:38;;;;:::i;:::-;:42;;:61::i;:78::-;43487:99;;43592:23;43618:59;43666:10;43618:43;43643:17;;43618:20;:24;;:43;;;;:::i;:::-;:47;;:59::i;:::-;43592:85;-1:-1:-1;43683:12:0;43698:22;43592:85;43718:1;43698:19;:22::i;:::-;43683:37;-1:-1:-1;43726:17:0;43746:25;:15;43683:37;43746:19;:25::i;:::-;43800:8;:15;;-1:-1:-1;;;;43800:15:0;-1:-1:-1;;;43800:15:0;;;:8;43848:17;43726:45;;-1:-1:-1;43848:21:0;43844:445;;43901:30;:20;43926:4;43901:24;:30::i;:::-;43888:43;;43946:28;43963:10;43946:16;:28::i;:::-;43989:23;44015:60;44064:10;44015:44;44041:17;;44015:21;:25;;:44;;;;:::i;:60::-;44115:15;;43989:86;;-1:-1:-1;44090:59:0;;-1:-1:-1;;;;;44115:15:0;43989:86;44090:16;:59::i;:::-;44195:15;;44238:17;;-1:-1:-1;;;;;44195:15:0;;;;44188:4;;-1:-1:-1;;;;;;;;;;;44171:102:0;44212:60;;44261:10;;44212:44;;:21;;:25;:44::i;:60::-;44171:102;;762:25:1;;;750:2;735:18;44171:102:0;;;;;;;43871:418;43844:445;44309:11;;:15;44305:294;;44343:22;:20;:22::i;:::-;44380:17;44400:54;44443:10;44400:38;44426:11;;44400:21;:25;;:38;;;;:::i;:54::-;44494:9;;44380:74;;-1:-1:-1;44469:47:0;;-1:-1:-1;;;;;44494:9:0;44380:74;44469:16;:47::i;:::-;44562:9;;44538:45;;762:25:1;;;-1:-1:-1;;;;;44562:9:0;;;;44555:4;;-1:-1:-1;;;;;;;;;;;44538:45:0;750:2:1;735:18;44538:45:0;;;;;;;44326:273;44305:294;44610:17;;:21;44606:300;;44651:18;44672:60;44721:10;44672:44;44698:17;;44672:21;:25;;:44;;;;:::i;:60::-;44651:81;;44794:30;44807:4;44813:10;44794:12;:30::i;:::-;44847:43;;;21164:25:1;;;21220:2;21205:18;;21198:34;;;21248:18;;;21241:34;;;44847:43:0;;21152:2:1;21137:18;44847:43:0;;;;;;;44633:273;44606:300;44920:15;;:19;44916:174;;44952:18;44973:63;45025:10;44973:47;45004:15;;44973:26;;:30;;:47;;;;:::i;:63::-;44952:84;;45051:32;45072:10;45051:20;:32::i;:::-;44941:149;44916:174;-1:-1:-1;;45109:8:0;:16;;-1:-1:-1;;;;45109:16:0;;;-1:-1:-1;;;42345:2792:0;45165:8;;-1:-1:-1;;;;;45274:25:0;;45149:12;45274:25;;;:19;:25;;;;;;45165:8;-1:-1:-1;;;45165:8:0;;;;;45164:9;;45274:25;;:52;;-1:-1:-1;;;;;;45303:23:0;;;;;;:19;:23;;;;;;;;45274:52;45271:99;;;-1:-1:-1;45353:5:0;45271:99;45385:7;45382:659;;;45409:15;45427:33;45456:3;45427:24;45438:12;;45427:6;:10;;:24;;;;:::i;:33::-;45409:51;;45475:16;45494:34;45524:3;45494:25;45505:13;;45494:6;:10;;:25;;;;:::i;:34::-;45475:53;;45578:13;-1:-1:-1;;;;;45572:19:0;:2;-1:-1:-1;;;;;45572:19:0;;45569:459;;;45621:20;:6;45632:8;45621:10;:20::i;:::-;45612:29;;45660:46;45676:4;45690;45697:8;45660:15;:46::i;:::-;45725:33;45741:4;45747:2;45751:6;45725:15;:33::i;:::-;45569:459;;;45877:19;:6;45888:7;45877:10;:19::i;:::-;45868:28;;45915:45;45931:4;45945;45952:7;45915:15;:45::i;:::-;45979:33;45995:4;46001:2;46005:6;45979:15;:33::i;:::-;45394:647;;45382:659;-1:-1:-1;;;;;46141:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;46170:23:0;;;;;;:19;:23;;;;;;;;46141:52;46138:119;;;46210:33;46226:4;46232:2;46236:6;46210:15;:33::i;:::-;46273:15;;-1:-1:-1;;;;;46273:15:0;:26;46308:4;46315:15;46308:4;46315:9;:15::i;:::-;46273:58;;-1:-1:-1;;;;;;46273:58:0;;;;;;;-1:-1:-1;;;;;8098:32:1;;;46273:58:0;;;8080:51:1;8147:18;;;8140:34;8053:18;;46273:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46269:74;46357:15;;-1:-1:-1;;;;;46357:15:0;:26;46392:2;46397:13;46392:2;46397:9;:13::i;:::-;46357:54;;-1:-1:-1;;;;;;46357:54:0;;;;;;;-1:-1:-1;;;;;8098:32:1;;;46357:54:0;;;8080:51:1;8147:18;;;8140:34;8053:18;;46357:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46353:70;46439:8;;-1:-1:-1;;;46439:8:0;;;;46435:341;;46478:16;;46515:15;;:28;;-1:-1:-1;;;;;;46515:28:0;;;;;762:25:1;;;-1:-1:-1;;;;;46515:15:0;;;;:23;;735:18:1;;46515:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;46515:28:0;;;;;;;;-1:-1:-1;;46515:28:0;;;;;;;;;;;;:::i;:::-;;;46511:254;;;;;46641:86;;;10394:25:1;;;10450:2;10435:18;;10428:34;;;10478:18;;;10471:34;;;10536:2;10521:18;;10514:34;;;46717:9:0;;46706:4;;46641:86;;10381:3:1;10366:19;46641:86:0;;;;;;;46544:199;;;46511:254;46449:327;46435:341;41000:5783;;;40887:5896;;;:::o;19624:166::-;19710:7;19746:12;19738:6;;;;19730:29;;;;-1:-1:-1;;;19730:29:0;;;;;;;;:::i;:::-;-1:-1:-1;19777:5:0;19781:1;19777;:5;:::i;:::-;19770:12;19624:166;-1:-1:-1;;;;19624:166:0:o;34807:230::-;34963:20;;34949:13;:34;34941:43;;;;;;34995:20;:34;34807:230::o;50714:242::-;50769:74;50832:10;;50769:58;50810:16;;50769:36;50788:16;;50769:14;;:18;;:36;;;;:::i;:74::-;50754:12;:89;;;;50870:78;50936:11;;50870:61;50913:17;;50870:38;50890:17;;50870:15;;:19;;:38;;;;:::i;:78::-;50854:13;:94;50714:242::o;15875:539::-;-1:-1:-1;;;;;15981:20:0;;15973:70;;;;-1:-1:-1;;;15973:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16062:23:0;;16054:71;;;;-1:-1:-1;;;16054:71:0;;;;;;;:::i;:::-;16218;16240:6;16218:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16218:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;16198:17:0;;;:9;:17;;;;;;;;;;;:91;;;;16323:20;;;;;;;:32;;16348:6;16323:24;:32::i;:::-;-1:-1:-1;;;;;16300:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;16371:35;762:25:1;;;16300:20:0;;16371:35;;;;-1:-1:-1;;;;;;;;;;;16371:35:0;735:18:1;16371:35:0;616:177:1;33175:407:0;-1:-1:-1;;;;;33266:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;33258:117;;;;;-1:-1:-1;;;33258:117:0;;21783:2:1;33258:117:0;;;21765:21:1;21802:18;;;21795:30;;;;21861:34;21841:18;;;21834:62;21932:34;21912:18;;;21905:62;21984:19;;33258:117:0;21581:428:1;33258:117:0;-1:-1:-1;;;;;33386:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33386:39:0;;;;;;;;;;;;33438:79;;33463:15;;:42;;-1:-1:-1;;;33463:42:0;;-1:-1:-1;;;;;2029:32:1;;;33463:42:0;;;2011:51:1;33463:15:0;;;;:36;;1984:18:1;;33463:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33438:79;33534:40;;;;;;-1:-1:-1;;;;;33534:40:0;;;;;;;;33175:407;;:::o;19076:220::-;19134:7;19158:6;19154:20;;-1:-1:-1;19173:1:0;19166:8;;19154:20;19185:9;19197:5;19201:1;19197;:5;:::i;:::-;19185:17;-1:-1:-1;19230:1:0;19221:5;19225:1;19185:17;19221:5;:::i;:::-;:10;19213:56;;;;-1:-1:-1;;;19213:56:0;;22216:2:1;19213:56:0;;;22198:21:1;22255:2;22235:18;;;22228:30;22294:34;22274:18;;;22267:62;-1:-1:-1;;;22345:18:1;;;22338:31;22386:19;;19213:56:0;22014:397:1;18910:158:0;18968:7;19001:1;18996;:6;;18988:49;;;;-1:-1:-1;;;18988:49:0;;22618:2:1;18988:49:0;;;22600:21:1;22657:2;22637:18;;;22630:30;22696:32;22676:18;;;22669:60;22746:18;;18988:49:0;22416:354:1;18988:49:0;19055:5;19059:1;19055;:5;:::i;19304:153::-;19362:7;19394:1;19390;:5;19382:44;;;;-1:-1:-1;;;19382:44:0;;22977:2:1;19382:44:0;;;22959:21:1;23016:2;22996:18;;;22989:30;23055:28;23035:18;;;23028:56;23101:18;;19382:44:0;22775:350:1;19382:44:0;19444:5;19448:1;19444;:5;:::i;46789:591::-;46941:16;;;46955:1;46941:16;;;;;;;;46917:21;;46941:16;;;;;;;;;;-1:-1:-1;46941:16:0;46917:40;;46986:4;46968;46973:1;46968:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46968:23:0;;;:7;;;;;;;;;;:23;;;;47012:15;;:22;;;-1:-1:-1;;;47012:22:0;;;;:15;;;;;:20;;:22;;;;;46968:7;;47012:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47002:4;47007:1;47002:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47002:32:0;;;:7;;;;;;;;;:32;47079:15;;47047:62;;47064:4;;47079:15;47097:11;47047:8;:62::i;:::-;47148:15;;:224;;-1:-1:-1;;;47148:224:0;;-1:-1:-1;;;;;47148:15:0;;;;:66;;:224;;47229:11;;47148:15;;47299:4;;47326;;47346:15;;47148:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51619:122;51707:26;;-1:-1:-1;;;;;51707:18:0;;;:26;;;;;51726:6;;51707:26;;;;51726:6;51707:18;:26;;;;;;;;;;;;;;;;;;;40586:293;40660:16;;40641:15;:35;40638:217;;40586:293::o;40638:217::-;40730:10;;40717:9;;-1:-1:-1;;;;;40717:9:0;;;40730:10;;40717:23;40713:142;;40769:10;;40757:9;:22;;-1:-1:-1;;;;;;40757:22:0;-1:-1:-1;;;;;40769:10:0;;;40757:22;;;;;;40808:14;;40794:11;:28;40586:293::o;47981:520::-;48163:15;;48131:62;;48148:4;;-1:-1:-1;;;;;48163:15:0;48181:11;48131:8;:62::i;:::-;48235:15;;:258;;-1:-1:-1;;;48235:258:0;;48307:4;48235:258;;;24656:34:1;;;24706:18;;;24699:34;;;48235:15:0;24749:18:1;;;24742:34;;;24792:18;;;24785:34;24835:19;;;24828:44;48467:15:0;24888:19:1;;;24881:35;-1:-1:-1;;;;;48235:15:0;;;;:31;;48274:9;;24590:19:1;;48235:258:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48509:366::-;48574:32;48600:4;48574:17;:32::i;:::-;48644:14;;48637:47;;-1:-1:-1;;;48637:47:0;;48678:4;48637:47;;;2011:51:1;48617:17:0;;-1:-1:-1;;;;;48644:14:0;;48637:32;;1984:18:1;;48637:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48717:14;;48750:15;;48710:68;;-1:-1:-1;;;48710:68:0;;-1:-1:-1;;;;;48750:15:0;;;48710:68;;;8080:51:1;8147:18;;;8140:34;;;48617:67:0;;-1:-1:-1;48695:12:0;;48717:14;;;48710:31;;8053:18:1;;48710:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48695:83;;48795:7;48791:77;;;48824:32;;;25101:25:1;;;25157:2;25142:18;;25135:34;;;48824:32:0;;25074:18:1;48824:32:0;24927:248:1;47388:585:0;47541:16;;;47555:1;47541:16;;;;;;;;47517:21;;47541:16;;;;;;;;-1:-1:-1;;47578:15:0;;:22;;;-1:-1:-1;;;47578:22:0;;;;47517:40;;-1:-1:-1;;;;;;47578:15:0;;;;:20;;-1:-1:-1;47578:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47568:4;47573:1;47568:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47568:32:0;;;:7;;;;;;;;;:32;47621:14;;47611:7;;47621:14;;;47611:4;;47621:14;;47611:7;;;;;;:::i;:::-;-1:-1:-1;;;;;47611:24:0;;;:7;;;;;;;;;:24;47680:15;;47648:72;;47665:4;;47680:15;47698:21;47648:8;:72::i;:::-;47759:15;;-1:-1:-1;;;;;47759:15:0;:66;47833:21;47759:15;47887:4;47906:9;47930:24;:15;47950:3;47930:19;:24::i;:::-;47759:206;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:597:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;798:131::-;-1:-1:-1;;;;;873:31:1;;863:42;;853:70;;919:1;916;909:12;934:388;1002:6;1010;1063:2;1051:9;1042:7;1038:23;1034:32;1031:52;;;1079:1;1076;1069:12;1031:52;1118:9;1105:23;1137:31;1162:5;1137:31;:::i;:::-;1187:5;-1:-1:-1;1244:2:1;1229:18;;1216:32;1257:33;1216:32;1257:33;:::i;:::-;1309:7;1299:17;;;934:388;;;;;:::o;1327:315::-;1395:6;1403;1456:2;1444:9;1435:7;1431:23;1427:32;1424:52;;;1472:1;1469;1462:12;1424:52;1511:9;1498:23;1530:31;1555:5;1530:31;:::i;:::-;1580:5;1632:2;1617:18;;;;1604:32;;-1:-1:-1;;;1327:315:1:o;2073:180::-;2132:6;2185:2;2173:9;2164:7;2160:23;2156:32;2153:52;;;2201:1;2198;2191:12;2153:52;-1:-1:-1;2224:23:1;;2073:180;-1:-1:-1;2073:180:1:o;2258:247::-;2317:6;2370:2;2358:9;2349:7;2345:23;2341:32;2338:52;;;2386:1;2383;2376:12;2338:52;2425:9;2412:23;2444:31;2469:5;2444:31;:::i;2510:456::-;2587:6;2595;2603;2656:2;2644:9;2635:7;2631:23;2627:32;2624:52;;;2672:1;2669;2662:12;2624:52;2711:9;2698:23;2730:31;2755:5;2730:31;:::i;:::-;2780:5;-1:-1:-1;2837:2:1;2822:18;;2809:32;2850:33;2809:32;2850:33;:::i;:::-;2510:456;;2902:7;;-1:-1:-1;;;2956:2:1;2941:18;;;;2928:32;;2510:456::o;2971:248::-;3039:6;3047;3100:2;3088:9;3079:7;3075:23;3071:32;3068:52;;;3116:1;3113;3106:12;3068:52;-1:-1:-1;;3139:23:1;;;3209:2;3194:18;;;3181:32;;-1:-1:-1;2971:248:1:o;3470:118::-;3556:5;3549:13;3542:21;3535:5;3532:32;3522:60;;3578:1;3575;3568:12;3593:241;3649:6;3702:2;3690:9;3681:7;3677:23;3673:32;3670:52;;;3718:1;3715;3708:12;3670:52;3757:9;3744:23;3776:28;3798:5;3776:28;:::i;4028:156::-;4094:20;;4154:4;4143:16;;4133:27;;4123:55;;4174:1;4171;4164:12;4123:55;4028:156;;;:::o;4189:393::-;4267:6;4275;4283;4291;4344:3;4332:9;4323:7;4319:23;4315:33;4312:53;;;4361:1;4358;4351:12;4312:53;4384:27;4401:9;4384:27;:::i;:::-;4374:37;;4430:36;4462:2;4451:9;4447:18;4430:36;:::i;:::-;4420:46;;4485:36;4517:2;4506:9;4502:18;4485:36;:::i;:::-;4475:46;;4540:36;4572:2;4561:9;4557:18;4540:36;:::i;:::-;4530:46;;4189:393;;;;;;;:::o;4795:382::-;4860:6;4868;4921:2;4909:9;4900:7;4896:23;4892:32;4889:52;;;4937:1;4934;4927:12;4889:52;4976:9;4963:23;4995:31;5020:5;4995:31;:::i;:::-;5045:5;-1:-1:-1;5102:2:1;5087:18;;5074:32;5115:30;5074:32;5115:30;:::i;5888:750::-;5980:6;5988;5996;6049:2;6037:9;6028:7;6024:23;6020:32;6017:52;;;6065:1;6062;6055:12;6017:52;6105:9;6092:23;6134:18;6175:2;6167:6;6164:14;6161:34;;;6191:1;6188;6181:12;6161:34;6229:6;6218:9;6214:22;6204:32;;6274:7;6267:4;6263:2;6259:13;6255:27;6245:55;;6296:1;6293;6286:12;6245:55;6336:2;6323:16;6362:2;6354:6;6351:14;6348:34;;;6378:1;6375;6368:12;6348:34;6433:7;6426:4;6416:6;6413:1;6409:14;6405:2;6401:23;6397:34;6394:47;6391:67;;;6454:1;6451;6444:12;6391:67;6485:4;6477:13;;;;-1:-1:-1;6509:6:1;-1:-1:-1;;6550:20:1;;6537:34;6580:28;6537:34;6580:28;:::i;:::-;6627:5;6617:15;;;5888:750;;;;;:::o;6643:323::-;6719:6;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6832:9;6819:23;6809:33;;6892:2;6881:9;6877:18;6864:32;6905:31;6930:5;6905:31;:::i;6971:356::-;7173:2;7155:21;;;7192:18;;;7185:30;7251:34;7246:2;7231:18;;7224:62;7318:2;7303:18;;6971:356::o;7332:380::-;7411:1;7407:12;;;;7454;;;7475:61;;7529:4;7521:6;7517:17;7507:27;;7475:61;7582:2;7574:6;7571:14;7551:18;7548:38;7545:161;;;7628:10;7623:3;7619:20;7616:1;7609:31;7663:4;7660:1;7653:15;7691:4;7688:1;7681:15;7545:161;;7332:380;;;:::o;7717:184::-;7787:6;7840:2;7828:9;7819:7;7815:23;7811:32;7808:52;;;7856:1;7853;7846:12;7808:52;-1:-1:-1;7879:16:1;;7717:184;-1:-1:-1;7717:184:1:o;8185:245::-;8252:6;8305:2;8293:9;8284:7;8280:23;8276:32;8273:52;;;8321:1;8318;8311:12;8273:52;8353:9;8347:16;8372:28;8394:5;8372:28;:::i;8435:127::-;8496:10;8491:3;8487:20;8484:1;8477:31;8527:4;8524:1;8517:15;8551:4;8548:1;8541:15;8567:168;8607:7;8673:1;8669;8665:6;8661:14;8658:1;8655:21;8650:1;8643:9;8636:17;8632:45;8629:71;;;8680:18;;:::i;:::-;-1:-1:-1;8720:9:1;;8567:168::o;8740:128::-;8780:3;8811:1;8807:6;8804:1;8801:13;8798:39;;;8817:18;;:::i;:::-;-1:-1:-1;8853:9:1;;8740:128::o;9218:217::-;9258:1;9284;9274:132;;9328:10;9323:3;9319:20;9316:1;9309:31;9363:4;9360:1;9353:15;9391:4;9388:1;9381:15;9274:132;-1:-1:-1;9420:9:1;;9218:217::o;9440:407::-;9642:2;9624:21;;;9681:2;9661:18;;;9654:30;9720:34;9715:2;9700:18;;9693:62;-1:-1:-1;;;9786:2:1;9771:18;;9764:41;9837:3;9822:19;;9440:407::o;9852:306::-;9940:6;9948;9956;10009:2;9997:9;9988:7;9984:23;9980:32;9977:52;;;10025:1;10022;10015:12;9977:52;10054:9;10048:16;10038:26;;10104:2;10093:9;10089:18;10083:25;10073:35;;10148:2;10137:9;10133:18;10127:25;10117:35;;9852:306;;;;;:::o;11831:251::-;11901:6;11954:2;11942:9;11933:7;11929:23;11925:32;11922:52;;;11970:1;11967;11960:12;11922:52;12002:9;11996:16;12021:31;12046:5;12021:31;:::i;13478:681::-;13609:6;13617;13625;13633;13641;13649;13657;13665;13718:3;13706:9;13697:7;13693:23;13689:33;13686:53;;;13735:1;13732;13725:12;13686:53;13767:9;13761:16;13786:31;13811:5;13786:31;:::i;:::-;13836:5;13826:15;;;13881:2;13870:9;13866:18;13860:25;13850:35;;13925:2;13914:9;13910:18;13904:25;13894:35;;13969:2;13958:9;13954:18;13948:25;13938:35;;14013:3;14002:9;13998:19;13992:26;13982:36;;14058:3;14047:9;14043:19;14037:26;14027:36;;14103:3;14092:9;14088:19;14082:26;14072:36;;14148:3;14137:9;14133:19;14127:26;14117:36;;13478:681;;;;;;;;;;;:::o;14583:125::-;14623:4;14651:1;14648;14645:8;14642:34;;;14656:18;;:::i;:::-;-1:-1:-1;14693:9:1;;14583:125::o;14713:127::-;14774:10;14769:3;14765:20;14762:1;14755:31;14805:4;14802:1;14795:15;14829:4;14826:1;14819:15;14845:135;14884:3;-1:-1:-1;;14905:17:1;;14902:43;;;14925:18;;:::i;:::-;-1:-1:-1;14972:1:1;14961:13;;14845:135::o;14985:794::-;15207:2;15219:21;;;15192:18;;15275:22;;;15159:4;15354:6;15328:2;15313:18;;15159:4;15388:304;15402:6;15399:1;15396:13;15388:304;;;15477:6;15464:20;15497:31;15522:5;15497:31;:::i;:::-;-1:-1:-1;;;;;15553:31:1;15541:44;;15608:4;15667:15;;;;15632:12;;;;15581:1;15417:9;15388:304;;;15392:3;15709;15701:11;;;;15764:6;15757:14;15750:22;15743:4;15732:9;15728:20;15721:52;14985:794;;;;;;:::o;18911:401::-;19113:2;19095:21;;;19152:2;19132:18;;;19125:30;19191:34;19186:2;19171:18;;19164:62;-1:-1:-1;;;19257:2:1;19242:18;;19235:35;19302:3;19287:19;;18911:401::o;19317:399::-;19519:2;19501:21;;;19558:2;19538:18;;;19531:30;19597:34;19592:2;19577:18;;19570:62;-1:-1:-1;;;19663:2:1;19648:18;;19641:33;19706:3;19691:19;;19317:399::o;23262:461::-;23315:3;23353:5;23347:12;23380:6;23375:3;23368:19;23406:4;23435:2;23430:3;23426:12;23419:19;;23472:2;23465:5;23461:14;23493:1;23503:195;23517:6;23514:1;23511:13;23503:195;;;23582:13;;-1:-1:-1;;;;;23578:39:1;23566:52;;23638:12;;;;23673:15;;;;23614:1;23532:9;23503:195;;;-1:-1:-1;23714:3:1;;23262:461;-1:-1:-1;;;;;23262:461:1:o;23728:582::-;24027:6;24016:9;24009:25;24070:6;24065:2;24054:9;24050:18;24043:34;24113:3;24108:2;24097:9;24093:18;24086:31;23990:4;24134:57;24186:3;24175:9;24171:19;24163:6;24134:57;:::i;:::-;-1:-1:-1;;;;;24227:32:1;;;;24222:2;24207:18;;24200:60;-1:-1:-1;24291:3:1;24276:19;24269:35;24126:65;23728:582;-1:-1:-1;;;23728:582:1:o;25180:510::-;25451:6;25440:9;25433:25;25494:3;25489:2;25478:9;25474:18;25467:31;25414:4;25515:57;25567:3;25556:9;25552:19;25544:6;25515:57;:::i;:::-;-1:-1:-1;;;;;25608:32:1;;;;25603:2;25588:18;;25581:60;-1:-1:-1;25672:2:1;25657:18;25650:34;25507:65;25180:510;-1:-1:-1;;25180:510:1:o

Swarm Source

ipfs://2e5869ed84cfcc3ec5ea716557f2ee23ddbea2e3fd37d214a76ff30d79e5e7ae
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.