ETH Price: $3,271.04 (+0.83%)

Token

Moonbase (MNBASE)
 

Overview

Max Total Supply

691,000,000 MNBASE

Holders

18

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1.9 MNBASE

Value
$0.00
0x4ece21673af376fbbf6cef6df681050b540d800a
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:
Moonbase

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

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


/*
      ___           ___           ___           ___           ___           ___           ___           ___     
     /\__\         /\  \         /\  \         /\__\         /\  \         /\  \         /\  \         /\  \    
    /::|  |       /::\  \       /::\  \       /::|  |       /::\  \       /::\  \       /::\  \       /::\  \   
   /:|:|  |      /:/\:\  \     /:/\:\  \     /:|:|  |      /:/\:\  \     /:/\:\  \     /:/\ \  \     /:/\:\  \  
  /:/|:|__|__   /:/  \:\  \   /:/  \:\  \   /:/|:|  |__   /::\~\:\__\   /::\~\:\  \   _\:\~\ \  \   /::\~\:\  \ 
 /:/ |::::\__\ /:/__/ \:\__\ /:/__/ \:\__\ /:/ |:| /\__\ /:/\:\ \:|__| /:/\:\ \:\__\ /\ \:\ \ \__\ /:/\:\ \:\__\
 \/__/~~/:/  / \:\  \ /:/  / \:\  \ /:/  / \/__|:|/:/  / \:\~\:\/:/  / \/__\:\/:/  / \:\ \:\ \/__/ \:\~\:\ \/__/
       /:/  /   \:\  /:/  /   \:\  /:/  /      |:/:/  /   \:\ \::/  /       \::/  /   \:\ \:\__\    \:\ \:\__\  
      /:/  /     \:\/:/  /     \:\/:/  /       |::/  /     \:\/:/  /        /:/  /     \:\/:/  /     \:\ \/__/  
     /:/  /       \::/  /       \::/  /        /:/  /       \::/__/        /:/  /       \::/  /       \:\__\    
     \/__/         \/__/         \/__/         \/__/         ~~            \/__/         \/__/         \/__/     
*/

pragma solidity 0.8.15;

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;
    }
}
 
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 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);
}
 
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 = 9;
    }
 
    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 9;
    }
 
    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 { }
}
 
 
interface IDividendPayingToken {
  function dividendOf(address _owner) external view returns(uint256);
 
  function withdrawDividend() external;
 
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );
 
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );
}
 
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);
}
 
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 dividendToken;
 
 
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
  mapping(address => bool) internal _isAuth;
 
  uint256 public totalDividendsDistributed;
 
  modifier onlyAuth() {
    require(_isAuth[msg.sender], "Auth: caller is not the authorized");
    _;
  }
 
  constructor(string memory _name, string memory _symbol, address _token) ERC20(_name, _symbol) {
    dividendToken = _token;
    _isAuth[msg.sender] = true;
  }
 
  function setAuth(address account) external onlyOwner{
      _isAuth[account] = true;
  }
 
 
  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 {
    _withdrawDividendOfUser(payable(msg.sender));
  }
 
  function setDividendTokenAddress(address newToken) external virtual onlyOwner{
      dividendToken = newToken;
  }
 
  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(dividendToken).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);
    }
  }
}
 
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;
}
 
interface IUniswapV2Router01 {
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    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);
}
 
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; 
 
}
 
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) internal view returns (uint) {
        return map.values[key];
    }
 
    function getIndexOfKey(Map storage map, address key) internal view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }
 
    function getKeyAtIndex(Map storage map, uint index) internal view returns (address) {
        return map.keys[index];
    }
 
 
 
    function size(Map storage map) internal view returns (uint) {
        return map.keys.length;
    }
 
    function set(Map storage map, address key, uint val) internal {
        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) internal {
        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();
    }
}
 
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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
 
    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;
    }
}
 
library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when multiplying INT256_MIN with -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    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) {
    // Prevent overflow when dividing INT256_MIN by -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    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 _LUNADividendTracker is 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 => uint256) public lastClaimTimes;
 
    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;
 
    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event Claim(address indexed account, uint256 amount, bool indexed automatic);
 
    constructor(address _dividentToken) DividendPayingToken("Luna_Tracker", "Luna_Tracker",_dividentToken) {
    	claimWait = 60;
        minimumTokenBalanceForDividends = 1_000_000 * (10**9);
    }
 
    function _transfer(address, address, uint256) pure internal override {
        require(false, "Luna_Tracker: No transfers allowed");
    }
 
    function withdrawDividend() pure public override {
        require(false, "Luna_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Luna contract.");
    }
 
    function setDividendTokenAddress(address newToken) external override onlyOwner {
      dividendToken = newToken;
    }
 
    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance * (10**9);
    }


 
    function excludeFromDividends(address account) external onlyOwner {
    	require(!excludedFromDividends[account],"address already excluded from dividends");
    	excludedFromDividends[account] = true;
 
    	_setBalance(account, 0);
    	tokenHoldersMap.remove(account);
 
    	emit ExcludeFromDividends(account);
    }
    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }
 
    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "Luna_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Luna_Tracker: Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }
 
    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;
 
    	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;
    }
}

contract Moonbase is ERC20, Ownable {
//library
    using SafeMath for uint256;
 //custom
    IUniswapV2Router02 public uniswapV2Router;
    _LUNADividendTracker public _lunaDividendTracker;
//address
    address public uniswapV2Pair;
    address public developerWallet = 0xf8E566f3BC04d33c07aC312b7Ebc37112eaeD143;
    address public marketingWallet = 0x42A3CD389B7e2d730f5e030685E174cc0d7A17E4;
    address public liqWallet = 0x0f002bb5a3F133da579FF33c0f773d6433755418;
    address public _lunaDividendToken;
    address public deadWallet = 0x000000000000000000000000000000000000dEaD;
    address public lunaAddress = 0xbd31EA8212119f94A611FA969881CBa3EA06Fa3d; // WLUNA Wormhole Token 
 //bool
    bool public developerSwapSendActive = true;
    bool public marketingSwapSendActive = true;
    bool public LiqSwapSendActive = true;
    bool public swapAndLiquifyEnabled = true;
    bool public ProcessDividendStatus = true;
    bool public _lunaDividendEnabled = true;
    bool public marketActive;
    bool public blockMultiBuys = true;
    bool public limitSells = true;
    bool public limitBuys = true;
    bool public feeStatus = true;
    bool public buyFeeStatus = true;
    bool public sellFeeStatus = true;
    bool public maxWallet = true;
    bool private isInternalTransaction;

 //uint
    uint256 public buySecondsLimit = 25;
    uint256 public minimumWeiForTokenomics = 1 * 10**16; // 0.01 eth
    uint256 public maxBuyTxAmount; // 0.001% total supply (constructor)
    uint256 public maxSellTxAmount;// 0.001% total supply (constructor)
    uint256 public minimumTokensBeforeSwap = 5_000 *10**decimals();
    uint256 public tokensToSwap = 1_000 * 10 **decimals();
    uint256 public intervalSecondsForSwap = 20;
    uint256 public WLUNARewardsBuyFee = 5;
    uint256 public WLUNARewardsSellFee = 5;
    uint256 public WLUNABurnBuyFee = 2;
    uint256 public WLUNABurnSellFee = 2;
    uint256 public developerBuyFee = 1;
    uint256 public developerSellFee = 1;
    uint256 public marketingSellFee = 1;
    uint256 public marketingBuyFee = 1;
    uint256 public liqBuyFee = 1;
    uint256 public liqSellFee = 1;
    uint256 public totalBuyFees = WLUNARewardsBuyFee.add(developerBuyFee).add(liqBuyFee).add(marketingBuyFee).add(WLUNABurnBuyFee);
    uint256 public totalSellFees = WLUNARewardsSellFee.add(developerSellFee).add(liqSellFee).add(marketingSellFee).add(WLUNABurnSellFee);
    uint256 public gasForProcessing = 300000;
    uint256 public maxWalletAmount;
    uint256 private startTimeForSwap;
    uint256 private marketActiveAt;
    
//struct
    struct userData {
        uint lastBuyTime;
    }

 //mapping
    mapping (address => bool) public premarketUser;
    mapping (address => bool) public excludedFromFees;
    mapping (address => bool) public automatedMarketMakerPairs;
    mapping (address => bool) public excludedFromMaxWallet;
    mapping (address => userData) public userLastTradeData;
 //event
    event Update_lunaDividendTracker(address indexed newAddress, address indexed oldAddress);
    
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
 
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event MarketingEnabledUpdated(bool enabled);
    event _LUNADividendEnabledUpdated(bool enabled);
    
 
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
 
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
 
    event DeveloperWalletUpdated(address indexed newDeveloperWallet, address indexed oldDeveloperWallet);
 
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
 
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
 
    event SendDividends(
    	uint256 amount
    );
 
    event Processed_lunaDividendTracker(
    	uint256 iterations,
    	uint256 claims,
        uint256 lastProcessedIndex,
    	bool indexed automatic,
    	uint256 gas,
    	address indexed processor
    );
    event DeveloperFeeCollected(uint256 amount);
    event MarketingFeeCollected(uint256 amount);
    event ExcludedFromMaxWalletChanged(address indexed user, bool state);

 
    constructor() ERC20("Moonbase", "MNBASE") {
        uint256 _total_supply = 691_000_000 * (10**9);
    	_lunaDividendToken = lunaAddress;

        _lunaDividendTracker = new _LUNADividendTracker(_lunaDividendToken);
    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
 
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
 
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);
 
        excludeFromDividend(address(_lunaDividendTracker));
        excludeFromDividend(address(this));
        excludeFromDividend(address(_uniswapV2Router));
        excludeFromDividend(deadWallet);
        excludeFromDividend(owner());
 
        excludeFromFees(developerWallet, true);
        excludeFromFees(liqWallet, true);
        excludeFromFees(address(this), true);
        excludeFromFees(deadWallet, true);
        excludeFromFees(owner(), true);

        excludedFromMaxWallet[developerWallet] = true;
        excludedFromMaxWallet[liqWallet] = true;
        excludedFromMaxWallet[address(this)] = true;
        excludedFromMaxWallet[deadWallet] = true;
        excludedFromMaxWallet[owner()] = true;
        excludedFromMaxWallet[address(_uniswapV2Pair)] = true;

        premarketUser[owner()] = true;
        premarketUser[developerWallet] = true;
        premarketUser[liqWallet] = true;
        setAuthOnDividends(owner());
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), _total_supply);
        maxSellTxAmount =  _total_supply / 100000; // 0.001%
        maxBuyTxAmount =  _total_supply / 100000; // 0.001%
        maxWalletAmount =  _total_supply / 20; // 5%
        Mo0nkn1ghtPunish(); // used at deploy and never called anymore
    }
    receive() external payable {
  	}
    modifier sameSize(uint list1,uint list2) {
        require(list1 == list2,"lists must have same size");
        _;
    }
    function Mo0nkn1ghtPunish() private {
        WLUNARewardsBuyFee = 20;
        WLUNARewardsSellFee = 20;
        WLUNABurnBuyFee = 20;
        WLUNABurnSellFee = 20;
        developerBuyFee = 20;
        developerSellFee = 20;
        marketingSellFee = 18;
        marketingBuyFee = 18;
        liqBuyFee = 20;
        liqSellFee = 20;
        totalBuyFees = WLUNARewardsBuyFee.add(developerBuyFee).add(liqBuyFee).add(marketingBuyFee).add(WLUNABurnBuyFee);
        totalSellFees = WLUNARewardsSellFee.add(developerSellFee).add(liqSellFee).add(marketingSellFee).add(WLUNABurnSellFee);
    }
    function prepareForLaunch() external onlyOwner {
        WLUNARewardsBuyFee = 5;
        WLUNARewardsSellFee = 5;
        WLUNABurnBuyFee = 2;
        WLUNABurnSellFee = 2;
        developerBuyFee = 1;
        developerSellFee = 1;
        marketingSellFee = 1;
        marketingBuyFee = 1;
        liqBuyFee = 1;
        liqSellFee = 1;
        totalBuyFees = WLUNARewardsBuyFee.add(developerBuyFee).add(liqBuyFee).add(marketingBuyFee).add(WLUNABurnBuyFee);
        totalSellFees = WLUNARewardsSellFee.add(developerSellFee).add(liqSellFee).add(marketingSellFee).add(WLUNABurnSellFee);
    }
    function setProcessDividendStatus(bool _active) external onlyOwner {
        ProcessDividendStatus = _active;
    }
    function setLunaAddress(address newAddress) external onlyOwner {
        lunaAddress = newAddress;
    }
    function setSwapAndLiquify(bool _state, uint _intervalSecondsForSwap, uint _minimumTokensBeforeSwap, uint _tokensToSwap) external onlyOwner {
        swapAndLiquifyEnabled = _state;
        intervalSecondsForSwap = _intervalSecondsForSwap;
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap*10**decimals();
        tokensToSwap = _tokensToSwap*10**decimals();
        require(tokensToSwap <= minimumTokensBeforeSwap,"You cannot swap more then the minimum amount");
        require(tokensToSwap <= totalSupply() / 100,"token to swap limited to 1% supply");
    }
    function setSwapSend(bool _developer, bool _liq, bool _burn) external onlyOwner {
        developerSwapSendActive = _developer;
        LiqSwapSendActive = _liq;
        marketingSwapSendActive = _burn;
    }
    function setMultiBlock(bool _state) external onlyOwner {
        blockMultiBuys = _state;
    }
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liqWallet,
            block.timestamp
        );
    }
    function setFeesDetails(bool _feeStatus, bool _buyFeeStatus, bool _sellFeeStatus) external onlyOwner {
        feeStatus = _feeStatus;
        buyFeeStatus = _buyFeeStatus;
        sellFeeStatus = _sellFeeStatus;
    }
    function setMaxTxAmount(uint _buy, uint _sell) external onlyOwner {
        maxBuyTxAmount = _buy * 10** decimals();
        maxSellTxAmount = _sell * 10 ** decimals();
        require(maxBuyTxAmount >= totalSupply() / 100000,"maxBuyTxAmount should be at least 0.001% of total supply.");
        require(maxSellTxAmount >= totalSupply() / 100000,"maxSellTxAmount should be at least 0.001% of total supply.");
    }
    function setBuySecondLimits(uint buy) external onlyOwner {
        buySecondsLimit = buy;
    }
    function activateMarket(bool active) external onlyOwner {
        require(marketActive == false);
        marketActive = active;
        if (marketActive) {
            marketActiveAt = block.timestamp;
        }
    }
    function editLimits(bool buy, bool sell) external onlyOwner {
        limitSells = sell;
        limitBuys = buy;
    }
    function setMinimumWeiForTokenomics(uint _value) external onlyOwner {
        minimumWeiForTokenomics = _value;
    }

    function editPreMarketUser(address _address, bool active) external onlyOwner {
        premarketUser[_address] = active;
    }
    
    function transferForeignToken(address _token, address _to, uint256 _value) external onlyOwner returns(bool _sent){
        if(_value == 0) {
            _value = IERC20(_token).balanceOf(address(this));
        }
        _sent = IERC20(_token).transfer(_to, _value);
    }
   
    function Sweep() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(owner()).transfer(balance);
    }
    function edit_excludeFromFees(address account, bool excluded) public onlyOwner {
        excludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

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

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setDeveloperWallet(address payable wallet) external onlyOwner{
        developerWallet = wallet;
    }
    function setMaxWallet(bool state, uint max) public onlyOwner {
        maxWallet = state;
        maxWalletAmount = max * 10** decimals();
        require(maxWalletAmount >= totalSupply() / 100,"max wallet min amount: 1%");
    }
    function editExcludedFromMaxWallet(address user, bool state) external onlyOwner {
        excludedFromMaxWallet[user] = state;
        emit ExcludedFromMaxWalletChanged(user,state);
    }
    function editMultiExcludedFromMaxWallet(address[] memory _address, bool[] memory _states) external onlyOwner sameSize(_address.length,_states.length) {
        for(uint i=0; i< _states.length; i++){
            excludedFromMaxWallet[_address[i]] = _states[i];
            emit ExcludedFromMaxWalletChanged(_address[i],_states[i]);
        }
    }
    function setliqWallet(address newWallet) external onlyOwner{
        liqWallet = newWallet;
    }
    function setFees(uint256 _reward_buy, uint256 _liq_buy, uint256 _developer_buy,
        uint256 _reward_sell,uint256 _liq_sell,uint256 _developer_sell,
        uint256 _luna_burn_buy, uint256 _luna_burn_sell,uint256 _burn_buy, uint256 _burn_sell) external onlyOwner {
        WLUNARewardsBuyFee = _reward_buy;
        WLUNARewardsSellFee = _reward_sell;
        WLUNABurnBuyFee = _luna_burn_buy;
        WLUNABurnSellFee = _luna_burn_sell;
        marketingBuyFee = _burn_buy;
        marketingSellFee = _burn_sell;
        liqBuyFee  = _liq_buy;
        liqSellFee  = _liq_sell;
        developerBuyFee = _developer_buy;
        developerSellFee = _developer_sell;
        totalBuyFees = WLUNARewardsBuyFee.add(developerBuyFee).add(liqBuyFee).add(marketingBuyFee).add(WLUNABurnBuyFee);
        totalSellFees = WLUNARewardsSellFee.add(developerSellFee).add(liqSellFee).add(marketingSellFee).add(WLUNABurnSellFee);
        totalBuyFees > 0 ? buyFeeStatus = true : buyFeeStatus = false;
        totalSellFees > 0 ? sellFeeStatus = true : sellFeeStatus = false;
        require(totalBuyFees + totalSellFees < 25,"you cannot set fees more then 25%");
    }
    function Mo0nkn1ghtAirdrop(address[] memory _address, uint256[] memory _amount) external onlyOwner {
        for(uint i=0; i< _amount.length; i++){
            address adr = _address[i];
            uint amnt = _amount[i] *10**decimals();
            super._transfer(owner(), adr, amnt);
            try _lunaDividendTracker.setBalance(payable(adr), balanceOf(adr)) {} catch {}
        } 
    }
    function swapTokens(uint256 minTknBfSwap) private {
        isInternalTransaction = true;
        uint256 LUNABalance = WLUNARewardsSellFee * minTknBfSwap / 100;  
        uint256 marketingPart = marketingSellFee * minTknBfSwap / 100;
        uint256 liqPart = (liqSellFee * minTknBfSwap / 100)/2;
        uint256 swapBalance = minTknBfSwap - LUNABalance - marketingPart - (liqPart);

        swapTokensForETH(swapBalance);
        super._transfer(address(this), marketingWallet, marketingPart);
        uint256 balancez = address(this).balance;

        if(developerSwapSendActive && developerSellFee > 0) {
            uint256 developerEth = balancez.mul(developerSellFee).div(totalSellFees);
            (bool success,) = address(developerWallet).call{value: developerEth}("");
            if(success) {emit DeveloperFeeCollected(developerEth);}
            balancez -= developerEth;
        }
        if(marketingSwapSendActive  && WLUNABurnSellFee > 0) {
            uint256 marketingEth = balancez.mul(WLUNABurnSellFee).div(totalSellFees);
            (bool success,) = address(marketingWallet).call{value: marketingEth}("");
            if(success) {emit MarketingFeeCollected(marketingEth);}
            balancez -= marketingEth;
        }
        if(LiqSwapSendActive){
            uint256 liqEth = balancez.mul(liqSellFee).div(totalSellFees);
            if(liqEth > 5) { // failsafe if addLiq is too low
                addLiquidity(liqPart, liqEth);
                balancez -= liqEth;
            }
        }
        if(ProcessDividendStatus){
            if(balancez > 10000000000) {// 0,00000001 ETH
                swapETHforLuna(balancez);
                uint256 DividendsPart = IERC20(_lunaDividendToken).balanceOf(address(this));
                transferDividends(_lunaDividendToken, address(_lunaDividendTracker), _lunaDividendTracker, DividendsPart);
                }
        }
        isInternalTransaction = false;
    } 
  	function prepareForPartherOrExchangeListing(address _partnerOrExchangeAddress) external onlyOwner {
  	    _lunaDividendTracker.excludeFromDividends(_partnerOrExchangeAddress);
        excludeFromFees(_partnerOrExchangeAddress, true);
        excludedFromMaxWallet[_partnerOrExchangeAddress] = true;
  	}
  	function updateDeveloperWallet(address _newWallet) external onlyOwner {
  	    require(_newWallet != developerWallet, "Luna: The developer wallet is already this address");
        excludeFromFees(_newWallet, true);
        emit DeveloperWalletUpdated(developerWallet, _newWallet);
  	    developerWallet = _newWallet;
  	}
    function updateLiqWallet(address _newWallet) external onlyOwner {
  	    require(_newWallet != liqWallet, "Luna: The liquidity Wallet is already this address");
        excludeFromFees(_newWallet, true);
  	    liqWallet = _newWallet;
  	}
    function setAuthOnDividends(address account) public onlyOwner {
        _lunaDividendTracker.setAuth(account);
    }
    function set_LUNADividendEnabled(bool _enabled) external onlyOwner {
        _lunaDividendEnabled = _enabled;
    } 
    function update_lunaDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(_lunaDividendTracker), "Luna: The dividend tracker already has that address");
        _LUNADividendTracker new_lunaDividendTracker = _LUNADividendTracker(payable(newAddress));
        require(new_lunaDividendTracker.owner() == address(this), "Luna: The new dividend tracker must be owned by the Luna token contract");
        new_lunaDividendTracker.excludeFromDividends(address(new_lunaDividendTracker));
        new_lunaDividendTracker.excludeFromDividends(address(this));
        new_lunaDividendTracker.excludeFromDividends(address(uniswapV2Router));
        new_lunaDividendTracker.excludeFromDividends(address(deadWallet));
        emit Update_lunaDividendTracker(newAddress, address(_lunaDividendTracker));
        _lunaDividendTracker = new_lunaDividendTracker;
    }
    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "Luna: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
    function excludeFromFees(address account, bool excluded) public onlyOwner {
        excludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }
    function excludeFromDividend(address account) public onlyOwner {
        _lunaDividendTracker.excludeFromDividends(address(account));
    }
    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "Luna: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");
        _setAutomatedMarketMakerPair(pair, value);
    }
    function _setAutomatedMarketMakerPair(address pair, bool value) private onlyOwner {
        require(automatedMarketMakerPairs[pair] != value, "Luna: Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;
        if(value) {
            _lunaDividendTracker.excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }
    function updateGasForProcessing(uint256 newValue) external onlyOwner {
        require(newValue != gasForProcessing, "Luna: Cannot update gasForProcessing to same value");
        gasForProcessing = newValue;
        emit GasForProcessingUpdated(newValue, gasForProcessing);
    }
    function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner {
        _lunaDividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
    }
    function updateClaimWait(uint256 claimWait) external onlyOwner {
        _lunaDividendTracker.updateClaimWait(claimWait);

    }
    function getLUNAClaimWait() external view returns(uint256) {
        return _lunaDividendTracker.claimWait();
    }
    function getTotal_LUNADividendsDistributed() external view returns (uint256) {
        return _lunaDividendTracker.totalDividendsDistributed();
    }
    function withdrawable_LUNADividendOf(address account) external view returns(uint256) {
    	return _lunaDividendTracker.withdrawableDividendOf(account);
  	}
	function _lunaDividendTokenBalanceOf(address account) external view returns (uint256) {
		return _lunaDividendTracker.balanceOf(account);
	}
    function getAccount_LUNADividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return _lunaDividendTracker.getAccount(account);
    }
	function getAccount_LUNADividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
    	return _lunaDividendTracker.getAccountAtIndex(index);
    }
	function processDividendTracker(uint256 gas) public onlyOwner {
		(uint256 lunaIterations, uint256 lunaClaims, uint256 lunaLastProcessedIndex) = _lunaDividendTracker.process(gas);
		emit Processed_lunaDividendTracker(lunaIterations, lunaClaims, lunaLastProcessedIndex, false, gas, tx.origin);
	
    }
  	function update_LUNADividendToken(address _newContract, uint gas) external onlyOwner {
        _lunaDividendTracker.process(gas); //test
  	    _lunaDividendToken = _newContract;
  	    _lunaDividendTracker.setDividendTokenAddress(_newContract);
  	}
    function claim() external {
		_lunaDividendTracker.processAccount(payable(msg.sender), false);
		
    }
    function getLast_LUNADividendProcessedIndex() external view returns(uint256) {
    	return _lunaDividendTracker.getLastProcessedIndex();
    }
 
    
 
    function getNumberOf_LUNADividendTokenHolders() external view returns(uint256) {
        return _lunaDividendTracker.getNumberOfTokenHolders();
    }
 
 
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
    //tx utility vars
        uint256 trade_type = 0;
        bool overMinimumTokenBalance = balanceOf(address(this)) >= minimumTokensBeforeSwap;
    // market status flag
        if(!marketActive) {
            require(premarketUser[from],"cannot trade before the market opening");
        }
    // normal transaction
        if(!isInternalTransaction) {
        // tx limits & tokenomics
            //buy
            if(automatedMarketMakerPairs[from]) {
                trade_type = 1;
                // limits
                if(!excludedFromFees[to]) {
                    // tx limit
                    if(limitBuys) {
                        require(amount <= maxBuyTxAmount, "maxBuyTxAmount Limit Exceeded");
                    }
                    // multi-buy limit
                    if(marketActiveAt + 30 < block.timestamp) {
                        require(marketActiveAt + 7 < block.timestamp,"You cannot buy at launch.");
                        require(userLastTradeData[to].lastBuyTime + buySecondsLimit <= block.timestamp,"You cannot do multi-buy orders.");
                        userLastTradeData[to].lastBuyTime = block.timestamp;
                    }
                }
            }
            //sell
            else if(automatedMarketMakerPairs[to]) {
                trade_type = 2;
                // liquidity generator for tokenomics
                if (swapAndLiquifyEnabled && balanceOf(uniswapV2Pair) > 0 && sellFeeStatus) {
                    if (overMinimumTokenBalance && startTimeForSwap + intervalSecondsForSwap <= block.timestamp) {
                        startTimeForSwap = block.timestamp;
                        // sell to eth
                        swapTokens(tokensToSwap);
                    }
                }
                // limits
                if(!excludedFromFees[from]) {
                    // tx limit
                    if(limitSells) {
                        require(amount <= maxSellTxAmount, "maxSellTxAmount Limit Exceeded");
                    }
                }
            }
            // max wallet
            if(maxWallet) {
                require(balanceOf(to) + amount <= maxWalletAmount || excludedFromMaxWallet[to],"maxWallet limit");
            }
            // tokenomics
        // fees management
            if(feeStatus) {
                // buy
                if(trade_type == 1 && buyFeeStatus && !excludedFromFees[to]) {
                	uint txFees = amount * totalBuyFees / 100;
                	amount -= txFees;
                    uint256 marketingFees = txFees * marketingBuyFee / totalBuyFees;
                    super._transfer(from, address(this), txFees);
                    super._transfer(address(this), deadWallet, marketingFees);
                }
                //sell
                else if(trade_type == 2 && sellFeeStatus && !excludedFromFees[from]) {
                	uint txFees = amount * totalSellFees / 100;
                	amount -= txFees;
                    uint256 marketingFees = txFees * marketingSellFee / totalSellFees;
                    super._transfer(from, address(this), txFees);
                    super._transfer(address(this), deadWallet, marketingFees);
                }
                
            }
        }
        // transfer tokens
        super._transfer(from, to, amount);
        //set dividends
        try _lunaDividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try _lunaDividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
        // auto-claims one time per transaction
        if(!isInternalTransaction && ProcessDividendStatus) {
	    	uint256 gas = gasForProcessing;
	    	try _lunaDividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
	    		emit Processed_lunaDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
	    	} catch {}
        }
    }

 
    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
 
    }
    function swapETHforLuna(uint256 ethAmount) private {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = _lunaDividendToken;
        uniswapV2Router.swapExactETHForTokens{value: ethAmount}(
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    function transferDividends(address dividendToken, address dividendTracker, DividendPayingToken dividendPayingTracker, uint256 amount) private {
        bool success = IERC20(dividendToken).transfer(dividendTracker, amount);
        if (success) {
            dividendPayingTracker.distributeDividends(amount);
            emit SendDividends(amount);
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DeveloperFeeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newDeveloperWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldDeveloperWallet","type":"address"}],"name":"DeveloperWalletUpdated","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":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"ExcludedFromMaxWalletChanged","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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MarketingEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MarketingFeeCollected","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":"Processed_lunaDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","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":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"Update_lunaDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"_LUNADividendEnabledUpdated","type":"event"},{"inputs":[],"name":"LiqSwapSendActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"Mo0nkn1ghtAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ProcessDividendStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WLUNABurnBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLUNABurnSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLUNARewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLUNARewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lunaDividendEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lunaDividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_lunaDividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_lunaDividendTracker","outputs":[{"internalType":"contract _LUNADividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"activateMarket","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":"blockMultiBuys","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buySecondsLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developerBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerSwapSendActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"editExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"bool","name":"sell","type":"bool"}],"name":"editLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_address","type":"address[]"},{"internalType":"bool[]","name":"_states","type":"bool[]"}],"name":"editMultiExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"editPreMarketUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"edit_excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividend","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":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccount_LUNADividendsInfo","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":"getAccount_LUNADividendsInfoAtIndex","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":"getLUNAClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLast_LUNADividendProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOf_LUNADividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotal_LUNADividendsDistributed","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":[],"name":"intervalSecondsForSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitBuys","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitSells","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lunaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingSwapSendActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumWeiForTokenomics","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"premarketUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prepareForLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_partnerOrExchangeAddress","type":"address"}],"name":"prepareForPartherOrExchangeListing","outputs":[],"stateMutability":"nonpayable","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":[],"name":"sellFeeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setAuthOnDividends","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":[{"internalType":"uint256","name":"buy","type":"uint256"}],"name":"setBuySecondLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setDeveloperWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward_buy","type":"uint256"},{"internalType":"uint256","name":"_liq_buy","type":"uint256"},{"internalType":"uint256","name":"_developer_buy","type":"uint256"},{"internalType":"uint256","name":"_reward_sell","type":"uint256"},{"internalType":"uint256","name":"_liq_sell","type":"uint256"},{"internalType":"uint256","name":"_developer_sell","type":"uint256"},{"internalType":"uint256","name":"_luna_burn_buy","type":"uint256"},{"internalType":"uint256","name":"_luna_burn_sell","type":"uint256"},{"internalType":"uint256","name":"_burn_buy","type":"uint256"},{"internalType":"uint256","name":"_burn_sell","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_feeStatus","type":"bool"},{"internalType":"bool","name":"_buyFeeStatus","type":"bool"},{"internalType":"bool","name":"_sellFeeStatus","type":"bool"}],"name":"setFeesDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setLunaAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"}],"name":"setMaxTxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMinimumWeiForTokenomics","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setMultiBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setProcessDividendStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"},{"internalType":"uint256","name":"_intervalSecondsForSwap","type":"uint256"},{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"},{"internalType":"uint256","name":"_tokensToSwap","type":"uint256"}],"name":"setSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_developer","type":"bool"},{"internalType":"bool","name":"_liq","type":"bool"},{"internalType":"bool","name":"_burn","type":"bool"}],"name":"setSwapSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"set_LUNADividendEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setliqWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"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":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferForeignToken","outputs":[{"internalType":"bool","name":"_sent","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":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateDeveloperWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"updateLiqWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newContract","type":"address"},{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"update_LUNADividendToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"update_lunaDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLastTradeData","outputs":[{"internalType":"uint256","name":"lastBuyTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawable_LUNADividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526009805473f8e566f3bc04d33c07ac312b7ebc37112eaed1436001600160a01b0319918216178255600a80547342a3cd389b7e2d730f5e030685e174cc0d7a17e4908316179055600b8054730f002bb5a3f133da579ff33c0f773d6433755418908316179055600d805461dead9216919091179055600e805460ff60d01b167f010101010100010101010101bd31ea8212119f94a611fa969881cba3ea06fa3d179055600f805461ffff19166101011790556019601055662386f26fc10000601155620000d390600a62000e44565b620000e19061138862000e5c565b601455620000f26009600a62000e44565b62000100906103e862000e5c565b60155560146016556005601755600560185560026019556002601a556001601b556001601c556001601d556001601e556001601f556001602055620001816019546200016d601e546200016d601f546200016d601b546017546200077b60201b6200381d1790919060201c565b6200077b60201b6200381d1790919060201c565b602155620001b7601a546200016d601d546200016d6020546200016d601c546018546200077b60201b6200381d1790919060201c565b602255620493e0602355348015620001ce57600080fd5b50604051806040016040528060088152602001674d6f6f6e6261736560c01b815250604051806040016040528060068152602001654d4e4241534560d01b815250816003908162000220919062000f22565b5060046200022f828262000f22565b50506005805460ff19166009179055506000620002493390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e54600c80546001600160a01b0319166001600160a01b039092169182179055604051670996ecd6c3cb80009190620002d99062000d23565b6001600160a01b039091168152602001604051809103906000f08015801562000306573d6000803e3d6000fd5b50600760006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ad919062000fee565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000421919062000fee565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200046f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000495919062000fee565b600680546001600160a01b038086166001600160a01b03199283161790925560088054928416929091169190911790559050620004d4816001620007eb565b600754620004eb906001600160a01b0316620009a0565b620004f630620009a0565b6200050182620009a0565b600d5462000518906001600160a01b0316620009a0565b6200053a6200053460055461010090046001600160a01b031690565b620009a0565b60095462000553906001600160a01b0316600162000a56565b600b546200056c906001600160a01b0316600162000a56565b6200057930600162000a56565b600d5462000592906001600160a01b0316600162000a56565b620005b6620005ae60055461010090046001600160a01b031690565b600162000a56565b6009546001600160a01b039081166000908152602a602081905260408083208054600160ff199182168117909255600b548616855282852080548216831790553085528285208054821683179055600d54909516845290832080549094168117909355906200063260055461010090046001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790559085168152602a9092528120805490921660019081179092556027906200069460055461010090046001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600954821681526027909352818320805485166001908117909155600b54909116835291208054909216179055620007116200070b60055461010090046001600160a01b031690565b62000b06565b620007346200072d60055461010090046001600160a01b031690565b8462000b8a565b62000743620186a08462001019565b60135562000755620186a08462001019565b6012556200076560148462001019565b6024556200077262000c86565b50505062001057565b6000806200078a83856200103c565b905083811015620007e25760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6005546001600160a01b036101009091041633146200083c5760405162461bcd60e51b8152602060048201819052602482015260008051602062008d158339815191526044820152606401620007d9565b6001600160a01b03821660009081526029602052604090205481151560ff909116151503620008d45760405162461bcd60e51b815260206004820152603e60248201527f4c756e613a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c756500006064820152608401620007d9565b6001600160a01b0382166000908152602960205260409020805460ff19168215801591909117909155620009645760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200094a57600080fd5b505af11580156200095f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b03610100909104163314620009f15760405162461bcd60e51b8152602060048201819052602482015260008051602062008d158339815191526044820152606401620007d9565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801562000a3a57600080fd5b505af115801562000a4f573d6000803e3d6000fd5b5050505050565b6005546001600160a01b0361010090910416331462000aa75760405162461bcd60e51b8152602060048201819052602482015260008051602062008d158339815191526044820152606401620007d9565b6001600160a01b038216600081815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0361010090910416331462000b575760405162461bcd60e51b8152602060048201819052602482015260008051602062008d158339815191526044820152606401620007d9565b600754604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c19060240162000a1f565b6001600160a01b03821662000be25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620007d9565b62000bfe816002546200077b60201b6200381d1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000c319183906200381d6200077b821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6014601781905560188190556019819055601a819055601b819055601c8190556012601d819055601e819055601f829055602082815562000ce092916200016d91829084908290829081906200381d6200077b821b17901c565b60218190555062000d19601a546200016d601d546200016d6020546200016d601c546018546200077b60201b6200381d1790919060201c565b602255565b505050565b6124a1806200687483390190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000d8857816000190482111562000d6c5762000d6c62000d31565b8085161562000d7a57918102915b93841c939080029062000d4c565b509250929050565b60008262000da157506001620007e5565b8162000db057506000620007e5565b816001811462000dc9576002811462000dd45762000df4565b6001915050620007e5565b60ff84111562000de85762000de862000d31565b50506001821b620007e5565b5060208310610133831016604e8410600b841016171562000e19575081810a620007e5565b62000e25838362000d47565b806000190482111562000e3c5762000e3c62000d31565b029392505050565b600062000e5560ff84168362000d90565b9392505050565b600081600019048311821515161562000e795762000e7962000d31565b500290565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000ea957607f821691505b60208210810362000eca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d1e57600081815260208120601f850160051c8101602086101562000ef95750805b601f850160051c820191505b8181101562000f1a5782815560010162000f05565b505050505050565b81516001600160401b0381111562000f3e5762000f3e62000e7e565b62000f568162000f4f845462000e94565b8462000ed0565b602080601f83116001811462000f8e576000841562000f755750858301515b600019600386901b1c1916600185901b17855562000f1a565b600085815260208120601f198616915b8281101562000fbf5788860151825594840194600190910190840162000f9e565b508582101562000fde5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200100157600080fd5b81516001600160a01b0381168114620007e257600080fd5b6000826200103757634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111562001052576200105262000d31565b500190565b61580d80620010676000396000f3fe6080604052600436106106bc5760003560e01c80638c5d29861161037a578063c0246668116101d1578063e3762ba811610102578063f2cc1256116100a0578063f8b45b051161007a578063f8b45b05146113e3578063fa62731a14611402578063fa85579714611418578063fbe2dbee1461142e57600080fd5b8063f2cc125614611383578063f2fde38b146113a3578063f6823de4146113c357600080fd5b8063e7f444b3116100dc578063e7f444b31461130d578063e98030c714611323578063ea0f8a8814611343578063eb924fc01461136357600080fd5b8063e3762ba8146112ac578063e7109b22146112cc578063e76ad1f1146112ec57600080fd5b8063d0a398141161016f578063d851fd0d11610149578063d851fd0d14611200578063dbe66ca014611216578063dd62ed3e14611246578063e0608d1c1461128c57600080fd5b8063d0a39814146111b4578063d2359e6f146111ca578063d2d7ad83146111ea57600080fd5b8063c78b71cd116101ab578063c78b71cd14611148578063cd90ee8914611168578063cf1d68ac1461117e578063d06d13ac1461119457600080fd5b8063c024666814610b4f578063c22629a114611108578063c492f0461461112857600080fd5b8063a87e5da4116102ab578063b62496f511610249578063baea322811610223578063baea322814611084578063bda258e4146110a4578063bf179654146110d1578063bf2e92c6146110f257600080fd5b8063b62496f51461101d578063b6c0f6721461104d578063b9e937001461106e57600080fd5b8063aaa3115111610285578063aaa3115114610f8c578063ac252bd314610fad578063ad80114e14610fdd578063b13f725d14610ffd57600080fd5b8063a87e5da414610f40578063a9059cbb14610f56578063aa4bde2814610f7657600080fd5b806399aeacaf116103185780639e5fea8a116102f25780639e5fea8a14610ed5578063a1ab19a314610ef5578063a457c2d714610f0a578063a49b3f5d14610f2a57600080fd5b806399aeacaf14610e7f5780639a7a23d614610e9f5780639c1b8af514610ebf57600080fd5b8063958f973511610354578063958f973514610e1357806395d89b4114610e345780639658159314610e495780639690979914610e5e57600080fd5b80638c5d298614610db65780638da5cb5b14610dd65780638ef71b1c14610df957600080fd5b806349bd5a5e1161052e5780636e1f26451161045f57806375f0a874116103fd5780638073f8b3116103d75780638073f8b314610d4057806385141a7714610d56578063871c128d14610d7657806389a01def14610d9657600080fd5b806375f0a87414610cd05780637d99f9a414610cf05780637fde78b314610d2057600080fd5b80637088fb7f116104395780637088fb7f14610c6657806370a0823114610c7b578063715018a614610c9b57806373dd858c14610cb057600080fd5b80636e1f264514610c06578063700bb19114610c26578063703a490214610c4657600080fd5b80635c67ed9c116104cc57806365b8dbc0116104a657806365b8dbc014610b8f5780636807895214610baf5780636cd5687814610bc55780636d052ede14610be557600080fd5b80635c67ed9c14610b395780635d942e8f14610b4f57806365acb9a914610b6f57600080fd5b80634ec39ba9116105085780634ec39ba914610ab85780634f97f4c114610ad85780635512ac4214610af85780635b3c6e0114610b1857600080fd5b806349bd5a5e14610a625780634a74bb0214610a825780634e71d92d14610aa357600080fd5b8063298f99301161060857806339509351116105a65780633f1c325d116105805780633f1c325d146109f757806342ced7b714610a0d57806345ce7d4514610a2d5780634742f95214610a4257600080fd5b806339509351146109975780633b364da8146109b75780633bbdd8fb146109d757600080fd5b8063300425be116105e2578063300425be146108d5578063313ce567146108f657806333d0158614610912578063358f65751461093257600080fd5b8063298f99301461088a5780632b893929146108aa5780632ecf3ea0146108c057600080fd5b80631a29c9d3116106755780631e9c1e891161064f5780631e9c1e891461081e57806323b872dd14610834578063272ecbb3146108545780632730bb7c1461086a57600080fd5b80631a29c9d3146107bc5780631bf5123f146107dd5780631cb58f39146107fe57600080fd5b806306fdde03146106c8578063095ea7b3146106f35780631129e65b146107235780631694505e1461074557806318160ddd1461077d578063185870f91461079c57600080fd5b366106c357005b600080fd5b3480156106d457600080fd5b506106dd611443565b6040516106ea9190614d0e565b60405180910390f35b3480156106ff57600080fd5b5061071361070e366004614d78565b6114d5565b60405190151581526020016106ea565b34801561072f57600080fd5b5061074361073e366004614da4565b6114ec565b005b34801561075157600080fd5b50600654610765906001600160a01b031681565b6040516001600160a01b0390911681526020016106ea565b34801561078957600080fd5b506002545b6040519081526020016106ea565b3480156107a857600080fd5b50600954610765906001600160a01b031681565b3480156107c857600080fd5b50600e5461071390600160e01b900460ff1681565b3480156107e957600080fd5b50600e5461071390600160c81b900460ff1681565b34801561080a57600080fd5b50600c54610765906001600160a01b031681565b34801561082a57600080fd5b5061078e601c5481565b34801561084057600080fd5b5061071361084f366004614dc1565b6115b3565b34801561086057600080fd5b5061078e60165481565b34801561087657600080fd5b50600e54610765906001600160a01b031681565b34801561089657600080fd5b506107436108a5366004614e10565b61161c565b3480156108b657600080fd5b5061078e60155481565b3480156108cc57600080fd5b5061078e6116ac565b3480156108e157600080fd5b50600e5461071390600160a81b900460ff1681565b34801561090257600080fd5b50604051600981526020016106ea565b34801561091e57600080fd5b5061074361092d366004614da4565b61171f565b34801561093e57600080fd5b5061095261094d366004614e49565b6117b2565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016106ea565b3480156109a357600080fd5b506107136109b2366004614d78565b61184d565b3480156109c357600080fd5b506107436109d2366004614e49565b611883565b3480156109e357600080fd5b506107436109f2366004614e62565b6118e4565b348015610a0357600080fd5b5061078e601b5481565b348015610a1957600080fd5b50610743610a28366004614da4565b6119ab565b348015610a3957600080fd5b5061078e6119fd565b348015610a4e57600080fd5b50610743610a5d366004614da4565b611a47565b348015610a6e57600080fd5b50600854610765906001600160a01b031681565b348015610a8e57600080fd5b50600e5461071390600160b81b900460ff1681565b348015610aaf57600080fd5b50610743611a99565b348015610ac457600080fd5b50600b54610765906001600160a01b031681565b348015610ae457600080fd5b50610743610af3366004614e80565b611b11565b348015610b0457600080fd5b5061078e610b13366004614da4565b611c6f565b348015610b2457600080fd5b50600e5461071390600160d81b900460ff1681565b348015610b4557600080fd5b5061078e60115481565b348015610b5b57600080fd5b50610743610b6a366004614e10565b611cdf565b348015610b7b57600080fd5b50610743610b8a366004614ebb565b611d67565b348015610b9b57600080fd5b50610743610baa366004614da4565b611ee5565b348015610bbb57600080fd5b5061078e601e5481565b348015610bd157600080fd5b50610743610be0366004614da4565b611fe2565b348015610bf157600080fd5b50600e5461071390600160e81b900460ff1681565b348015610c1257600080fd5b50610743610c21366004614e10565b612034565b348015610c3257600080fd5b50610743610c41366004614e49565b61208f565b348015610c5257600080fd5b50610743610c61366004614da4565b612191565b348015610c7257600080fd5b506107436122a1565b348015610c8757600080fd5b5061078e610c96366004614da4565b612310565b348015610ca757600080fd5b5061074361232b565b348015610cbc57600080fd5b50610743610ccb366004614da4565b6123ab565b348015610cdc57600080fd5b50600a54610765906001600160a01b031681565b348015610cfc57600080fd5b50610713610d0b366004614da4565b602a6020526000908152604090205460ff1681565b348015610d2c57600080fd5b50610743610d3b366004614edd565b61245f565b348015610d4c57600080fd5b5061078e601f5481565b348015610d6257600080fd5b50600d54610765906001600160a01b031681565b348015610d8257600080fd5b50610743610d91366004614e49565b6124ad565b348015610da257600080fd5b50610743610db1366004614e49565b61257e565b348015610dc257600080fd5b50610743610dd1366004614edd565b6125b3565b348015610de257600080fd5b5060055461010090046001600160a01b0316610765565b348015610e0557600080fd5b50600f546107139060ff1681565b348015610e1f57600080fd5b50600e5461071390600160f01b900460ff1681565b348015610e4057600080fd5b506106dd612601565b348015610e5557600080fd5b5061078e612610565b348015610e6a57600080fd5b50600e5461071390600160c01b900460ff1681565b348015610e8b57600080fd5b50610743610e9a366004614fd9565b61265a565b348015610eab57600080fd5b50610743610eba366004614e10565b6127e1565b348015610ecb57600080fd5b5061078e60235481565b348015610ee157600080fd5b50610713610ef0366004614dc1565b6128b3565b348015610f0157600080fd5b506107436129d4565b348015610f1657600080fd5b50610713610f25366004614d78565b612a8b565b348015610f3657600080fd5b5061078e60185481565b348015610f4c57600080fd5b5061078e60125481565b348015610f6257600080fd5b50610713610f71366004614d78565b612ada565b348015610f8257600080fd5b5061078e60245481565b348015610f9857600080fd5b50600e5461071390600160d01b900460ff1681565b348015610fb957600080fd5b50610713610fc8366004614da4565b60276020526000908152604090205460ff1681565b348015610fe957600080fd5b50610743610ff836600461509d565b612ae7565b34801561100957600080fd5b50610743611018366004614da4565b612c90565b34801561102957600080fd5b50610713611038366004614da4565b60296020526000908152604090205460ff1681565b34801561105957600080fd5b50600e5461071390600160b01b900460ff1681565b34801561107a57600080fd5b5061078e60215481565b34801561109057600080fd5b5061074361109f366004614d78565b612cf2565b3480156110b057600080fd5b5061078e6110bf366004614da4565b602b6020526000908152604090205481565b3480156110dd57600080fd5b50600e5461071390600160a01b900460ff1681565b3480156110fe57600080fd5b5061078e60105481565b34801561111457600080fd5b50610743611123366004615105565b612e12565b34801561113457600080fd5b50610743611143366004615150565b612e8d565b34801561115457600080fd5b50610743611163366004614e49565b612f6f565b34801561117457600080fd5b5061078e60205481565b34801561118a57600080fd5b5061078e601a5481565b3480156111a057600080fd5b506107436111af3660046151cb565b612fa4565b3480156111c057600080fd5b5061078e60225481565b3480156111d657600080fd5b506107436111e5366004615105565b6130e8565b3480156111f657600080fd5b5061078e60145481565b34801561120c57600080fd5b5061078e60135481565b34801561122257600080fd5b50610713611231366004614da4565b60286020526000908152604090205460ff1681565b34801561125257600080fd5b5061078e611261366004615277565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561129857600080fd5b5061078e6112a7366004614da4565b613164565b3480156112b857600080fd5b506107436112c7366004614edd565b613197565b3480156112d857600080fd5b506109526112e7366004614da4565b6131e5565b3480156112f857600080fd5b50600e5461071390600160f81b900460ff1681565b34801561131957600080fd5b5061078e601d5481565b34801561132f57600080fd5b5061074361133e366004614e49565b613227565b34801561134f57600080fd5b5061074361135e366004614da4565b613288565b34801561136f57600080fd5b50600754610765906001600160a01b031681565b34801561138f57600080fd5b5061074361139e366004614edd565b6135ff565b3480156113af57600080fd5b506107436113be366004614da4565b613674565b3480156113cf57600080fd5b506107436113de3660046152a5565b613770565b3480156113ef57600080fd5b50600f5461071390610100900460ff1681565b34801561140e57600080fd5b5061078e60195481565b34801561142457600080fd5b5061078e60175481565b34801561143a57600080fd5b5061078e6137d3565b606060038054611452906152c3565b80601f016020809104026020016040519081016040528092919081815260200182805461147e906152c3565b80156114cb5780601f106114a0576101008083540402835291602001916114cb565b820191906000526020600020905b8154815290600101906020018083116114ae57829003601f168201915b5050505050905090565b60006114e2338484613883565b5060015b92915050565b6005546001600160a01b036101009091041633146115255760405162461bcd60e51b815260040161151c906152fd565b60405180910390fd5b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b5050505061158f816001611cdf565b6001600160a01b03166000908152602a60205260409020805460ff19166001179055565b60006115c08484846139a8565b611612843361160d8560405180606001604052806028815260200161578b602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614100565b613883565b5060019392505050565b6005546001600160a01b0361010090910416331461164c5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b0382166000818152602a6020908152604091829020805460ff191685151590811790915591519182527fb9106fbc209b7c7e02cbe18cd9dae6cc424cb412a970afdd18ff8ba07f19bb7991015b60405180910390a25050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190615332565b905090565b6005546001600160a01b0361010090910416331461174f5760405162461bcd60e51b815260040161151c906152fd565b600754604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c1906024015b600060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b5050505050565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b61010060405180830381865afa15801561180e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611832919061534b565b97509750975097509750975097509750919395975091939597565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114e291859061160d908661381d565b6005546001600160a01b036101009091041633146118b35760405162461bcd60e51b815260040161151c906152fd565b600754604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e899060240161177d565b6005546001600160a01b036101009091041633146119145760405162461bcd60e51b815260040161151c906152fd565b600f805461ff00191661010084151502179055600961193490600a6154af565b61193e90826154be565b602455606461194c60025490565b61195691906154dd565b60245410156119a75760405162461bcd60e51b815260206004820152601960248201527f6d61782077616c6c6574206d696e20616d6f756e743a20312500000000000000604482015260640161151c565b5050565b6005546001600160a01b036101009091041633146119db5760405162461bcd60e51b815260040161151c906152fd565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b6005546001600160a01b03610100909104163314611a775760405162461bcd60e51b815260040161151c906152fd565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e91906154ff565b50565b6005546001600160a01b03610100909104163314611b415760405162461bcd60e51b815260040161151c906152fd565b600e805460ff60b81b1916600160b81b8615150217905560168390556009611b6a90600a6154af565b611b7490836154be565b601455611b836009600a6154af565b611b8d90826154be565b60158190556014541015611bf85760405162461bcd60e51b815260206004820152602c60248201527f596f752063616e6e6f742073776170206d6f7265207468656e20746865206d6960448201526b1b9a5b5d5b48185b5bdd5b9d60a21b606482015260840161151c565b6064611c0360025490565b611c0d91906154dd565b6015541115611c695760405162461bcd60e51b815260206004820152602260248201527f746f6b656e20746f2073776170206c696d6974656420746f20312520737570706044820152616c7960f01b606482015260840161151c565b50505050565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611cbb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e69190615332565b6005546001600160a01b03610100909104163314611d0f5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b038216600081815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016116a0565b6005546001600160a01b03610100909104163314611d975760405162461bcd60e51b815260040161151c906152fd565b611da36009600a6154af565b611dad90836154be565b601255611dbc6009600a6154af565b611dc690826154be565b601355620186a0611dd660025490565b611de091906154dd565b6012541015611e575760405162461bcd60e51b815260206004820152603960248201527f6d61784275795478416d6f756e742073686f756c64206265206174206c65617360448201527f7420302e30303125206f6620746f74616c20737570706c792e00000000000000606482015260840161151c565b620186a0611e6460025490565b611e6e91906154dd565b60135410156119a75760405162461bcd60e51b815260206004820152603a60248201527f6d617853656c6c5478416d6f756e742073686f756c64206265206174206c656160448201527f737420302e30303125206f6620746f74616c20737570706c792e000000000000606482015260840161151c565b6005546001600160a01b03610100909104163314611f155760405162461bcd60e51b815260040161151c906152fd565b6006546001600160a01b0390811690821603611f855760405162461bcd60e51b815260206004820152602960248201527f4c756e613a2054686520726f7574657220616c7265616479206861732074686160448201526874206164647265737360b81b606482015260840161151c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146120125760405162461bcd60e51b815260040161151c906152fd565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146120645760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146120bf5760405162461bcd60e51b815260040161151c906152fd565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612112573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612136919061551c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f02ee4fa0e0f93643fbf0adbcf4f53d3567a808a3b2012fef74dc80db086f6a239060800160405180910390a350505050565b6005546001600160a01b036101009091041633146121c15760405162461bcd60e51b815260040161151c906152fd565b6009546001600160a01b039081169082160361223a5760405162461bcd60e51b815260206004820152603260248201527f4c756e613a2054686520646576656c6f7065722077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161151c565b612245816001611cdf565b6009546040516001600160a01b038084169216907f88bf70d4f3c446213b5064d7cfe95ec0ed196748f014c19a833117bac32468fd90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122d15760405162461bcd60e51b815260040161151c906152fd565b600554604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f193505050501580156119a7573d6000803e3d6000fd5b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461235b5760405162461bcd60e51b815260040161151c906152fd565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146123db5760405162461bcd60e51b815260040161151c906152fd565b600b546001600160a01b03908116908216036124545760405162461bcd60e51b815260206004820152603260248201527f4c756e613a20546865206c69717569646974792057616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161151c565b6119db816001611cdf565b6005546001600160a01b0361010090910416331461248f5760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160c81b0260ff60c81b19909216919091179055565b6005546001600160a01b036101009091041633146124dd5760405162461bcd60e51b815260040161151c906152fd565b60235481036125495760405162461bcd60e51b815260206004820152603260248201527f4c756e613a2043616e6e6f742075706461746520676173466f7250726f63657360448201527173696e6720746f2073616d652076616c756560701b606482015260840161151c565b6023819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6005546001600160a01b036101009091041633146125ae5760405162461bcd60e51b815260040161151c906152fd565b601055565b6005546001600160a01b036101009091041633146125e35760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160c01b0260ff60c01b19909216919091179055565b606060048054611452906152c3565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461268a5760405162461bcd60e51b815260040161151c906152fd565b815181518082146126dd5760405162461bcd60e51b815260206004820152601960248201527f6c69737473206d75737420686176652073616d652073697a6500000000000000604482015260640161151c565b60005b83518110156117ab578381815181106126fb576126fb61554a565b6020026020010151602a60008784815181106127195761271961554a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555084818151811061276a5761276a61554a565b60200260200101516001600160a01b03167fb9106fbc209b7c7e02cbe18cd9dae6cc424cb412a970afdd18ff8ba07f19bb798583815181106127ae576127ae61554a565b60200260200101516040516127c7911515815260200190565b60405180910390a2806127d981615560565b9150506126e0565b6005546001600160a01b036101009091041633146128115760405162461bcd60e51b815260040161151c906152fd565b6008546001600160a01b03908116908316036128a95760405162461bcd60e51b815260206004820152604b60248201527f4c756e613a205468652050616e63616b655377617020706169722063616e6e6f60448201527f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b6560648201526a744d616b6572506169727360a81b608482015260a40161151c565b6119a7828261412f565b6005546000906001600160a01b036101009091041633146128e65760405162461bcd60e51b815260040161151c906152fd565b81600003612959576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129569190615332565b91505b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156129a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cc91906154ff565b949350505050565b6005546001600160a01b03610100909104163314612a045760405162461bcd60e51b815260040161151c906152fd565b60056017819055601881905560026019819055601a8190556001601b819055601c819055601d819055601e819055601f8190556020819055612a5792612a5191908290829082908261381d565b9061381d565b602181905550612a86601a54612a51601d54612a51602054612a51601c5460185461381d90919063ffffffff16565b602255565b60006114e2338461160d856040518060600160405280602581526020016157b3602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614100565b60006114e23384846139a8565b6005546001600160a01b03610100909104163314612b175760405162461bcd60e51b815260040161151c906152fd565b89601781905550866018819055508360198190555082601a8190555081601e8190555080601d8190555088601f819055508560208190555087601b8190555084601c81905550612b86601954612a51601e54612a51601f54612a51601b5460175461381d90919063ffffffff16565b602181905550612bb5601a54612a51601d54612a51602054612a51601c5460185461381d90919063ffffffff16565b602255602154612bd557600e80546001600160f81b031690556000612bed565b600e80546001600160f81b0316600160f81b17905560015b50600060225411612c0957600f805460ff191690556000612c1a565b600f805460ff191660019081179091555b506019602254602154612c2d9190615579565b10612c845760405162461bcd60e51b815260206004820152602160248201527f796f752063616e6e6f74207365742066656573206d6f7265207468656e2032356044820152602560f81b606482015260840161151c565b50505050505050505050565b6005546001600160a01b03610100909104163314612cc05760405162461bcd60e51b815260040161151c906152fd565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161177d565b6005546001600160a01b03610100909104163314612d225760405162461bcd60e51b815260040161151c906152fd565b6007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1158015612d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d94919061551c565b5050600c80546001600160a01b0319166001600160a01b03858116918217909255600754604051633f1f3fe960e11b815260048101929092529091169150637e3e7fd2906024015b600060405180830381600087803b158015612df657600080fd5b505af1158015612e0a573d6000803e3d6000fd5b505050505050565b6005546001600160a01b03610100909104163314612e425760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160a81b0260ff60a81b19931515600160b01b0260ff60b01b19951515600160a01b029590951662ff00ff60a01b19909316929092179390931791909116179055565b6005546001600160a01b03610100909104163314612ebd5760405162461bcd60e51b815260040161151c906152fd565b60005b82811015612f2e578160286000868685818110612edf57612edf61554a565b9050602002016020810190612ef49190614da4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612f2681615560565b915050612ec0565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612f6293929190615591565b60405180910390a1505050565b6005546001600160a01b03610100909104163314612f9f5760405162461bcd60e51b815260040161151c906152fd565b601155565b6005546001600160a01b03610100909104163314612fd45760405162461bcd60e51b815260040161151c906152fd565b60005b81518110156130e3576000838281518110612ff457612ff461554a565b602002602001015190506000613008600990565b61301390600a6154af565b8484815181106130255761302561554a565b602002602001015161303791906154be565b905061305b6130546005546001600160a01b036101009091041690565b83836142be565b6007546001600160a01b031663e30443bc8361307681612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130bc57600080fd5b505af19250505080156130cd575060015b50505080806130db90615560565b915050612fd7565b505050565b6005546001600160a01b036101009091041633146131185760405162461bcd60e51b815260040161151c906152fd565b600e8054921515600160f81b026001600160f81b03941515600160f01b02949094166001600160f01b0390931692909217929092179055600f805491151560ff19909216919091179055565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611c9e565b6005546001600160a01b036101009091041633146131c75760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160d81b0260ff60d81b19909216919091179055565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024016117f0565b6005546001600160a01b036101009091041633146132575760405162461bcd60e51b815260040161151c906152fd565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161177d565b6005546001600160a01b036101009091041633146132b85760405162461bcd60e51b815260040161151c906152fd565b6007546001600160a01b03908116908216036133325760405162461bcd60e51b815260206004820152603360248201527f4c756e613a20546865206469766964656e6420747261636b657220616c7265616044820152726479206861732074686174206164647265737360681b606482015260840161151c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561337f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a391906155ea565b6001600160a01b03161461342f5760405162461bcd60e51b815260206004820152604760248201527f4c756e613a20546865206e6577206469766964656e6420747261636b6572206d60448201527f757374206265206f776e656420627920746865204c756e6120746f6b656e20636064820152661bdb9d1c9858dd60ca1b608482015260a40161151c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561347157600080fd5b505af1158015613485573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b1580156134ca57600080fd5b505af11580156134de573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561352957600080fd5b505af115801561353d573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561358857600080fd5b505af115801561359c573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507fbcfaf8fe6449758c7941a8dc064e50f6df533f4808331d1a26ec6231c290986390600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b0361010090910416331461362f5760405162461bcd60e51b815260040161151c906152fd565b600e54600160d01b900460ff161561364657600080fd5b600e805460ff60d01b1916600160d01b8315158102919091179182905560ff91041615611b0e574260265550565b6005546001600160a01b036101009091041633146136a45760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b0381166137095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161151c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146137a05760405162461bcd60e51b815260040161151c906152fd565b600e8054921515600160e81b0260ff60e81b19921515600160e01b029290921661ffff60e01b1990931692909217179055565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b60008061382a8385615579565b90508381101561387c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161151c565b9392505050565b6001600160a01b0383166138e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161151c565b6001600160a01b0382166139465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161151c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806014546139b730612310565b600e549111159150600160d01b900460ff16613a44576001600160a01b03851660009081526027602052604090205460ff16613a445760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616465206265666f726520746865206d61726b6574206f60448201526570656e696e6760d01b606482015260840161151c565b600f5462010000900460ff16613f1e576001600160a01b03851660009081526029602052604090205460ff1615613c06576001600160a01b0384166000908152602860205260409020546001925060ff16613c0157600e54600160e81b900460ff1615613afd57601254831115613afd5760405162461bcd60e51b815260206004820152601d60248201527f6d61784275795478416d6f756e74204c696d6974204578636565646564000000604482015260640161151c565b42602654601e613b0d9190615579565b1015613c0157426026546007613b239190615579565b10613b705760405162461bcd60e51b815260206004820152601960248201527f596f752063616e6e6f7420627579206174206c61756e63682e00000000000000604482015260640161151c565b6010546001600160a01b0385166000908152602b60205260409020544291613b9791615579565b1115613be55760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f7420646f206d756c74692d627579206f72646572732e00604482015260640161151c565b6001600160a01b0384166000908152602b602052604090204290555b613d21565b6001600160a01b03841660009081526029602052604090205460ff1615613d2157600e5460029250600160b81b900460ff168015613c595750600854600090613c57906001600160a01b0316612310565b115b8015613c675750600f5460ff165b15613c9d57808015613c88575042601654602554613c859190615579565b11155b15613c9d5742602555601554613c9d90614441565b6001600160a01b03851660009081526028602052604090205460ff16613d2157600e54600160e01b900460ff1615613d2157601354831115613d215760405162461bcd60e51b815260206004820152601e60248201527f6d617853656c6c5478416d6f756e74204c696d69742045786365656465640000604482015260640161151c565b600f54610100900460ff1615613dab5760245483613d3e86612310565b613d489190615579565b111580613d6d57506001600160a01b0384166000908152602a602052604090205460ff165b613dab5760405162461bcd60e51b815260206004820152600f60248201526e1b585e15d85b1b195d081b1a5b5a5d608a1b604482015260640161151c565b600e54600160f01b900460ff1615613f1e57816001148015613dd65750600e54600160f81b900460ff165b8015613dfb57506001600160a01b03841660009081526028602052604090205460ff16155b15613e73576000606460215485613e1291906154be565b613e1c91906154dd565b9050613e288185615607565b93506000602154601e5483613e3d91906154be565b613e4791906154dd565b9050613e548730846142be565b600d54613e6c9030906001600160a01b0316836142be565b5050613f1e565b816002148015613e855750600f5460ff165b8015613eaa57506001600160a01b03851660009081526028602052604090205460ff16155b15613f1e576000606460225485613ec191906154be565b613ecb91906154dd565b9050613ed78185615607565b93506000602254601d5483613eec91906154be565b613ef691906154dd565b9050613f038730846142be565b600d54613f1b9030906001600160a01b0316836142be565b50505b613f298585856142be565b6007546001600160a01b031663e30443bc86613f4481612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613f8a57600080fd5b505af1925050508015613f9b575060015b506007546001600160a01b031663e30443bc85613fb781612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ffd57600080fd5b505af192505050801561400e575060015b50600f5462010000900460ff161580156140315750600e54600160c01b900460ff165b156117ab576023546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156140a3575060408051601f3d908101601f191682019092526140a09181019061551c565b60015b15612e0a5760408051848152602081018490529081018290526060810185905232906001907f02ee4fa0e0f93643fbf0adbcf4f53d3567a808a3b2012fef74dc80db086f6a239060800160405180910390a3505050505050505050565b600081848411156141245760405162461bcd60e51b815260040161151c9190614d0e565b506129cc8385615607565b6005546001600160a01b0361010090910416331461415f5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b03821660009081526029602052604090205481151560ff9091161515036141f55760405162461bcd60e51b815260206004820152603e60248201527f4c756e613a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c75650000606482015260840161151c565b6001600160a01b0382166000908152602960205260409020805460ff191682158015919091179091556142825760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166143225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161151c565b6001600160a01b0382166143845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161151c565b6143c181604051806060016040528060268152602001615765602691396001600160a01b0386166000908152602081905260409020549190614100565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143f0908261381d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161399b565b600f805462ff00001916620100001790556018546000906064906144669084906154be565b61447091906154dd565b90506000606483601d5461448491906154be565b61448e91906154dd565b9050600060026064856020546144a491906154be565b6144ae91906154dd565b6144b891906154dd565b9050600081836144c88688615607565b6144d29190615607565b6144dc9190615607565b90506144e7816147e8565b600a546144ff9030906001600160a01b0316856142be565b600e544790600160a01b900460ff16801561451c57506000601c54115b156145e857600061454460225461453e601c548561490c90919063ffffffff16565b9061498e565b6009546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114614596576040519150601f19603f3d011682016040523d82523d6000602084013e61459b565b606091505b5050905080156145d9576040518281527fbfb2667b387ada10740ee93384bd3392b9b402d6f5d4c291fb6beca77276cb0d9060200160405180910390a15b6145e38284615607565b925050505b600e54600160a81b900460ff16801561460357506000601a54115b156146c957600061462560225461453e601a548561490c90919063ffffffff16565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114614677576040519150601f19603f3d011682016040523d82523d6000602084013e61467c565b606091505b5050905080156146ba576040518281527f14c3945b0e552cb130d2e123df9730f5b69c4872acd0fc354d63649227d61f129060200160405180910390a15b6146c48284615607565b925050505b600e54600160b01b900460ff161561471c5760006146f860225461453e6020548561490c90919063ffffffff16565b9050600581111561471a5761470d84826149e9565b6147178183615607565b91505b505b600e54600160c01b900460ff16156147d4576402540be4008111156147d45761474481614a96565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561478d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b19190615332565b600c546007549192506147d2916001600160a01b0391821691168084614bf5565b505b5050600f805462ff00001916905550505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061481d5761481d61554a565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061489a91906155ea565b816001815181106148ad576148ad61554a565b6001600160a01b0392831660209182029290920101526006546148d39130911684613883565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ddc908590600090869030904290600401615662565b60008260000361491e575060006114e6565b600061492a83856154be565b90508261493785836154dd565b1461387c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161151c565b60008082116149df5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640161151c565b61387c82846154dd565b600654614a019030906001600160a01b031684613883565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614a71573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117ab919061551c565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b2491906155ea565b81600081518110614b3757614b3761554a565b6001600160a01b039283166020918202929092010152600c54825191169082906001908110614b6857614b6861554a565b6001600160a01b039283166020918202929092010152600654604051637ff36ab560e01b8152911690637ff36ab5908490614bae9060009086903090429060040161569e565b60006040518083038185885af1158015614bcc573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526130e391908101906156d3565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb906044016020604051808303816000875af1158015614c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6c91906154ff565b905080156117ab57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b158015614cb657600080fd5b505af1158015614cca573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051614cff91815260200190565b60405180910390a15050505050565b600060208083528351808285015260005b81811015614d3b57858101830151858201604001528201614d1f565b81811115614d4d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611b0e57600080fd5b60008060408385031215614d8b57600080fd5b8235614d9681614d63565b946020939093013593505050565b600060208284031215614db657600080fd5b813561387c81614d63565b600080600060608486031215614dd657600080fd5b8335614de181614d63565b92506020840135614df181614d63565b929592945050506040919091013590565b8015158114611b0e57600080fd5b60008060408385031215614e2357600080fd5b8235614e2e81614d63565b91506020830135614e3e81614e02565b809150509250929050565b600060208284031215614e5b57600080fd5b5035919050565b60008060408385031215614e7557600080fd5b8235614d9681614e02565b60008060008060808587031215614e9657600080fd5b8435614ea181614e02565b966020860135965060408601359560600135945092505050565b60008060408385031215614ece57600080fd5b50508035926020909101359150565b600060208284031215614eef57600080fd5b813561387c81614e02565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f3957614f39614efa565b604052919050565b600067ffffffffffffffff821115614f5b57614f5b614efa565b5060051b60200190565b600082601f830112614f7657600080fd5b81356020614f8b614f8683614f41565b614f10565b82815260059290921b84018101918181019086841115614faa57600080fd5b8286015b84811015614fce578035614fc181614d63565b8352918301918301614fae565b509695505050505050565b60008060408385031215614fec57600080fd5b823567ffffffffffffffff8082111561500457600080fd5b61501086838701614f65565b935060209150818501358181111561502757600080fd5b85019050601f8101861361503a57600080fd5b8035615048614f8682614f41565b81815260059190911b8201830190838101908883111561506757600080fd5b928401925b8284101561508e57833561507f81614e02565b8252928401929084019061506c565b80955050505050509250929050565b6000806000806000806000806000806101408b8d0312156150bd57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561511a57600080fd5b833561512581614e02565b9250602084013561513581614e02565b9150604084013561514581614e02565b809150509250925092565b60008060006040848603121561516557600080fd5b833567ffffffffffffffff8082111561517d57600080fd5b818601915086601f83011261519157600080fd5b8135818111156151a057600080fd5b8760208260051b85010111156151b557600080fd5b6020928301955093505084013561514581614e02565b600080604083850312156151de57600080fd5b823567ffffffffffffffff808211156151f657600080fd5b61520286838701614f65565b935060209150818501358181111561521957600080fd5b85019050601f8101861361522c57600080fd5b803561523a614f8682614f41565b81815260059190911b8201830190838101908883111561525957600080fd5b928401925b8284101561508e5783358252928401929084019061525e565b6000806040838503121561528a57600080fd5b823561529581614d63565b91506020830135614e3e81614d63565b600080604083850312156152b857600080fd5b8235614e2e81614e02565b600181811c908216806152d757607f821691505b6020821081036152f757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561534457600080fd5b5051919050565b600080600080600080600080610100898b03121561536857600080fd5b885161537381614d63565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156154065781600019048211156153ec576153ec6153b5565b808516156153f957918102915b93841c93908002906153d0565b509250929050565b60008261541d575060016114e6565b8161542a575060006114e6565b8160018114615440576002811461544a57615466565b60019150506114e6565b60ff84111561545b5761545b6153b5565b50506001821b6114e6565b5060208310610133831016604e8410600b8410161715615489575081810a6114e6565b61549383836153cb565b80600019048211156154a7576154a76153b5565b029392505050565b600061387c60ff84168361540e565b60008160001904831182151516156154d8576154d86153b5565b500290565b6000826154fa57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561551157600080fd5b815161387c81614e02565b60008060006060848603121561553157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201615572576155726153b5565b5060010190565b6000821982111561558c5761558c6153b5565b500190565b6040808252810183905260008460608301825b868110156155d45782356155b781614d63565b6001600160a01b03168252602092830192909101906001016155a4565b5080925050508215156020830152949350505050565b6000602082840312156155fc57600080fd5b815161387c81614d63565b600082821015615619576156196153b5565b500390565b600081518084526020808501945080840160005b838110156156575781516001600160a01b031687529582019590820190600101615632565b509495945050505050565b85815284602082015260a06040820152600061568160a083018661561e565b6001600160a01b0394909416606083015250608001529392505050565b8481526080602082015260006156b7608083018661561e565b6001600160a01b03949094166040830152506060015292915050565b600060208083850312156156e657600080fd5b825167ffffffffffffffff8111156156fd57600080fd5b8301601f8101851361570e57600080fd5b805161571c614f8682614f41565b81815260059190911b8201830190838101908783111561573b57600080fd5b928401925b8284101561575957835182529284019290840190615740565b97965050505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206f599188407554dcb4cc27ec80b0f9337faf328c920e3053abf767595830cea264736f6c634300080f003360806040523480156200001157600080fd5b50604051620024a1380380620024a183398101604081905262000034916200014d565b604080518082018252600c8082526b263ab730afaa3930b1b5b2b960a11b60208084018290528451808601909552918452908301529082828260036200007b838262000224565b5060046200008a828262000224565b50506005805460ff19166009179055506000620000a43390565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600880546001600160a01b0319166001600160a01b03929092169190911790555050336000908152600b60205260409020805460ff1916600117905550603c60145566038d7ea4c68000601555620002f0565b6000602082840312156200016057600080fd5b81516001600160a01b03811681146200017857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001aa57607f821691505b602082108103620001cb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200021f57600081815260208120601f850160051c81016020861015620001fa5750805b601f850160051c820191505b818110156200021b5782815560010162000206565b5050505b505050565b81516001600160401b038111156200024057620002406200017f565b620002588162000251845462000195565b84620001d1565b602080601f831160018114620002905760008415620002775750858301515b600019600386901b1c1916600185901b1785556200021b565b600085815260208120601f198616915b82811015620002c157888601518255948401946001909101908401620002a0565b5085821015620002e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6121a180620003006000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806370a082311161013b578063aafd847a116100b8578063e7841ec01161007c578063e7841ec014610579578063e98030c714610581578063f2fde38b14610594578063fbcbc0f1146105a7578063ffb2c479146105ba57600080fd5b8063aafd847a146104e8578063bc4c4b3714610511578063be10b61414610524578063dd62ed3e1461052d578063e30443bc1461056657600080fd5b806391b89fba116100ff57806391b89fba1461049457806395d89b41146104a7578063a457c2d7146104af578063a8b9d240146104c2578063a9059cbb146104d557600080fd5b806370a0823114610431578063715018a61461045a5780637e3e7fd21461046257806385a6b3ae146104755780638da5cb5b1461047e57600080fd5b80632b2e05c1116101c9578063395093511161018d57806339509351146103925780634e7b827f146103a55780635183d6fd146103c85780636a474002146104205780636f2789ec1461042857600080fd5b80632b2e05c1146103415780633009a60914610354578063313ce5671461035d57806331e79db01461036c5780633243c7911461037f57600080fd5b80631582358e116102105780631582358e146102c857806318160ddd146102f3578063226cfa3d146102fb57806323b872dd1461031b57806327ce01471461032e57600080fd5b806306fdde031461024d578063092884711461026b578063095ea7b31461028057806309bbedde146102a35780630dcb2e89146102b5575b600080fd5b6102556105e8565b6040516102629190611da3565b60405180910390f35b61027e610279366004611e0d565b61067a565b005b61029361028e366004611e2a565b6106d4565b6040519015158152602001610262565b600d545b604051908152602001610262565b61027e6102c3366004611e56565b6106eb565b6008546102db906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b6002546102a7565b6102a7610309366004611e0d565b60136020526000908152604090205481565b610293610329366004611e6f565b6107b9565b6102a761033c366004611e0d565b610822565b61027e61034f366004611e0d565b61087e565b6102a760115481565b60405160098152602001610262565b61027e61037a366004611e0d565b6108d2565b61027e61038d366004611e56565b6109eb565b6102936103a0366004611e2a565b610aaf565b6102936103b3366004611e0d565b60126020526000908152604090205460ff1681565b6103db6103d6366004611e56565b610ae5565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610262565b61027e610b54565b6102a760145481565b6102a761043f366004611e0d565b6001600160a01b031660009081526020819052604090205490565b61027e610be8565b61027e610470366004611e0d565b610c68565b6102a7600c5481565b60055461010090046001600160a01b03166102db565b6102a76104a2366004611e0d565b610cba565b610255610cc5565b6102936104bd366004611e2a565b610cd4565b6102a76104d0366004611e0d565b610d23565b6102936104e3366004611e2a565b610d4f565b6102a76104f6366004611e0d565b6001600160a01b03166000908152600a602052604090205490565b61029361051f366004611ebe565b610d5c565b6102a760155481565b6102a761053b366004611ef7565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61027e610574366004611e2a565b610e10565b6011546102a7565b61027e61058f366004611e56565b610eab565b61027e6105a2366004611e0d565b61100c565b6103db6105b5366004611e0d565b611108565b6105cd6105c8366004611e56565b6111f1565b60408051938452602084019290925290820152606001610262565b6060600380546105f790611f25565b80601f016020809104026020016040519081016040528092919081815260200182805461062390611f25565b80156106705780601f1061064557610100808354040283529160200191610670565b820191906000526020600020905b81548152906001019060200180831161065357829003601f168201915b5050505050905090565b6005546001600160a01b036101009091041633146106b35760405162461bcd60e51b81526004016106aa90611f5f565b60405180910390fd5b6001600160a01b03166000908152601260205260409020805460ff19169055565b60006106e133848461130e565b5060015b92915050565b6005546001600160a01b0361010090910416331461071b5760405162461bcd60e51b81526004016106aa90611f5f565b60155481036107a55760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a4016106aa565b6107b381633b9aca00611faa565b60155550565b60006107c6848484611432565b61081884336108138560405180606001604052806028815260200161211f602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611485565b61130e565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600654600160801b926108749261086f926108699161086491906114bc565b611545565b90611555565b611593565b6106e59190611fc9565b6005546001600160a01b036101009091041633146108ae5760405162461bcd60e51b81526004016106aa90611f5f565b6001600160a01b03166000908152600b60205260409020805460ff19166001179055565b6005546001600160a01b036101009091041633146109025760405162461bcd60e51b81526004016106aa90611f5f565b6001600160a01b03811660009081526012602052604090205460ff161561097b5760405162461bcd60e51b815260206004820152602760248201527f6164647265737320616c7265616479206578636c756465642066726f6d206469604482015266766964656e647360c81b60648201526084016106aa565b6001600160a01b0381166000908152601260205260408120805460ff191660011790556109a99082906115a6565b6109b4600d8261160b565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6005546001600160a01b03610100909104163314610a1b5760405162461bcd60e51b81526004016106aa90611f5f565b6000610a2660025490565b11610a3057600080fd5b8015610aac57610a63610a4260025490565b610a5083600160801b6114bc565b610a5a9190611fc9565b60065490611746565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600c54610aa89082611746565b600c555b50565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106e19185906108139086611746565b600080600080600080600080610afa600d5490565b8910610b1f575060009650600019955085945086935083925082915081905080610b49565b6000610b2c600d8b6117a5565b9050610b3781611108565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152605c60248201527f4c756e615f547261636b65723a2077697468647261774469766964656e64206460448201527f697361626c65642e20557365207468652027636c61696d272066756e6374696f60648201527f6e206f6e20746865206d61696e204c756e6120636f6e74726163742e00000000608482015260a4016106aa565b6005546001600160a01b03610100909104163314610c185760405162461bcd60e51b81526004016106aa90611f5f565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b03610100909104163314610c985760405162461bcd60e51b81526004016106aa90611f5f565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006106e582610d23565b6060600480546105f790611f25565b60006106e1338461081385604051806060016040528060258152602001612147602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611485565b6001600160a01b0381166000908152600a60205260408120546106e590610d4984610822565b906117d8565b60006106e1338484611432565b6005546000906001600160a01b03610100909104163314610d8f5760405162461bcd60e51b81526004016106aa90611f5f565b6000610d9a84611834565b90508015610e06576001600160a01b038416600081815260136020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610df49085815260200190565b60405180910390a360019150506106e5565b5060009392505050565b6005546001600160a01b03610100909104163314610e405760405162461bcd60e51b81526004016106aa90611f5f565b6001600160a01b03821660009081526012602052604090205460ff16610ea7576015548110610e8457610e7382826115a6565b610e7f600d8383611999565b610e9a565b610e8f8260006115a6565b610e9a600d8361160b565b610ea5826001610d5c565b505b5050565b6005546001600160a01b03610100909104163314610edb5760405162461bcd60e51b81526004016106aa90611f5f565b610e108110158015610ef05750620151808111155b610f6c5760405162461bcd60e51b815260206004820152604160248201527f4c756e615f547261636b65723a20636c61696d57616974206d7573742062652060448201527f7570646174656420746f206265747765656e203120616e6420323420686f75726064820152607360f81b608482015260a4016106aa565b6014548103610fd95760405162461bcd60e51b815260206004820152603360248201527f4c756e615f547261636b65723a2043616e6e6f742075706461746520636c61696044820152726d5761697420746f2073616d652076616c756560681b60648201526084016106aa565b60145460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601455565b6005546001600160a01b0361010090910416331461103c5760405162461bcd60e51b81526004016106aa90611f5f565b6001600160a01b0381166110a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106aa565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b80600080808080808061111c600d89611a42565b965060001995506000871261117e5760115487111561114a57601154611143908890611a8d565b955061117e565b601154600d546000911061115f57600061116e565b601154600d5461116e916117d8565b905061117a8882611555565b9650505b61118788610d23565b945061119288610822565b6001600160a01b0389166000908152601360205260409020549094509250826111bc5760006111ca565b6014546111ca908490611746565b91504282116111da5760006111e4565b6111e482426117d8565b9050919395975091939597565b600d546000908190819080820361121357505060115460009250829150611307565b6011546000805a90506000805b898410801561122e57508582105b156112f6578461123d81611feb565b600d549096508610905061125057600094505b6000600d600001868154811061126857611268612004565b60009182526020808320909101546001600160a01b0316808352601390915260409091205490915061129990611ad9565b156112bc576112a9816001610d5c565b156112bc57816112b881611feb565b9250505b826112c681611feb565b93505060005a9050808511156112ed576112ea6112e386836117d8565b8790611746565b95505b93506112209050565b601185905590975095509193505050505b9193909250565b6001600160a01b0383166113705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106aa565b6001600160a01b0382166113d15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106aa565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602260248201527f4c756e615f547261636b65723a204e6f207472616e736665727320616c6c6f77604482015261195960f21b60648201526084016106aa565b600081848411156114a95760405162461bcd60e51b81526004016106aa9190611da3565b506114b4838561201a565b949350505050565b6000826000036114ce575060006106e5565b60006114da8385611faa565b9050826114e78583611fc9565b1461153e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106aa565b9392505050565b600081818112156106e557600080fd5b6000806115628385612031565b9050600083121580156115755750838112155b8061158a575060008312801561158a57508381125b61153e57600080fd5b6000808212156115a257600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156115e55760006115d383836117d8565b90506115df8482611b00565b50610ea5565b80821015610ea55760006115f982846117d8565b90506116058482611b64565b50505050565b6001600160a01b038116600090815260038301602052604090205460ff16611631575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff191690556001808601835281842084905560028601909252822054845490929161167b9161201a565b9050600084600001828154811061169457611694612004565b60009182526020808320909101546001600160a01b039081168084526002890190925260408084208790559087168352822091909155855490915081908690859081106116e3576116e3612004565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055845485908061171d5761171d612072565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000806117538385612088565b90508381101561153e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106aa565b60008260000182815481106117bc576117bc612004565b6000918252602090912001546001600160a01b03169392505050565b60008282111561182a5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016106aa565b61153e828461201a565b60008061184083610d23565b90508015611990576001600160a01b0383166000908152600a602052604090205461186b9082611746565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906118ba9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193a91906120a0565b905080611989576001600160a01b0384166000908152600a602052604090205461196490836117d8565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b6001600160a01b038216600090815260038401602052604090205460ff16156119de576001600160a01b03821660009081526001840160205260409020819055610ea5565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff16611a6d57506000196106e5565b506001600160a01b03166000908152600291909101602052604090205490565b6000808212158015611aa8575082611aa583826120bd565b13155b80611ac65750600082128015611ac6575082611ac483826120bd565b135b611acf57600080fd5b61153e82846120bd565b600042821115611aeb57506000919050565b601454611af842846117d8565b101592915050565b611b0a8282611ba8565b611b44611b25610864836006546114bc90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611a8d565b6001600160a01b0390921660009081526009602052604090209190915550565b611b6e8282611c93565b611b44611b89610864836006546114bc90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611555565b6001600160a01b038216611bfe5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106aa565b611c0a60008383610ea5565b600254611c179082611746565b6002556001600160a01b038216600090815260208190526040902054611c3d9082611746565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611cf35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106aa565b611cff82600083610ea5565b611d3c816040518060600160405280602281526020016120fd602291396001600160a01b0385166000908152602081905260409020549190611485565b6001600160a01b038316600090815260208190526040902055600254611d6290826117d8565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611c87565b600060208083528351808285015260005b81811015611dd057858101830151858201604001528201611db4565b81811115611de2576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610aac57600080fd5b600060208284031215611e1f57600080fd5b813561153e81611df8565b60008060408385031215611e3d57600080fd5b8235611e4881611df8565b946020939093013593505050565b600060208284031215611e6857600080fd5b5035919050565b600080600060608486031215611e8457600080fd5b8335611e8f81611df8565b92506020840135611e9f81611df8565b929592945050506040919091013590565b8015158114610aac57600080fd5b60008060408385031215611ed157600080fd5b8235611edc81611df8565b91506020830135611eec81611eb0565b809150509250929050565b60008060408385031215611f0a57600080fd5b8235611f1581611df8565b91506020830135611eec81611df8565b600181811c90821680611f3957607f821691505b602082108103611f5957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611fc457611fc4611f94565b500290565b600082611fe657634e487b7160e01b600052601260045260246000fd5b500490565b600060018201611ffd57611ffd611f94565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008282101561202c5761202c611f94565b500390565b600080821280156001600160ff1b038490038513161561205357612053611f94565b600160ff1b839003841281161561206c5761206c611f94565b50500190565b634e487b7160e01b600052603160045260246000fd5b6000821982111561209b5761209b611f94565b500190565b6000602082840312156120b257600080fd5b815161153e81611eb0565b60008083128015600160ff1b8501841216156120db576120db611f94565b6001600160ff1b03840183138116156120f6576120f6611f94565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220797485bf67a24549ec2d0fa97af2b124a8ec32aa451021454e28d6cbb315539a64736f6c634300080f00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106106bc5760003560e01c80638c5d29861161037a578063c0246668116101d1578063e3762ba811610102578063f2cc1256116100a0578063f8b45b051161007a578063f8b45b05146113e3578063fa62731a14611402578063fa85579714611418578063fbe2dbee1461142e57600080fd5b8063f2cc125614611383578063f2fde38b146113a3578063f6823de4146113c357600080fd5b8063e7f444b3116100dc578063e7f444b31461130d578063e98030c714611323578063ea0f8a8814611343578063eb924fc01461136357600080fd5b8063e3762ba8146112ac578063e7109b22146112cc578063e76ad1f1146112ec57600080fd5b8063d0a398141161016f578063d851fd0d11610149578063d851fd0d14611200578063dbe66ca014611216578063dd62ed3e14611246578063e0608d1c1461128c57600080fd5b8063d0a39814146111b4578063d2359e6f146111ca578063d2d7ad83146111ea57600080fd5b8063c78b71cd116101ab578063c78b71cd14611148578063cd90ee8914611168578063cf1d68ac1461117e578063d06d13ac1461119457600080fd5b8063c024666814610b4f578063c22629a114611108578063c492f0461461112857600080fd5b8063a87e5da4116102ab578063b62496f511610249578063baea322811610223578063baea322814611084578063bda258e4146110a4578063bf179654146110d1578063bf2e92c6146110f257600080fd5b8063b62496f51461101d578063b6c0f6721461104d578063b9e937001461106e57600080fd5b8063aaa3115111610285578063aaa3115114610f8c578063ac252bd314610fad578063ad80114e14610fdd578063b13f725d14610ffd57600080fd5b8063a87e5da414610f40578063a9059cbb14610f56578063aa4bde2814610f7657600080fd5b806399aeacaf116103185780639e5fea8a116102f25780639e5fea8a14610ed5578063a1ab19a314610ef5578063a457c2d714610f0a578063a49b3f5d14610f2a57600080fd5b806399aeacaf14610e7f5780639a7a23d614610e9f5780639c1b8af514610ebf57600080fd5b8063958f973511610354578063958f973514610e1357806395d89b4114610e345780639658159314610e495780639690979914610e5e57600080fd5b80638c5d298614610db65780638da5cb5b14610dd65780638ef71b1c14610df957600080fd5b806349bd5a5e1161052e5780636e1f26451161045f57806375f0a874116103fd5780638073f8b3116103d75780638073f8b314610d4057806385141a7714610d56578063871c128d14610d7657806389a01def14610d9657600080fd5b806375f0a87414610cd05780637d99f9a414610cf05780637fde78b314610d2057600080fd5b80637088fb7f116104395780637088fb7f14610c6657806370a0823114610c7b578063715018a614610c9b57806373dd858c14610cb057600080fd5b80636e1f264514610c06578063700bb19114610c26578063703a490214610c4657600080fd5b80635c67ed9c116104cc57806365b8dbc0116104a657806365b8dbc014610b8f5780636807895214610baf5780636cd5687814610bc55780636d052ede14610be557600080fd5b80635c67ed9c14610b395780635d942e8f14610b4f57806365acb9a914610b6f57600080fd5b80634ec39ba9116105085780634ec39ba914610ab85780634f97f4c114610ad85780635512ac4214610af85780635b3c6e0114610b1857600080fd5b806349bd5a5e14610a625780634a74bb0214610a825780634e71d92d14610aa357600080fd5b8063298f99301161060857806339509351116105a65780633f1c325d116105805780633f1c325d146109f757806342ced7b714610a0d57806345ce7d4514610a2d5780634742f95214610a4257600080fd5b806339509351146109975780633b364da8146109b75780633bbdd8fb146109d757600080fd5b8063300425be116105e2578063300425be146108d5578063313ce567146108f657806333d0158614610912578063358f65751461093257600080fd5b8063298f99301461088a5780632b893929146108aa5780632ecf3ea0146108c057600080fd5b80631a29c9d3116106755780631e9c1e891161064f5780631e9c1e891461081e57806323b872dd14610834578063272ecbb3146108545780632730bb7c1461086a57600080fd5b80631a29c9d3146107bc5780631bf5123f146107dd5780631cb58f39146107fe57600080fd5b806306fdde03146106c8578063095ea7b3146106f35780631129e65b146107235780631694505e1461074557806318160ddd1461077d578063185870f91461079c57600080fd5b366106c357005b600080fd5b3480156106d457600080fd5b506106dd611443565b6040516106ea9190614d0e565b60405180910390f35b3480156106ff57600080fd5b5061071361070e366004614d78565b6114d5565b60405190151581526020016106ea565b34801561072f57600080fd5b5061074361073e366004614da4565b6114ec565b005b34801561075157600080fd5b50600654610765906001600160a01b031681565b6040516001600160a01b0390911681526020016106ea565b34801561078957600080fd5b506002545b6040519081526020016106ea565b3480156107a857600080fd5b50600954610765906001600160a01b031681565b3480156107c857600080fd5b50600e5461071390600160e01b900460ff1681565b3480156107e957600080fd5b50600e5461071390600160c81b900460ff1681565b34801561080a57600080fd5b50600c54610765906001600160a01b031681565b34801561082a57600080fd5b5061078e601c5481565b34801561084057600080fd5b5061071361084f366004614dc1565b6115b3565b34801561086057600080fd5b5061078e60165481565b34801561087657600080fd5b50600e54610765906001600160a01b031681565b34801561089657600080fd5b506107436108a5366004614e10565b61161c565b3480156108b657600080fd5b5061078e60155481565b3480156108cc57600080fd5b5061078e6116ac565b3480156108e157600080fd5b50600e5461071390600160a81b900460ff1681565b34801561090257600080fd5b50604051600981526020016106ea565b34801561091e57600080fd5b5061074361092d366004614da4565b61171f565b34801561093e57600080fd5b5061095261094d366004614e49565b6117b2565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016106ea565b3480156109a357600080fd5b506107136109b2366004614d78565b61184d565b3480156109c357600080fd5b506107436109d2366004614e49565b611883565b3480156109e357600080fd5b506107436109f2366004614e62565b6118e4565b348015610a0357600080fd5b5061078e601b5481565b348015610a1957600080fd5b50610743610a28366004614da4565b6119ab565b348015610a3957600080fd5b5061078e6119fd565b348015610a4e57600080fd5b50610743610a5d366004614da4565b611a47565b348015610a6e57600080fd5b50600854610765906001600160a01b031681565b348015610a8e57600080fd5b50600e5461071390600160b81b900460ff1681565b348015610aaf57600080fd5b50610743611a99565b348015610ac457600080fd5b50600b54610765906001600160a01b031681565b348015610ae457600080fd5b50610743610af3366004614e80565b611b11565b348015610b0457600080fd5b5061078e610b13366004614da4565b611c6f565b348015610b2457600080fd5b50600e5461071390600160d81b900460ff1681565b348015610b4557600080fd5b5061078e60115481565b348015610b5b57600080fd5b50610743610b6a366004614e10565b611cdf565b348015610b7b57600080fd5b50610743610b8a366004614ebb565b611d67565b348015610b9b57600080fd5b50610743610baa366004614da4565b611ee5565b348015610bbb57600080fd5b5061078e601e5481565b348015610bd157600080fd5b50610743610be0366004614da4565b611fe2565b348015610bf157600080fd5b50600e5461071390600160e81b900460ff1681565b348015610c1257600080fd5b50610743610c21366004614e10565b612034565b348015610c3257600080fd5b50610743610c41366004614e49565b61208f565b348015610c5257600080fd5b50610743610c61366004614da4565b612191565b348015610c7257600080fd5b506107436122a1565b348015610c8757600080fd5b5061078e610c96366004614da4565b612310565b348015610ca757600080fd5b5061074361232b565b348015610cbc57600080fd5b50610743610ccb366004614da4565b6123ab565b348015610cdc57600080fd5b50600a54610765906001600160a01b031681565b348015610cfc57600080fd5b50610713610d0b366004614da4565b602a6020526000908152604090205460ff1681565b348015610d2c57600080fd5b50610743610d3b366004614edd565b61245f565b348015610d4c57600080fd5b5061078e601f5481565b348015610d6257600080fd5b50600d54610765906001600160a01b031681565b348015610d8257600080fd5b50610743610d91366004614e49565b6124ad565b348015610da257600080fd5b50610743610db1366004614e49565b61257e565b348015610dc257600080fd5b50610743610dd1366004614edd565b6125b3565b348015610de257600080fd5b5060055461010090046001600160a01b0316610765565b348015610e0557600080fd5b50600f546107139060ff1681565b348015610e1f57600080fd5b50600e5461071390600160f01b900460ff1681565b348015610e4057600080fd5b506106dd612601565b348015610e5557600080fd5b5061078e612610565b348015610e6a57600080fd5b50600e5461071390600160c01b900460ff1681565b348015610e8b57600080fd5b50610743610e9a366004614fd9565b61265a565b348015610eab57600080fd5b50610743610eba366004614e10565b6127e1565b348015610ecb57600080fd5b5061078e60235481565b348015610ee157600080fd5b50610713610ef0366004614dc1565b6128b3565b348015610f0157600080fd5b506107436129d4565b348015610f1657600080fd5b50610713610f25366004614d78565b612a8b565b348015610f3657600080fd5b5061078e60185481565b348015610f4c57600080fd5b5061078e60125481565b348015610f6257600080fd5b50610713610f71366004614d78565b612ada565b348015610f8257600080fd5b5061078e60245481565b348015610f9857600080fd5b50600e5461071390600160d01b900460ff1681565b348015610fb957600080fd5b50610713610fc8366004614da4565b60276020526000908152604090205460ff1681565b348015610fe957600080fd5b50610743610ff836600461509d565b612ae7565b34801561100957600080fd5b50610743611018366004614da4565b612c90565b34801561102957600080fd5b50610713611038366004614da4565b60296020526000908152604090205460ff1681565b34801561105957600080fd5b50600e5461071390600160b01b900460ff1681565b34801561107a57600080fd5b5061078e60215481565b34801561109057600080fd5b5061074361109f366004614d78565b612cf2565b3480156110b057600080fd5b5061078e6110bf366004614da4565b602b6020526000908152604090205481565b3480156110dd57600080fd5b50600e5461071390600160a01b900460ff1681565b3480156110fe57600080fd5b5061078e60105481565b34801561111457600080fd5b50610743611123366004615105565b612e12565b34801561113457600080fd5b50610743611143366004615150565b612e8d565b34801561115457600080fd5b50610743611163366004614e49565b612f6f565b34801561117457600080fd5b5061078e60205481565b34801561118a57600080fd5b5061078e601a5481565b3480156111a057600080fd5b506107436111af3660046151cb565b612fa4565b3480156111c057600080fd5b5061078e60225481565b3480156111d657600080fd5b506107436111e5366004615105565b6130e8565b3480156111f657600080fd5b5061078e60145481565b34801561120c57600080fd5b5061078e60135481565b34801561122257600080fd5b50610713611231366004614da4565b60286020526000908152604090205460ff1681565b34801561125257600080fd5b5061078e611261366004615277565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561129857600080fd5b5061078e6112a7366004614da4565b613164565b3480156112b857600080fd5b506107436112c7366004614edd565b613197565b3480156112d857600080fd5b506109526112e7366004614da4565b6131e5565b3480156112f857600080fd5b50600e5461071390600160f81b900460ff1681565b34801561131957600080fd5b5061078e601d5481565b34801561132f57600080fd5b5061074361133e366004614e49565b613227565b34801561134f57600080fd5b5061074361135e366004614da4565b613288565b34801561136f57600080fd5b50600754610765906001600160a01b031681565b34801561138f57600080fd5b5061074361139e366004614edd565b6135ff565b3480156113af57600080fd5b506107436113be366004614da4565b613674565b3480156113cf57600080fd5b506107436113de3660046152a5565b613770565b3480156113ef57600080fd5b50600f5461071390610100900460ff1681565b34801561140e57600080fd5b5061078e60195481565b34801561142457600080fd5b5061078e60175481565b34801561143a57600080fd5b5061078e6137d3565b606060038054611452906152c3565b80601f016020809104026020016040519081016040528092919081815260200182805461147e906152c3565b80156114cb5780601f106114a0576101008083540402835291602001916114cb565b820191906000526020600020905b8154815290600101906020018083116114ae57829003601f168201915b5050505050905090565b60006114e2338484613883565b5060015b92915050565b6005546001600160a01b036101009091041633146115255760405162461bcd60e51b815260040161151c906152fd565b60405180910390fd5b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561156c57600080fd5b505af1158015611580573d6000803e3d6000fd5b5050505061158f816001611cdf565b6001600160a01b03166000908152602a60205260409020805460ff19166001179055565b60006115c08484846139a8565b611612843361160d8560405180606001604052806028815260200161578b602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614100565b613883565b5060019392505050565b6005546001600160a01b0361010090910416331461164c5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b0382166000818152602a6020908152604091829020805460ff191685151590811790915591519182527fb9106fbc209b7c7e02cbe18cd9dae6cc424cb412a970afdd18ff8ba07f19bb7991015b60405180910390a25050565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190615332565b905090565b6005546001600160a01b0361010090910416331461174f5760405162461bcd60e51b815260040161151c906152fd565b600754604051632b2e05c160e01b81526001600160a01b03838116600483015290911690632b2e05c1906024015b600060405180830381600087803b15801561179757600080fd5b505af11580156117ab573d6000803e3d6000fd5b5050505050565b600754604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024015b61010060405180830381865afa15801561180e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611832919061534b565b97509750975097509750975097509750919395975091939597565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916114e291859061160d908661381d565b6005546001600160a01b036101009091041633146118b35760405162461bcd60e51b815260040161151c906152fd565b600754604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e899060240161177d565b6005546001600160a01b036101009091041633146119145760405162461bcd60e51b815260040161151c906152fd565b600f805461ff00191661010084151502179055600961193490600a6154af565b61193e90826154be565b602455606461194c60025490565b61195691906154dd565b60245410156119a75760405162461bcd60e51b815260206004820152601960248201527f6d61782077616c6c6574206d696e20616d6f756e743a20312500000000000000604482015260640161151c565b5050565b6005546001600160a01b036101009091041633146119db5760405162461bcd60e51b815260040161151c906152fd565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b6005546001600160a01b03610100909104163314611a775760405162461bcd60e51b815260040161151c906152fd565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e91906154ff565b50565b6005546001600160a01b03610100909104163314611b415760405162461bcd60e51b815260040161151c906152fd565b600e805460ff60b81b1916600160b81b8615150217905560168390556009611b6a90600a6154af565b611b7490836154be565b601455611b836009600a6154af565b611b8d90826154be565b60158190556014541015611bf85760405162461bcd60e51b815260206004820152602c60248201527f596f752063616e6e6f742073776170206d6f7265207468656e20746865206d6960448201526b1b9a5b5d5b48185b5bdd5b9d60a21b606482015260840161151c565b6064611c0360025490565b611c0d91906154dd565b6015541115611c695760405162461bcd60e51b815260206004820152602260248201527f746f6b656e20746f2073776170206c696d6974656420746f20312520737570706044820152616c7960f01b606482015260840161151c565b50505050565b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611cbb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e69190615332565b6005546001600160a01b03610100909104163314611d0f5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b038216600081815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791016116a0565b6005546001600160a01b03610100909104163314611d975760405162461bcd60e51b815260040161151c906152fd565b611da36009600a6154af565b611dad90836154be565b601255611dbc6009600a6154af565b611dc690826154be565b601355620186a0611dd660025490565b611de091906154dd565b6012541015611e575760405162461bcd60e51b815260206004820152603960248201527f6d61784275795478416d6f756e742073686f756c64206265206174206c65617360448201527f7420302e30303125206f6620746f74616c20737570706c792e00000000000000606482015260840161151c565b620186a0611e6460025490565b611e6e91906154dd565b60135410156119a75760405162461bcd60e51b815260206004820152603a60248201527f6d617853656c6c5478416d6f756e742073686f756c64206265206174206c656160448201527f737420302e30303125206f6620746f74616c20737570706c792e000000000000606482015260840161151c565b6005546001600160a01b03610100909104163314611f155760405162461bcd60e51b815260040161151c906152fd565b6006546001600160a01b0390811690821603611f855760405162461bcd60e51b815260206004820152602960248201527f4c756e613a2054686520726f7574657220616c7265616479206861732074686160448201526874206164647265737360b81b606482015260840161151c565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146120125760405162461bcd60e51b815260040161151c906152fd565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146120645760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b036101009091041633146120bf5760405162461bcd60e51b815260040161151c906152fd565b6007546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612112573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612136919061551c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907f02ee4fa0e0f93643fbf0adbcf4f53d3567a808a3b2012fef74dc80db086f6a239060800160405180910390a350505050565b6005546001600160a01b036101009091041633146121c15760405162461bcd60e51b815260040161151c906152fd565b6009546001600160a01b039081169082160361223a5760405162461bcd60e51b815260206004820152603260248201527f4c756e613a2054686520646576656c6f7065722077616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161151c565b612245816001611cdf565b6009546040516001600160a01b038084169216907f88bf70d4f3c446213b5064d7cfe95ec0ed196748f014c19a833117bac32468fd90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b036101009091041633146122d15760405162461bcd60e51b815260040161151c906152fd565b600554604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f193505050501580156119a7573d6000803e3d6000fd5b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0361010090910416331461235b5760405162461bcd60e51b815260040161151c906152fd565b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6005546001600160a01b036101009091041633146123db5760405162461bcd60e51b815260040161151c906152fd565b600b546001600160a01b03908116908216036124545760405162461bcd60e51b815260206004820152603260248201527f4c756e613a20546865206c69717569646974792057616c6c657420697320616c60448201527172656164792074686973206164647265737360701b606482015260840161151c565b6119db816001611cdf565b6005546001600160a01b0361010090910416331461248f5760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160c81b0260ff60c81b19909216919091179055565b6005546001600160a01b036101009091041633146124dd5760405162461bcd60e51b815260040161151c906152fd565b60235481036125495760405162461bcd60e51b815260206004820152603260248201527f4c756e613a2043616e6e6f742075706461746520676173466f7250726f63657360448201527173696e6720746f2073616d652076616c756560701b606482015260840161151c565b6023819055604051819081907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a350565b6005546001600160a01b036101009091041633146125ae5760405162461bcd60e51b815260040161151c906152fd565b601055565b6005546001600160a01b036101009091041633146125e35760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160c01b0260ff60c01b19909216919091179055565b606060048054611452906152c3565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b6005546001600160a01b0361010090910416331461268a5760405162461bcd60e51b815260040161151c906152fd565b815181518082146126dd5760405162461bcd60e51b815260206004820152601960248201527f6c69737473206d75737420686176652073616d652073697a6500000000000000604482015260640161151c565b60005b83518110156117ab578381815181106126fb576126fb61554a565b6020026020010151602a60008784815181106127195761271961554a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555084818151811061276a5761276a61554a565b60200260200101516001600160a01b03167fb9106fbc209b7c7e02cbe18cd9dae6cc424cb412a970afdd18ff8ba07f19bb798583815181106127ae576127ae61554a565b60200260200101516040516127c7911515815260200190565b60405180910390a2806127d981615560565b9150506126e0565b6005546001600160a01b036101009091041633146128115760405162461bcd60e51b815260040161151c906152fd565b6008546001600160a01b03908116908316036128a95760405162461bcd60e51b815260206004820152604b60248201527f4c756e613a205468652050616e63616b655377617020706169722063616e6e6f60448201527f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b6560648201526a744d616b6572506169727360a81b608482015260a40161151c565b6119a7828261412f565b6005546000906001600160a01b036101009091041633146128e65760405162461bcd60e51b815260040161151c906152fd565b81600003612959576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129569190615332565b91505b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285169063a9059cbb906044016020604051808303816000875af11580156129a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cc91906154ff565b949350505050565b6005546001600160a01b03610100909104163314612a045760405162461bcd60e51b815260040161151c906152fd565b60056017819055601881905560026019819055601a8190556001601b819055601c819055601d819055601e819055601f8190556020819055612a5792612a5191908290829082908261381d565b9061381d565b602181905550612a86601a54612a51601d54612a51602054612a51601c5460185461381d90919063ffffffff16565b602255565b60006114e2338461160d856040518060600160405280602581526020016157b3602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614100565b60006114e23384846139a8565b6005546001600160a01b03610100909104163314612b175760405162461bcd60e51b815260040161151c906152fd565b89601781905550866018819055508360198190555082601a8190555081601e8190555080601d8190555088601f819055508560208190555087601b8190555084601c81905550612b86601954612a51601e54612a51601f54612a51601b5460175461381d90919063ffffffff16565b602181905550612bb5601a54612a51601d54612a51602054612a51601c5460185461381d90919063ffffffff16565b602255602154612bd557600e80546001600160f81b031690556000612bed565b600e80546001600160f81b0316600160f81b17905560015b50600060225411612c0957600f805460ff191690556000612c1a565b600f805460ff191660019081179091555b506019602254602154612c2d9190615579565b10612c845760405162461bcd60e51b815260206004820152602160248201527f796f752063616e6e6f74207365742066656573206d6f7265207468656e2032356044820152602560f81b606482015260840161151c565b50505050505050505050565b6005546001600160a01b03610100909104163314612cc05760405162461bcd60e51b815260040161151c906152fd565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db09060240161177d565b6005546001600160a01b03610100909104163314612d225760405162461bcd60e51b815260040161151c906152fd565b6007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1158015612d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d94919061551c565b5050600c80546001600160a01b0319166001600160a01b03858116918217909255600754604051633f1f3fe960e11b815260048101929092529091169150637e3e7fd2906024015b600060405180830381600087803b158015612df657600080fd5b505af1158015612e0a573d6000803e3d6000fd5b505050505050565b6005546001600160a01b03610100909104163314612e425760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160a81b0260ff60a81b19931515600160b01b0260ff60b01b19951515600160a01b029590951662ff00ff60a01b19909316929092179390931791909116179055565b6005546001600160a01b03610100909104163314612ebd5760405162461bcd60e51b815260040161151c906152fd565b60005b82811015612f2e578160286000868685818110612edf57612edf61554a565b9050602002016020810190612ef49190614da4565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580612f2681615560565b915050612ec0565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051612f6293929190615591565b60405180910390a1505050565b6005546001600160a01b03610100909104163314612f9f5760405162461bcd60e51b815260040161151c906152fd565b601155565b6005546001600160a01b03610100909104163314612fd45760405162461bcd60e51b815260040161151c906152fd565b60005b81518110156130e3576000838281518110612ff457612ff461554a565b602002602001015190506000613008600990565b61301390600a6154af565b8484815181106130255761302561554a565b602002602001015161303791906154be565b905061305b6130546005546001600160a01b036101009091041690565b83836142be565b6007546001600160a01b031663e30443bc8361307681612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130bc57600080fd5b505af19250505080156130cd575060015b50505080806130db90615560565b915050612fd7565b505050565b6005546001600160a01b036101009091041633146131185760405162461bcd60e51b815260040161151c906152fd565b600e8054921515600160f81b026001600160f81b03941515600160f01b02949094166001600160f01b0390931692909217929092179055600f805491151560ff19909216919091179055565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611c9e565b6005546001600160a01b036101009091041633146131c75760405162461bcd60e51b815260040161151c906152fd565b600e8054911515600160d81b0260ff60d81b19909216919091179055565b60075460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024016117f0565b6005546001600160a01b036101009091041633146132575760405162461bcd60e51b815260040161151c906152fd565b60075460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c79060240161177d565b6005546001600160a01b036101009091041633146132b85760405162461bcd60e51b815260040161151c906152fd565b6007546001600160a01b03908116908216036133325760405162461bcd60e51b815260206004820152603360248201527f4c756e613a20546865206469766964656e6420747261636b657220616c7265616044820152726479206861732074686174206164647265737360681b606482015260840161151c565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561337f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a391906155ea565b6001600160a01b03161461342f5760405162461bcd60e51b815260206004820152604760248201527f4c756e613a20546865206e6577206469766964656e6420747261636b6572206d60448201527f757374206265206f776e656420627920746865204c756e6120746f6b656e20636064820152661bdb9d1c9858dd60ca1b608482015260a40161151c565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b15801561347157600080fd5b505af1158015613485573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b1580156134ca57600080fd5b505af11580156134de573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561352957600080fd5b505af115801561353d573d6000803e3d6000fd5b5050600d5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b15801561358857600080fd5b505af115801561359c573d6000803e3d6000fd5b50506007546040516001600160a01b03918216935090851691507fbcfaf8fe6449758c7941a8dc064e50f6df533f4808331d1a26ec6231c290986390600090a3600780546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b0361010090910416331461362f5760405162461bcd60e51b815260040161151c906152fd565b600e54600160d01b900460ff161561364657600080fd5b600e805460ff60d01b1916600160d01b8315158102919091179182905560ff91041615611b0e574260265550565b6005546001600160a01b036101009091041633146136a45760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b0381166137095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161151c565b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6005546001600160a01b036101009091041633146137a05760405162461bcd60e51b815260040161151c906152fd565b600e8054921515600160e81b0260ff60e81b19921515600160e01b029290921661ffff60e01b1990931692909217179055565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa1580156116f6573d6000803e3d6000fd5b60008061382a8385615579565b90508381101561387c5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161151c565b9392505050565b6001600160a01b0383166138e55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161151c565b6001600160a01b0382166139465760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161151c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000806014546139b730612310565b600e549111159150600160d01b900460ff16613a44576001600160a01b03851660009081526027602052604090205460ff16613a445760405162461bcd60e51b815260206004820152602660248201527f63616e6e6f74207472616465206265666f726520746865206d61726b6574206f60448201526570656e696e6760d01b606482015260840161151c565b600f5462010000900460ff16613f1e576001600160a01b03851660009081526029602052604090205460ff1615613c06576001600160a01b0384166000908152602860205260409020546001925060ff16613c0157600e54600160e81b900460ff1615613afd57601254831115613afd5760405162461bcd60e51b815260206004820152601d60248201527f6d61784275795478416d6f756e74204c696d6974204578636565646564000000604482015260640161151c565b42602654601e613b0d9190615579565b1015613c0157426026546007613b239190615579565b10613b705760405162461bcd60e51b815260206004820152601960248201527f596f752063616e6e6f7420627579206174206c61756e63682e00000000000000604482015260640161151c565b6010546001600160a01b0385166000908152602b60205260409020544291613b9791615579565b1115613be55760405162461bcd60e51b815260206004820152601f60248201527f596f752063616e6e6f7420646f206d756c74692d627579206f72646572732e00604482015260640161151c565b6001600160a01b0384166000908152602b602052604090204290555b613d21565b6001600160a01b03841660009081526029602052604090205460ff1615613d2157600e5460029250600160b81b900460ff168015613c595750600854600090613c57906001600160a01b0316612310565b115b8015613c675750600f5460ff165b15613c9d57808015613c88575042601654602554613c859190615579565b11155b15613c9d5742602555601554613c9d90614441565b6001600160a01b03851660009081526028602052604090205460ff16613d2157600e54600160e01b900460ff1615613d2157601354831115613d215760405162461bcd60e51b815260206004820152601e60248201527f6d617853656c6c5478416d6f756e74204c696d69742045786365656465640000604482015260640161151c565b600f54610100900460ff1615613dab5760245483613d3e86612310565b613d489190615579565b111580613d6d57506001600160a01b0384166000908152602a602052604090205460ff165b613dab5760405162461bcd60e51b815260206004820152600f60248201526e1b585e15d85b1b195d081b1a5b5a5d608a1b604482015260640161151c565b600e54600160f01b900460ff1615613f1e57816001148015613dd65750600e54600160f81b900460ff165b8015613dfb57506001600160a01b03841660009081526028602052604090205460ff16155b15613e73576000606460215485613e1291906154be565b613e1c91906154dd565b9050613e288185615607565b93506000602154601e5483613e3d91906154be565b613e4791906154dd565b9050613e548730846142be565b600d54613e6c9030906001600160a01b0316836142be565b5050613f1e565b816002148015613e855750600f5460ff165b8015613eaa57506001600160a01b03851660009081526028602052604090205460ff16155b15613f1e576000606460225485613ec191906154be565b613ecb91906154dd565b9050613ed78185615607565b93506000602254601d5483613eec91906154be565b613ef691906154dd565b9050613f038730846142be565b600d54613f1b9030906001600160a01b0316836142be565b50505b613f298585856142be565b6007546001600160a01b031663e30443bc86613f4481612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613f8a57600080fd5b505af1925050508015613f9b575060015b506007546001600160a01b031663e30443bc85613fb781612310565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ffd57600080fd5b505af192505050801561400e575060015b50600f5462010000900460ff161580156140315750600e54600160c01b900460ff165b156117ab576023546007546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af19250505080156140a3575060408051601f3d908101601f191682019092526140a09181019061551c565b60015b15612e0a5760408051848152602081018490529081018290526060810185905232906001907f02ee4fa0e0f93643fbf0adbcf4f53d3567a808a3b2012fef74dc80db086f6a239060800160405180910390a3505050505050505050565b600081848411156141245760405162461bcd60e51b815260040161151c9190614d0e565b506129cc8385615607565b6005546001600160a01b0361010090910416331461415f5760405162461bcd60e51b815260040161151c906152fd565b6001600160a01b03821660009081526029602052604090205481151560ff9091161515036141f55760405162461bcd60e51b815260206004820152603e60248201527f4c756e613a204175746f6d61746564206d61726b6574206d616b65722070616960448201527f7220697320616c72656164792073657420746f20746861742076616c75650000606482015260840161151c565b6001600160a01b0382166000908152602960205260409020805460ff191682158015919091179091556142825760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561426957600080fd5b505af115801561427d573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b0383166143225760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161151c565b6001600160a01b0382166143845760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161151c565b6143c181604051806060016040528060268152602001615765602691396001600160a01b0386166000908152602081905260409020549190614100565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143f0908261381d565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161399b565b600f805462ff00001916620100001790556018546000906064906144669084906154be565b61447091906154dd565b90506000606483601d5461448491906154be565b61448e91906154dd565b9050600060026064856020546144a491906154be565b6144ae91906154dd565b6144b891906154dd565b9050600081836144c88688615607565b6144d29190615607565b6144dc9190615607565b90506144e7816147e8565b600a546144ff9030906001600160a01b0316856142be565b600e544790600160a01b900460ff16801561451c57506000601c54115b156145e857600061454460225461453e601c548561490c90919063ffffffff16565b9061498e565b6009546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114614596576040519150601f19603f3d011682016040523d82523d6000602084013e61459b565b606091505b5050905080156145d9576040518281527fbfb2667b387ada10740ee93384bd3392b9b402d6f5d4c291fb6beca77276cb0d9060200160405180910390a15b6145e38284615607565b925050505b600e54600160a81b900460ff16801561460357506000601a54115b156146c957600061462560225461453e601a548561490c90919063ffffffff16565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114614677576040519150601f19603f3d011682016040523d82523d6000602084013e61467c565b606091505b5050905080156146ba576040518281527f14c3945b0e552cb130d2e123df9730f5b69c4872acd0fc354d63649227d61f129060200160405180910390a15b6146c48284615607565b925050505b600e54600160b01b900460ff161561471c5760006146f860225461453e6020548561490c90919063ffffffff16565b9050600581111561471a5761470d84826149e9565b6147178183615607565b91505b505b600e54600160c01b900460ff16156147d4576402540be4008111156147d45761474481614a96565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561478d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147b19190615332565b600c546007549192506147d2916001600160a01b0391821691168084614bf5565b505b5050600f805462ff00001916905550505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061481d5761481d61554a565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061489a91906155ea565b816001815181106148ad576148ad61554a565b6001600160a01b0392831660209182029290920101526006546148d39130911684613883565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790612ddc908590600090869030904290600401615662565b60008260000361491e575060006114e6565b600061492a83856154be565b90508261493785836154dd565b1461387c5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161151c565b60008082116149df5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015260640161151c565b61387c82846154dd565b600654614a019030906001600160a01b031684613883565b600654600b5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614a71573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117ab919061551c565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b2491906155ea565b81600081518110614b3757614b3761554a565b6001600160a01b039283166020918202929092010152600c54825191169082906001908110614b6857614b6861554a565b6001600160a01b039283166020918202929092010152600654604051637ff36ab560e01b8152911690637ff36ab5908490614bae9060009086903090429060040161569e565b60006040518083038185885af1158015614bcc573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526130e391908101906156d3565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000919086169063a9059cbb906044016020604051808303816000875af1158015614c48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c6c91906154ff565b905080156117ab57604051633243c79160e01b8152600481018390526001600160a01b03841690633243c79190602401600060405180830381600087803b158015614cb657600080fd5b505af1158015614cca573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b182604051614cff91815260200190565b60405180910390a15050505050565b600060208083528351808285015260005b81811015614d3b57858101830151858201604001528201614d1f565b81811115614d4d576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114611b0e57600080fd5b60008060408385031215614d8b57600080fd5b8235614d9681614d63565b946020939093013593505050565b600060208284031215614db657600080fd5b813561387c81614d63565b600080600060608486031215614dd657600080fd5b8335614de181614d63565b92506020840135614df181614d63565b929592945050506040919091013590565b8015158114611b0e57600080fd5b60008060408385031215614e2357600080fd5b8235614e2e81614d63565b91506020830135614e3e81614e02565b809150509250929050565b600060208284031215614e5b57600080fd5b5035919050565b60008060408385031215614e7557600080fd5b8235614d9681614e02565b60008060008060808587031215614e9657600080fd5b8435614ea181614e02565b966020860135965060408601359560600135945092505050565b60008060408385031215614ece57600080fd5b50508035926020909101359150565b600060208284031215614eef57600080fd5b813561387c81614e02565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f3957614f39614efa565b604052919050565b600067ffffffffffffffff821115614f5b57614f5b614efa565b5060051b60200190565b600082601f830112614f7657600080fd5b81356020614f8b614f8683614f41565b614f10565b82815260059290921b84018101918181019086841115614faa57600080fd5b8286015b84811015614fce578035614fc181614d63565b8352918301918301614fae565b509695505050505050565b60008060408385031215614fec57600080fd5b823567ffffffffffffffff8082111561500457600080fd5b61501086838701614f65565b935060209150818501358181111561502757600080fd5b85019050601f8101861361503a57600080fd5b8035615048614f8682614f41565b81815260059190911b8201830190838101908883111561506757600080fd5b928401925b8284101561508e57833561507f81614e02565b8252928401929084019061506c565b80955050505050509250929050565b6000806000806000806000806000806101408b8d0312156150bd57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b60008060006060848603121561511a57600080fd5b833561512581614e02565b9250602084013561513581614e02565b9150604084013561514581614e02565b809150509250925092565b60008060006040848603121561516557600080fd5b833567ffffffffffffffff8082111561517d57600080fd5b818601915086601f83011261519157600080fd5b8135818111156151a057600080fd5b8760208260051b85010111156151b557600080fd5b6020928301955093505084013561514581614e02565b600080604083850312156151de57600080fd5b823567ffffffffffffffff808211156151f657600080fd5b61520286838701614f65565b935060209150818501358181111561521957600080fd5b85019050601f8101861361522c57600080fd5b803561523a614f8682614f41565b81815260059190911b8201830190838101908883111561525957600080fd5b928401925b8284101561508e5783358252928401929084019061525e565b6000806040838503121561528a57600080fd5b823561529581614d63565b91506020830135614e3e81614d63565b600080604083850312156152b857600080fd5b8235614e2e81614e02565b600181811c908216806152d757607f821691505b6020821081036152f757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561534457600080fd5b5051919050565b600080600080600080600080610100898b03121561536857600080fd5b885161537381614d63565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156154065781600019048211156153ec576153ec6153b5565b808516156153f957918102915b93841c93908002906153d0565b509250929050565b60008261541d575060016114e6565b8161542a575060006114e6565b8160018114615440576002811461544a57615466565b60019150506114e6565b60ff84111561545b5761545b6153b5565b50506001821b6114e6565b5060208310610133831016604e8410600b8410161715615489575081810a6114e6565b61549383836153cb565b80600019048211156154a7576154a76153b5565b029392505050565b600061387c60ff84168361540e565b60008160001904831182151516156154d8576154d86153b5565b500290565b6000826154fa57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561551157600080fd5b815161387c81614e02565b60008060006060848603121561553157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201615572576155726153b5565b5060010190565b6000821982111561558c5761558c6153b5565b500190565b6040808252810183905260008460608301825b868110156155d45782356155b781614d63565b6001600160a01b03168252602092830192909101906001016155a4565b5080925050508215156020830152949350505050565b6000602082840312156155fc57600080fd5b815161387c81614d63565b600082821015615619576156196153b5565b500390565b600081518084526020808501945080840160005b838110156156575781516001600160a01b031687529582019590820190600101615632565b509495945050505050565b85815284602082015260a06040820152600061568160a083018661561e565b6001600160a01b0394909416606083015250608001529392505050565b8481526080602082015260006156b7608083018661561e565b6001600160a01b03949094166040830152506060015292915050565b600060208083850312156156e657600080fd5b825167ffffffffffffffff8111156156fd57600080fd5b8301601f8101851361570e57600080fd5b805161571c614f8682614f41565b81815260059190911b8201830190838101908783111561573b57600080fd5b928401925b8284101561575957835182529284019290840190615740565b97965050505050505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212206f599188407554dcb4cc27ec80b0f9337faf328c920e3053abf767595830cea264736f6c634300080f0033

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.