ETH Price: $3,912.57 (+3.43%)

Token

ERC-20: Joe Rogan ($ROGAN)
 

Overview

Max Total Supply

79,404,157.916396112471701955 $ROGAN

Holders

126

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.132282349213065568 $ROGAN

Value
$0.00
0x66ad704a2897c9ff257bbdcf099dba98117a1bdf
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:
ROGEN_ETH

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 800 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 13 : ROGEN_ETH.sol
/*

⠀⠀⠀⠀⢀⣠⣴⣶⣦⣤⣄⡀⠀⠀⠀⠀
⠀⠀⢀⣼⣿⣿⣼⣿⣿⣿⣿⣿⣤⠀⠀⠀
⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀
⠀⣿⣿⣿⣾⣟⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀
⢐⠟⠛⠿⢿⣯⣿⡿⠿⠿⣿⣿⣿⣿⡇⠀
⢸⢷⣩⣁⡀⣽⣾⣎⣍⣹⣳⣽⣿⡟⣔⡁
⠘⣾⣿⣿⡇⣿⣯⢿⣿⣟⣽⣿⣿⡇⣝⡑
⠘⣿⣿⣿⡓⢿⠿⢯⡿⣿⣿⣿⣿⣧⡗⠀
⠘⡟⣿⡿⠿⠴⠿⢿⢿⣎⡿⣿⢟⡅⠀⠀
⠀⠐⠘⣿⣾⣭⣭⣷⣿⠟⣝⣵⠟⠀⠀⠀
⠀⠀⠀⢻⣿⣿⣿⣿⡏⣾⡟⠃⠀⠀⠀⠀
⠀⠀⠀⠀⠈⠩⠍⠉⠚⠉⠀⠀⠀⠀⠀⠀
JOE ROGAN - Meme Token Madness! 
(Concept by Bonedogg)

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";
import "./CF_Recoverable.sol";
import "./CF_Burnable.sol";
import "./CF_Whitelist.sol";
import "./CF_MaxTx.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract ROGEN_ETH is CF_Common, CF_Ownable, CF_ERC20, CF_Recoverable, CF_Burnable, CF_Whitelist, CF_MaxTx, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"Joe Rogan";
    _symbol = unicode"$ROGAN";
    _decimals = 18;
    _totalSupply = 100000000000000000000000000; // 100,000,000 $ROGAN
    _transferOwnership(0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe);
    _transferInitialSupply(0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe, 84000); // 84%
    _transferInitialSupply(0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41, 6000); // 6%
    _transferInitialSupply(0x1aDc4fbFe3B7B1c53b6e87Ec9ce902b188512849, 3300); // 3.3%
    _transferInitialSupply(0xD8f2DC01898b2A9D0A6d3fCc030C9468229c66e0, 3300); // 3.3%
    _transferInitialSupply(0xA060c07c326Db2bdc6Ce26C04efB24735C8eA8DB, 3400); // 3.4%
    _setDEXRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xAFe5C603a3dd5B44855Fc2f6294075B4410A37fe);
    _setEarlyPenaltyTime(600); // 10min
    _setTaxToken(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _setAutoSwapPercent(100, 500); // 0.1% -> 0.5% of total supply
    _autoSwapEnabled = true;
    _setTaxBeneficiary(0, 0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41, [ uint24(0), uint24(2000), uint24(2000) ], [ uint24(50000), uint24(50000), uint24(50000) ]); // Marketing 
    _setTaxBeneficiary(1, 0x000000000000000000000000000000000000dEaD, [ uint24(0), uint24(1000), uint24(1000) ], [ uint24(0), uint24(0), uint24(0) ]); // Burn
    _setTaxBeneficiary(2, _dex.pair, [ uint24(0), uint24(1000), uint24(1000) ], [ uint24(0), uint24(0), uint24(0) ]); // LP
    _initialWhitelist([ 0x04D4277ebc0EB8A200b1a969d3c1fb43e5449A41 ]);
    _setMaxBalancePercent(2000); // 2% of total supply
    _initialized = true;
  }

  function _transfer(address from, address to, uint256 amount) internal virtual override {
    if (to == address(0xdEaD)) {
      _burn(from, amount);

      return;
    }

    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute();
    }

    if (amount > 0 && !_whitelisted[from] && !_whitelisted[to] && from != address(this) && to != address(this) && to != _dex.router) {
      require((from != _dex.pair && to != _dex.pair) || ((from == _dex.pair || to == _dex.pair) && _tradingEnabled > 0), "Trading disabled");

      unchecked {
        require(_maxTxAmount == 0 || amount <= _maxTxAmount, "Exceeds maxTx");
        require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance");

        if (!_suspendTaxes && !_distributing && !_swapping) {
          uint256 appliedTax;
          uint8 taxType;

          if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; }

          address _account = taxType == 1 ? to : from;

          if (_tradingEnabled + _earlyPenaltyTime >= _timestamp() && !_holder[_account].penalty) { _holder[_account].penalty = true; }

          for (uint8 i; i < 5; i++) {
            uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? (_holder[_account].penalty ? _taxBeneficiary[i].penalty[1] : _taxBeneficiary[i].percent[1]) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[2] : _taxBeneficiary[i].percent[2])) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[0] : _taxBeneficiary[i].percent[0]));

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

            super._transfer(from, address(this), taxAmount);

            if (_taxBeneficiary[i].account == _dex.pair) {
              _amountForLiquidity += taxAmount;
            } else if (_taxBeneficiary[i].account == address(0xdEaD)) {
              _burn(address(this), taxAmount);
            } else {
              _taxBeneficiary[i].unclaimed += taxAmount;
              _amountForTaxDistribution += taxAmount;
              _totalTaxUnclaimed += taxAmount;
            }

            appliedTax += taxAmount;
          }

          if (appliedTax > 0) {
            _totalTaxCollected += appliedTax;

            amount -= appliedTax;
          }
        }
      }
    }

    super._transfer(from, to, amount);
  }

  function _burn(address account, uint256 amount) internal virtual override {
    super._burn(account, amount);

    _setMaxTxPercent(_maxTxPercent);
    _setMaxBalancePercent(_maxBalancePercent);
    _setAutoSwapPercent(_minAutoSwapPercent, _maxAutoSwapPercent);
  }

  function _transferInitialSupply(address account, uint24 percent) private {
    require(!_initialized);

    uint256 amount = _percentage(_totalSupply, uint256(percent));

    _balance[account] = amount;

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

  /// @notice Returns a list specifying the renounce status of each feature
  function renounced() external view returns (bool Whitelist, bool MaxTx, bool MaxBalance, bool DEXRouterV2, bool Taxable) {
    return (_renounced.Whitelist, _renounced.MaxTx, _renounced.MaxBalance, _renounced.DEXRouterV2, _renounced.Taxable);
  }

  /// @notice Returns basic information about this Smart-Contract
  function info() external view returns (string memory name, string memory symbol, uint8 decimals, address owner, uint256 totalSupply, string memory version) {
    return (_name, _symbol, _decimals, _owner, _totalSupply, _version);
  }

  receive() external payable { }
  fallback() external payable { }
}

/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ \/ __ `/ / __ \/ /_  / __ `/ ___/ __/ __ \/ ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   
  Smart-Contract generated and deployed by ChainFactory

  Web:      https://chainfactory.app/
  X:        https://x.com/ChainFactoryApp
  Telegram: https://t.me/ChainFactory
  Discord:  https://discord.gg/fpjxD39v3k
  YouTube:  https://youtube.com/@UpfrontDeFi

  By using this Smart-Contract generated and deployed by ChainFactory,
  you acknowledge and agree that ChainFactory shall not be liable for any
  damages arising from the use of this Smart-Contract, including but not
  limited to any damages resulting from any malicious or illegal use of
  the Smart-Contract by any third party or by the owner.

  The owner of the Smart-Contract generated by ChainFactory agrees not to
  misuse the Smart-Contract, including but not limited to:

  - Using the Smart-Contract to engage in any illegal or fraudulent
    activity, including but not limited to scams, theft, or money
    laundering.

  - Using the Smart-Contract in any manner that could cause harm to
    others, including but not limited to disrupting financial
    markets or causing financial loss to others.

  - Using the Smart-Contract to infringe upon the intellectual
    property rights of others, including but not limited to
    copyright, trademark, or patent infringement.

  The owner of the Smart-Contract generated by ChainFactory acknowledges
  that any misuse of the Smart-Contract may result in legal action,
  and agrees to indemnify and hold harmless ChainFactory from any and all
  claims, damages, or expenses arising from any such misuse.

*/

File 2 of 13 : CF_Common.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./IDEXV2.sol";
import "./IERC20.sol";

abstract contract CF_Common {
  string internal constant _version = "1.0.1";

  mapping(address => uint256) internal _balance;
  mapping(address => mapping(address => uint256)) internal _allowance;
  mapping(address => bool) internal _whitelisted;
  mapping(address => holderAccount) internal _holder;
  mapping(uint8 => taxBeneficiary) internal _taxBeneficiary;

  address[] internal _holders;

  bool internal _autoSwapEnabled;
  bool internal _swapping;
  bool internal _suspendTaxes;
  bool internal _distributing;
  bool internal immutable _initialized;

  uint8 internal immutable _decimals;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxTxPercent;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minAutoSwapPercent;
  uint24 internal _maxAutoSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint256 internal _totalSupply;
  uint256 internal _totalBurned;
  uint256 internal _maxTxAmount;
  uint256 internal _maxBalanceAmount;
  uint256 internal _minAutoSwapAmount;
  uint256 internal _maxAutoSwapAmount;
  uint256 internal _amountForLiquidity;
  uint256 internal _totalTaxCollected;
  uint256 internal _totalTaxUnclaimed;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _amountSwappedForTaxDistribution;
  uint256 internal _ethForTaxDistribution;
  uint256 internal _tokensForTaxDistribution;

  struct Renounced {
    bool Whitelist;
    bool MaxTx;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
  }

  struct taxBeneficiary {
    bool exists;
    address account;
    uint24[3] percent; // 0: tx, 1: buy, 2: sell
    uint24[3] penalty;
    uint256 unclaimed;
  }

  struct DEXRouterV2 {
    address router;
    address pair;
    address WETH;
    address receiver;
  }

  Renounced internal _renounced;
  IERC20 internal _taxToken;
  DEXRouterV2 internal _dex;

  function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) {
    unchecked {
      return (amount * bps) / (100 * uint256(_denominator));
    }
  }

  function _timestamp() internal view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }

  function denominator() external pure returns (uint24) {
    return _denominator;
  }

  function version() external pure returns (string memory) {
    return _version;
  }
}

File 3 of 13 : CF_Ownable.sol
// SPDX-License-Identifier: MIT

import "./CF_Common.sol";

pragma solidity 0.8.24;

abstract contract CF_Ownable is CF_Common {
  address internal _owner;

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

  modifier onlyOwner() {
    require(_owner == msg.sender, "Unauthorized");

    _;
  }

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

  function renounceOwnership() external onlyOwner {
    _renounced.Whitelist = true;
    _renounced.MaxTx = true;
    _renounced.MaxBalance = true;
    _renounced.Taxable = true;
    _renounced.DEXRouterV2 = true;

    _transferOwnership(address(0));
  }

  function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0));

    _transferOwnership(newOwner);
  }

  function _transferOwnership(address newOwner) internal {
    address oldOwner = _owner;
    _owner = newOwner;

    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

File 4 of 13 : CF_ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";

abstract contract CF_ERC20 is CF_Common {
  string internal _name;
  string internal _symbol;

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

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

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

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

  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balance[account];
  }

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

  function approve(address spender, uint256 amount) external returns (bool) {
    _approve(msg.sender, spender, amount);

    return true;
  }

  function transfer(address to, uint256 amount) external returns (bool) {
    _transfer(msg.sender, to, amount);

    return true;
  }

  function transferFrom(address from, address to, uint256 amount) external returns (bool) {
    _spendAllowance(from, msg.sender, amount);
    _transfer(from, to, amount);

    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
    unchecked {
      _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
    }

    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    uint256 currentAllowance = allowance(msg.sender, spender);

    require(currentAllowance >= subtractedValue, "Negative allowance");

    unchecked {
      _approve(msg.sender, spender, currentAllowance - subtractedValue);
    }

    return true;
  }

  function _approve(address owner, address spender, uint256 amount) internal {
    _allowance[owner][spender] = amount;

    emit Approval(owner, spender, amount);
  }

  function _spendAllowance(address owner, address spender, uint256 amount) internal {
    uint256 currentAllowance = allowance(owner, spender);

    require(currentAllowance >= amount, "Insufficient allowance");

    unchecked {
      _approve(owner, spender, currentAllowance - amount);
    }
  }

  function _transfer(address from, address to, uint256 amount) internal virtual {
    require(from != address(0) && to != address(0), "Transfer from/to zero address");
    require(_balance[from] >= amount, "Exceeds balance");

    if (amount > 0) {
      unchecked {
        _balance[from] -= amount;
        _balance[to] += amount;
      }
    }

    emit Transfer(from, to, amount);
  }
}

File 5 of 13 : CF_Recoverable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Recoverable is CF_Common, CF_Ownable {
  /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance
  /// @dev Beware of scam tokens!
  /// @dev Note that if the token of this contract is specified, amounts allocated for tax distribution and liquidity are reserved
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  function recoverERC20(address token, address to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_taxToken) == token ? _tokensForTaxDistribution : 0);

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    IERC20(token).transfer(to, amount);
  }

  /// @notice Recovers a misplaced amount of native tokens sitting in the contract balance
  /// @dev Note that if the reflection token is the wrapped native, amounts allocated for tax distribution and/or liquidity are reserved
  /// @param to Recipient
  /// @param amount Amount of native tokens to be transferred
  function recoverNative(address payable to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = address(this).balance;
      uint256 allocated = address(_taxToken) == _dex.WETH ? _ethForTaxDistribution : 0;

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    (bool success, ) = to.call{ value: amount }("");

    require(success);
  }
}

File 6 of 13 : CF_Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_ERC20.sol";

abstract contract CF_Burnable is CF_Common, CF_ERC20 {
  /// @notice Total amount of tokens burned so far
  function totalBurned() external view returns (uint256) {
    return _totalBurned;
  }

  function burn(uint256 amount) external {
    _burn(msg.sender, amount);
  }

  function burnFrom(address account, uint256 amount) external {
    _spendAllowance(account, msg.sender, amount);
    _burn(account, amount);
  }

  function _burn(address account, uint256 amount) internal virtual {
    require(_balance[account] >= amount, "Exceeds balance");

    unchecked {
      _balance[account] -= amount;
      _totalSupply -= amount;
      _totalBurned += amount;
    }

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

File 7 of 13 : CF_Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Whitelist is CF_Common, CF_Ownable {
  event Whitelisted(address indexed account, bool status);
  event RenouncedWhitelist();

  /// @notice Permanently renounce and prevent the owner from being able to update the whitelist
  /// @dev Existing entries will continue to be effective
  function renounceWhitelist() external onlyOwner {
    _renounced.Whitelist = true;

    emit RenouncedWhitelist();
  }

  /// @notice Check if an address is whitelisted
  /// @param account Address to check
  function isWhitelisted(address account) external view returns (bool) {
    return _whitelisted[account];
  }

  /// @notice Add or remove an address from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address account, bool status) public onlyOwner {
    _whitelist(account, status);
  }

  function _whitelist(address account, bool status) internal {
    require(!_renounced.Whitelist);
    require(account != address(0) && account != address(0xdEaD));
    require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged");


    _whitelisted[account] = status;

    emit Whitelisted(account, status);
  }

  /// @notice Add or remove multiple addresses from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address[] calldata accounts, bool status) external onlyOwner {
    unchecked {
      uint256 cnt = accounts.length;

      for (uint256 i; i < cnt; i++) { _whitelist(accounts[i], status); }
    }
  }

  function _initialWhitelist(address[1] memory accounts) internal {
    require(!_initialized);

    unchecked {
      for (uint256 i; i < 1; i++) { _whitelist(accounts[i], true); }
    }
  }
}

File 8 of 13 : CF_MaxTx.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_MaxTx is CF_Common, CF_Ownable {
  event SetMaxTxPercent(uint24 percent);
  event RenouncedMaxTx();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. transferable amount
  /// @dev Existing settings will continue to be effective
  function renounceMaxTx() external onlyOwner {
    _renounced.MaxTx = true;

    emit RenouncedMaxTx();
  }

  /// @notice Percentage of the max. transferable amount, depending on total supply
  function getMaxTxPercent() external view returns (uint24) {
    return _maxTxPercent;
  }

  /// @notice Set the max. percentage of a transferable amount, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable)
  function setMaxTxPercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxTx);

    unchecked {
      require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator));
    }

    _setMaxTxPercent(percent);

    emit SetMaxTxPercent(percent);
  }

  function _setMaxTxPercent(uint24 percent) internal {
    _maxTxPercent = percent;
    _maxTxAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxTxPercent(percent); }
  }
}

File 9 of 13 : CF_MaxBalance.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_MaxBalance is CF_Common, CF_Ownable {
  event SetMaxBalancePercent(uint24 percent);
  event RenouncedMaxBalance();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. balance
  /// @dev Existing settings will continue to be effective
  function renounceMaxBalance() external onlyOwner {
    _renounced.MaxBalance = true;

    emit RenouncedMaxBalance();
  }

  /// @notice Percentage of the max. balance per wallet, depending on total supply
  function getMaxBalancePercent() external view returns (uint24) {
    return _maxBalancePercent;
  }

  /// @notice Set the max. percentage of a wallet balance, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable)
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

    unchecked {
      require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator));
    }

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

  function _setMaxBalancePercent(uint24 percent) internal {
    _maxBalancePercent = percent;
    _maxBalanceAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxBalancePercent(percent); }
  }
}

File 10 of 13 : CF_Taxable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_Taxable is CF_Common, CF_Ownable, CF_ERC20 {
  event SetTaxBeneficiary(uint8 slot, address account, uint24[3] percent, uint24[3] penalty);
  event SetEarlyPenaltyTime(uint32 time);
  event TaxDistributed(uint256 amount);
  event RenouncedTaxable();

  struct taxBeneficiaryView {
    address account;
    uint24[3] percent;
    uint24[3] penalty;
    uint256 unclaimed;
  }

  modifier lockDistributing {
    _distributing = true;
    _;
    _distributing = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the tax features
  /// @dev Existing settings will continue to be effective
  function renounceTaxable() external onlyOwner {
    _renounced.Taxable = true;

    emit RenouncedTaxable();
  }

  /// @notice Total amount of taxes collected so far
  function totalTaxCollected() external view returns (uint256) {
    return _totalTaxCollected;
  }

  /// @notice Tax applied per transfer
  /// @dev Taking in consideration your wallet address
  function txTax() external view returns (uint24) {
    return txTax(msg.sender);
  }

  /// @notice Tax applied per transfer
  /// @param from Sender address
  function txTax(address from) public view returns (uint24) {
    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyTxTax : _totalTxTax);
    }
  }

  /// @notice Tax applied for buying
  /// @dev Taking in consideration your wallet address
  function buyTax() external view returns (uint24) {
    return buyTax(msg.sender);
  }

  /// @notice Tax applied for buying
  /// @param from Buyer's address
  function buyTax(address from) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyBuyTax : _totalBuyTax);
    }
  }
  /// @notice Tax applied for selling
  /// @dev Taking in consideration your wallet address
  function sellTax() external view returns (uint24) {
    return sellTax(msg.sender);
  }

  /// @notice Tax applied for selling
  /// @param to Seller's address
  function sellTax(address to) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return to == address(this) || _whitelisted[to] || to == _dex.pair || to == _dex.router ? 0 : (_holder[to].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltySellTax : _totalSellTax);
    }
  }

  /// @notice List of all tax beneficiaries and their assigned percentage, according to type of transfer
  /// @custom:return `list[].account` Beneficiary address
  /// @custom:return `list[].percent[3]` Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @custom:return `list[].penalty[3]` Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) {
    list = new taxBeneficiaryView[](5);

    unchecked {
      for (uint8 i; i < 5; i++) { list[i] = taxBeneficiaryView(_taxBeneficiary[i].account, _taxBeneficiary[i].percent, _taxBeneficiary[i].penalty, _taxBeneficiary[i].unclaimed); }
    }
  }

  /// @notice Sets a tax beneficiary
  /// @dev Maximum of 5 wallets can be assigned
  /// @param slot Slot number (0 to 4)
  /// @param account Beneficiary address
  /// @param percent[3] Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @param penalty[3] Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) external onlyOwner {
    require(!_renounced.Taxable);

    _setTaxBeneficiary(slot, account, percent, penalty);
  }

  function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) internal {
    require(slot < 5);
    require(account != address(this) && account != address(0));

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

    if (account == address(0xdEaD) && _taxBeneficiary.unclaimed > 0) { revert("Unclaimed taxes"); }

    unchecked {
      _totalTxTax += percent[0] - _taxBeneficiary.percent[0];
      _totalBuyTax += percent[1] - _taxBeneficiary.percent[1];
      _totalSellTax += percent[2] - _taxBeneficiary.percent[2];
      _totalPenaltyTxTax += penalty[0] - _taxBeneficiary.penalty[0];
      _totalPenaltyBuyTax += penalty[1] - _taxBeneficiary.penalty[1];
      _totalPenaltySellTax += penalty[2] - _taxBeneficiary.penalty[2];

      require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax");
      require(_totalPenaltyTxTax <= 100 * _denominator && _totalPenaltyBuyTax <= 100 * _denominator && _totalPenaltySellTax <= 100 * _denominator, "Invalid Penalty");
    }

    _taxBeneficiary.account = account;
    _taxBeneficiary.percent = percent;
    _taxBeneficiary.penalty = penalty;

    if (!_taxBeneficiary.exists) { _taxBeneficiary.exists = true; }

    emit SetTaxBeneficiary(slot, account, percent, penalty);
  }

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution
  function autoTaxDistribute() external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require(!_swapping && !_distributing);

    _autoTaxDistribute();
  }

  function _autoTaxDistribute() internal lockDistributing {
    if (_totalTaxUnclaimed == 0) { return; }

    unchecked {
      uint256 distributedTaxes;

      for (uint8 i; i < 5; i++) {
        address account = _taxBeneficiary[i].account;

        if (_taxBeneficiary[i].unclaimed == 0 || account == address(0xdEaD) || account == _dex.pair) { continue; }

        uint256 unclaimed = _percentage(address(_taxToken) == address(this) ? _amountForTaxDistribution : _amountSwappedForTaxDistribution, (100 * uint256(_denominator) * _taxBeneficiary[i].unclaimed) / _totalTaxUnclaimed);
        uint256 _distributedTaxes = _distribute(account, unclaimed);

        if (_distributedTaxes > 0) {
          _taxBeneficiary[i].unclaimed -= _distributedTaxes;
          distributedTaxes += _distributedTaxes;
        }
      }

      _lastTaxDistribution = _timestamp();

      if (distributedTaxes > 0) { _totalTaxUnclaimed -= distributedTaxes; }

      emit TaxDistributed(distributedTaxes);
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    if (unclaimed == 0) { return 0; }

    unchecked {
      if (address(_taxToken) == address(this)) {
        if (_maxBalanceAmount > 0 && _balance[account] + unclaimed > _maxBalanceAmount && !_whitelisted[account]) {
          unclaimed = _maxBalanceAmount > _balance[account] ? _maxBalanceAmount - _balance[account] : 0;

          if (unclaimed == 0) { return 0; }
        }

        super._transfer(address(this), account, unclaimed);

        _amountForTaxDistribution -= unclaimed;
      } else {
        uint256 percent = (100 * uint256(_denominator) * unclaimed) / _amountSwappedForTaxDistribution;
        uint256 amount;

        if (address(_taxToken) == _dex.WETH) {
          amount = _percentage(_ethForTaxDistribution, percent);

          (bool success, ) = payable(account).call{ value: amount, gas: 30000 }("");

          if (!success) { return 0; }

          _ethForTaxDistribution -= amount;
        } else {
          amount = _percentage(_tokensForTaxDistribution, percent);

          try _taxToken.transfer(account, amount) { _tokensForTaxDistribution -= amount; } catch { return 0; }
        }

        _amountSwappedForTaxDistribution -= unclaimed;
      }
    }

    return unclaimed;
  }

  /// @notice Suspend or reinstate tax collection
  /// @dev Also applies to early penalties
  /// @param status True to suspend, False to reinstate existent taxes
  function suspendTaxes(bool status) external onlyOwner {
    require(!_renounced.Taxable);

    _suspendTaxes = status;
  }

  /// @notice Checks if tax collection is currently suspended
  function taxesSuspended() external view returns (bool) {
    return _suspendTaxes;
  }

  /// @notice Removes the penalty status of a wallet
  /// @param account Address to depenalize
  function removePenalty(address account) external onlyOwner {
    require(!_renounced.Taxable);

    _holder[account].penalty = false;
  }

  /// @notice Check if a wallet is penalized due to an early transaction
  /// @param account Address to check
  function isPenalized(address account) external view returns (bool) {
    return _holder[account].penalty;
  }

  /// @notice Returns the period of time during which early buyers will be penalized from the time trading was enabled
  function getEarlyPenaltyTime() external view returns (uint32) {
    return _earlyPenaltyTime;
  }

  /// @notice Defines the period of time during which early buyers will be penalized from the time trading was enabled
  /// @dev Must be less or equal to 1 hour
  /// @param time Time, in seconds
  function setEarlyPenaltyTime(uint32 time) external onlyOwner {
    require(!_renounced.Taxable);
    require(time <= 600);

    _setEarlyPenaltyTime(time);
  }

  function _setEarlyPenaltyTime(uint32 time) internal {
    _earlyPenaltyTime = time;

    emit SetEarlyPenaltyTime(time);
  }
}

File 11 of 13 : CF_DEXRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_DEXRouterV2 is CF_Common, CF_Ownable, CF_ERC20 {
  event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForNative(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForTokens(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouterV2(address indexed router, address indexed pair, address receiver);
  event RenouncedDEXRouterV2();

  modifier lockSwapping {
    _swapping = true;
    _;
    _swapping = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the DEX features
  /// @dev Existing settings will continue to be effective
  function renounceDEXRouterV2() external onlyOwner {
    _renounced.DEXRouterV2 = true;

    emit RenouncedDEXRouterV2();
  }

  /// @notice Sets the DEX router and where to receive the LP tokens
  /// @param router Address of the DEX router
  /// @param receiver Address of the LP tokens receiver
  function setDEXRouterV2(address router, address receiver) external onlyOwner returns (address) {
    require(!_renounced.DEXRouterV2);

    return _setDEXRouterV2(router, receiver);
  }

  function _setDEXRouterV2(address router, address receiver) internal returns (address) {
    require(router != address(0));

    if (_dex.router != router) {
      IDEXRouterV2 _router = IDEXRouterV2(router);
      IDEXFactoryV2 factory = IDEXFactoryV2(_router.factory());
      address WETH = _router.WETH();
      address pair = factory.getPair(address(this), WETH);

      if (pair == address(0)) { pair = factory.createPair(address(this), WETH); }

      _dex = DEXRouterV2(router, pair, WETH, receiver);
    }

    if (receiver != _dex.receiver) { _dex.receiver = receiver; }

    emit SetDEXRouterV2(router, _dex.pair, receiver);

    return _dex.pair;
  }

  /// @notice Returns the DEX router currently in use
  function getDEXRouterV2() external view returns (address) {
    return _dex.router;
  }

  /// @notice Returns the trading pair
  function getDEXPairV2() external view returns (address) {
    return _dex.pair;
  }

  /// @notice Returns address of the LP tokens receiver
  function getLPTokensReceiver() external view returns (address) {
    return _dex.receiver;
  }

  /// @notice Checks whether the token can be traded through the assigned DEX
  function isTradingEnabled() external view returns (bool) {
    return _tradingEnabled > 0;
  }

  /// @notice Checks the status of the auto-swapping feature
  function isAutoSwapEnabled() external view returns (bool) {
    return _autoSwapEnabled;
  }

  /// @notice Returns the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  function getAutoSwapPercent() external view returns (uint24 min, uint24 max) {
    return (_minAutoSwapPercent, _maxAutoSwapPercent);
  }

  /// @notice Sets the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  /// @param min Desired min. percentage to trigger the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  /// @param max Desired max. percentage to limit the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  function setAutoSwapPercent(uint24 min, uint24 max) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(min >= 1 && min <= 1000, "0.001% to 1%");
    require(max >= min && max <= 1000, "0.001% to 1%");

    _setAutoSwapPercent(min, max);
  }

  function _setAutoSwapPercent(uint24 min, uint24 max) internal {
    _minAutoSwapPercent = min;
    _maxAutoSwapPercent = max;
    _minAutoSwapAmount = _percentage(_totalSupply, uint256(min));
    _maxAutoSwapAmount = _percentage(_totalSupply, uint256(max));
  }

  /// @notice Enables or disables the auto-swap function
  /// @param status True to enable, False to disable
  function enableAutoSwap(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(!status || _dex.router != address(0), "No DEX");

    _autoSwapEnabled = status;
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached
  function autoSwap() external {
    require(_autoSwapEnabled && !_swapping && !_distributing);

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. and max. threshold amount
  function autoSwap(bool force) external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require((force || _autoSwapEnabled) && !_swapping && !_distributing);

    _autoSwap(force);
  }

  function _autoSwap(bool force) internal lockSwapping {
    if (!force && !_autoSwapEnabled) { return; }

    unchecked {
      uint256 amountForLiquidityToSwap = _amountForLiquidity > 0 ? _amountForLiquidity / 2 : 0;
      uint256 amountForTaxDistributionToSwap = (address(_taxToken) == _dex.WETH ? _amountForTaxDistribution : 0);
      uint256 amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;

      if (!force && amountToSwap > _maxAutoSwapAmount) {
        amountForLiquidityToSwap = amountForLiquidityToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap) : 0;
        amountForTaxDistributionToSwap = amountForTaxDistributionToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap) : 0;
        amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;
      }

      if ((force || amountToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountToSwap + amountForLiquidityToSwap) {
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForETH = new address[](2);
        pathToSwapExactTokensForETH[0] = address(this);
        pathToSwapExactTokensForETH[1] = _dex.WETH;

        _approve(address(this), _dex.router, amountToSwap);

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap, 0, pathToSwapExactTokensForETH, address(this), block.timestamp) {
          if (_amountForLiquidity > 0) { _amountForLiquidity -= amountForLiquidityToSwap; }

          uint256 ethAmount = address(this).balance - ethBalance;

          emit SwappedTokensForNative(amountToSwap, ethAmount);

          if (ethAmount > 0) {
            uint256 ethForLiquidity = _percentage(ethAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap);

            if (address(_taxToken) == _dex.WETH) {
              _ethForTaxDistribution += _percentage(ethAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap);
              _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
              _amountForTaxDistribution -= amountForTaxDistributionToSwap;
            }

            if (amountForLiquidityToSwap > 0 && ethForLiquidity > 0) {
              _approve(address(this), _dex.router, amountForLiquidityToSwap);

              try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidity }(address(this), amountForLiquidityToSwap, 0, 0, _dex.receiver, block.timestamp) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
                emit SwapAndLiquify(amountToken, amountETH, liquidity);

                _amountForLiquidity -= amountForLiquidityToSwap;
              } catch {
                _approve(address(this), _dex.router, 0);
              }
            }
          }
        } catch {
          _approve(address(this), _dex.router, 0);
        }
      }

      if (address(_taxToken) != address(this) && address(_taxToken) != _dex.WETH) {
        amountForTaxDistributionToSwap = _amountForTaxDistribution;

        if (!force && amountForTaxDistributionToSwap > _maxAutoSwapAmount) { amountForTaxDistributionToSwap = _maxAutoSwapAmount; }

        if ((force || amountForTaxDistributionToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountForTaxDistributionToSwap) {
          uint256 tokenAmount = _swapTokensForTokens(_taxToken, amountForTaxDistributionToSwap);

          if (tokenAmount > 0) {
            _tokensForTaxDistribution += tokenAmount;
            _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
            _amountForTaxDistribution -= amountForTaxDistributionToSwap;
          }
        }
      }
    }

    _lastSwap = _timestamp();
  }

  function _swapTokensForTokens(IERC20 token, uint256 amount) private returns (uint256 tokenAmount) {
    uint256 tokenBalance = token.balanceOf(address(this));
    address[] memory pathToSwapExactTokensForTokens = new address[](3);
    pathToSwapExactTokensForTokens[0] = address(this);
    pathToSwapExactTokensForTokens[1] = _dex.WETH;
    pathToSwapExactTokensForTokens[2] = address(token);

    _approve(address(this), _dex.router, amount);

    try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, pathToSwapExactTokensForTokens, address(this), block.timestamp) {
      tokenAmount = token.balanceOf(address(this)) - tokenBalance;

      emit SwappedTokensForTokens(address(token), amount, tokenAmount);
    } catch {
      _approve(address(this), _dex.router, 0);
    }
  }

  /// @notice Returns the token for tax distribution
  function getTaxToken() external view returns (address) {
    return address(_taxToken);
  }

  /// @notice Sets the desired ERC-20 token for taxes
  /// @dev If other token than wrapped native is specified, the pair wrapped native-token must already exist
  /// @param token Address of the ERC-20 token
  function setTaxToken(address token) external onlyOwner {
    require(!_renounced.DEXRouterV2);

    if (address(_taxToken) != token && _amountSwappedForTaxDistribution > 0) { revert("Unclaimed taxes"); }

    _setTaxToken(token);
  }

  function _setTaxToken(address token) internal {
    require((!_initialized && token == address(0)) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair");

    _taxToken = IERC20(token == address(0) ? address(this) : token);
  }

  /// @notice Enables the trading capability via the DEX set up
  /// @dev Once enabled, it cannot be reverted
  function enableTrading() external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(_tradingEnabled == 0, "Already enabled");

    _tradingEnabled = _timestamp();
  }
}

File 12 of 13 : IDEXV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

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

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

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

pragma solidity 0.8.24;

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
  function approve(address spender, uint256 amount) external returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxTx","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SetDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"}],"name":"SetEarlyPenaltyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxBalancePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxTxPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"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":[],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"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":"denominator","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"enableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAutoSwapPercent","outputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXPairV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarlyPenaltyTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPTokensReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxToken","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutoSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"internalType":"struct CF_Taxable.taxBeneficiaryView[]","name":"list","type":"tuple[]"}],"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":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"MaxTx","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"name":"setAutoSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"time","type":"uint32"}],"name":"setEarlyPenaltyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxBalancePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"slot","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"setTaxBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setTaxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"suspendTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b506040805180820190915260098152682537b2902937b3b0b760b91b6020820152601c906200004090826200108c565b50604080518082019091526006815265122927a3a0a760d11b6020820152601d906200006d90826200108c565b50601260a0526a52b7d2dcc80cd2e4000000600855620000a173afe5c603a3dd5b44855fc2f6294075b4410a37fe62000309565b620000c473afe5c603a3dd5b44855fc2f6294075b4410a37fe620148206200035a565b620000e67304d4277ebc0eb8a200b1a969d3c1fb43e5449a416117706200035a565b62000108731adc4fbfe3b7b1c53b6e87ec9ce902b188512849610ce46200035a565b6200012a73d8f2dc01898b2a9d0a6d3fcc030c9468229c66e0610ce46200035a565b6200014c73a060c07c326db2bdc6ce26c04efb24735c8ea8db610d486200035a565b62000180737a250d5630b4cf539739df2c5dacb4c659f2488d73afe5c603a3dd5b44855fc2f6294075b4410a37fe620003d7565b506200018e610258620006c8565b620001ad73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc262000723565b620001bc60646101f4620008d8565b6006805460ff1916600117905560408051606080820183525f8083526107d06020808501829052848601919091528451928301855261c350808452908301819052938201939093526200022692917304d4277ebc0eb8a200b1a969d3c1fb43e5449a41916200093a565b60408051606080820183525f8083526103e8602080850182905284860191909152845192830185528183528201819052928101929092526200026f9160019161dead916200093a565b60185460408051606080820183525f8083526103e860208085018290528486019190915284519283018552818352820181905292810192909252620002c4926002926001600160a01b0390911691906200093a565b60408051602081019091527304d4277ebc0eb8a200b1a969d3c1fb43e5449a418152620002f19062000d3a565b620002fe6107d062000d86565b60016080526200120b565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6080511562000367575f80fd5b5f620003816008548362ffffff1662000e0e60201b60201c565b6001600160a01b0384165f8181526020818152604080832085905551848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b038316620003eb575f80fd5b6017546001600160a01b038481169116146200063c575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000443573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000469919062001158565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004a9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004cf919062001158565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af115801562000520573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000546919062001158565b90506001600160a01b038116620005cc576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015620005a3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005c9919062001158565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b038381169116146200066e57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b6007805463ffffffff60781b1916600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b6080511580156200073b57506001600160a01b038116155b806200074f57506001600160a01b03811630145b806200076857506019546001600160a01b038281169116145b806200086057506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa158015620007b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007dd919062001158565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af11580156200082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000854919062001158565b6001600160a01b031614155b6200089c5760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b03811615620008b35780620008b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b6006805462ffffff60e01b1916600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546200092091620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b60058460ff16106200094a575f80fd5b6001600160a01b03831630148015906200096c57506001600160a01b03831615155b62000975575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead148015620009a457505f8160030154115b15620009e55760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b604482015260640162000893565b60018101805484516006805462ffffff60501b19811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c015162ffffff60681b1990971665ffffffffffff60501b19909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b015162ffffff60801b1989166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d5162ffffff60981b1990941665ffffffffffff60801b19909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b015162ffffff60b01b198216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b988990048816929091048716900301851690950262ffffff60c81b1990931665ffffffffffff60b01b199091161791909117908190556161a8929004161180159062000bcf57506006546161a8600160681b90910462ffffff161180159062000b9f57506006546161a8600160801b90910462ffffff1611155b801562000bcf57506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b62000c085760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640162000893565b600654620186a0600160981b90910462ffffff161180159062000c3d5750600654620186a0600160b01b90910462ffffff1611155b801562000c5c5750600654620186a0600160c81b90910462ffffff1611155b62000c9c5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b604482015260640162000893565b8054610100600160a81b0319166101006001600160a01b0386160217815562000ccb6001820184600362000f39565b5062000cdd6002820183600362000f39565b50805460ff1662000cf457805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000d2b9493929190620011ca565b60405180910390a15050505050565b6080511562000d47575f80fd5b5f5b600181101562000d825762000d7982826001811062000d6c5762000d6c62001187565b6020020151600162000e18565b60010162000d49565b5050565b6006805462ffffff60381b191667010000000000000062ffffff84169081029190911790915562000db8575f62000dca565b600854620186a062ffffff8316909102045b600b5560805162000e0b5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c99060200162000718565b50565b620186a091020490565b60155460ff161562000e28575f80fd5b6001600160a01b0382161580159062000e4c57506001600160a01b03821661dead14155b62000e55575f80fd5b6017546001600160a01b0383811691161480159062000e8257506018546001600160a01b03838116911614155b62000edb5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b606482015260840162000893565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562000fc6579160200282015f5b8382111562000f9357835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000f4f565b801562000fc45782816101000a81549062ffffff021916905560030160208160020104928301926001030262000f93565b505b5062000fd492915062000fd8565b5090565b5b8082111562000fd4575f815560010162000fd9565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200101757607f821691505b6020821081036200103657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200108757805f5260205f20601f840160051c81016020851015620010635750805b601f840160051c820191505b8181101562001084575f81556001016200106f565b50505b505050565b81516001600160401b03811115620010a857620010a862000fee565b620010c081620010b9845462001002565b846200103c565b602080601f831160018114620010f6575f8415620010de5750858301515b5f19600386901b1c1916600185901b17855562001150565b5f85815260208120601f198616915b82811015620011265788860151825594840194600190910190840162001105565b50858210156200114457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562001169575f80fd5b81516001600160a01b038116811462001180575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b805f5b6003811015620011c457815162ffffff168452602093840193909101906001016200119e565b50505050565b60ff851681526001600160a01b03841660208201526101008101620011f360408301856200119b565b6200120260a08301846200119b565b95945050505050565b60805160a051614d4b620012425f395f8181610533015261110d01525f81816131d9015281816133030152613eed0152614d4b5ff3fe6080604052600436106103ae575f3560e01c806377004851116101f1578063be5e49b211610118578063da88d01a116100b1578063f2fde38b11610083578063f59c37081161006b578063f59c370814610bc7578063f7c3b38f14610be6578063f7de0e5714610c0757005b8063f2fde38b14610b6c578063f3dc4f4814610b8b57005b8063da88d01a14610ad6578063dd62ed3e14610af5578063e92871f614610b39578063f2cda82e14610b4d57005b8063cc1776d3116100ea578063cc1776d314610a36578063d232c22014610a4a578063d8454a8214610aae578063d89135cd14610ac257005b8063be5e49b2146109d2578063c2921583146109f1578063c77e006d14610a0e578063c78fe0d414610a2257005b806395d89b411161018a578063a4d8971a1161015c578063a4d8971a14610958578063a5596b4f14610977578063a9059cbb14610996578063b81a0145146109b557005b806395d89b41146108fd57806396ce0795146109115780639c5ef8d714610925578063a457c2d71461093957005b80638bf1acff116101c35780638bf1acff1461088e5780638d8350ca146108a25780638da5cb5b146108c157806395101f90146108de57005b8063770048511461083357806379cc6790146108475780638324c3b9146108665780638a8c523c1461087a57005b80633af32abf116102d55780635a0d4f881161026e5780636f05be97116102405780636f05be97146107aa57806370a08231146107cb578063715018a6146107ff57806375de14961461081357005b80635a0d4f881461070a5780635b90fe661461073b5780635f6417581461076c57806368a5d4141461078b57005b8063487d1ce5116102a7578063487d1ce51461067f5780634b7d9db41461069e5780634f7041a5146106b557806354fd4d50146106dd57005b80633af32abf146105eb5780633ed8a1691461062257806342966c681461064157806344b691ff1461066057005b806323b872dd1161034757806332acf3de1161031957806332acf3de1461055d578063370158ea1461059257806339137f8b146105b857806339509351146105cc57005b806323b872dd146104c35780632623e975146104e25780632984207a14610501578063313ce5671461052057005b8063095ea7b311610380578063095ea7b3146104485780631171bda91461046757806318160ddd14610486578063186488a8146104a457005b806301b38af5146103b7578063064a59d0146103d657806306fdde031461040a57806307e9652c1461042b57005b366103b557005b005b3480156103c2575f80fd5b506103b56103d136600461470e565b610c24565b3480156103e1575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610415575f80fd5b5061041e610cbc565b60405161040191906147d0565b348015610436575f80fd5b5060065462010000900460ff166103f5565b348015610453575f80fd5b506103f56104623660046147f6565b610d4c565b348015610472575f80fd5b506103b5610481366004614820565b610d62565b348015610491575f80fd5b506008545b604051908152602001610401565b3480156104af575f80fd5b506103b56104be3660046148f3565b610f1e565b3480156104ce575f80fd5b506103f56104dd366004614820565b610f89565b3480156104ed575f80fd5b506103b56104fc366004614950565b610faa565b34801561050c575f80fd5b506103b561051b36600461496b565b611080565b34801561052b575f80fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610401565b348015610568575f80fd5b5060065460075460408051600160e01b90930462ffffff9081168452909116602083015201610401565b34801561059d575f80fd5b506105a66110ff565b6040516104019695949392919061498e565b3480156105c3575f80fd5b506103b561128a565b3480156105d7575f80fd5b506103f56105e63660046147f6565b61130a565b3480156105f6575f80fd5b506103f56106053660046149f1565b6001600160a01b03165f9081526002602052604090205460ff1690565b34801561062d575f80fd5b506103b561063c366004614a0c565b61133c565b34801561064c575f80fd5b506103b561065b366004614a25565b611412565b34801561066b575f80fd5b506103b561067a366004614a3c565b61141c565b34801561068a575f80fd5b506103b56106993660046149f1565b61153e565b3480156106a9575f80fd5b5060065460ff166103f5565b3480156106c0575f80fd5b506106c9611605565b60405162ffffff9091168152602001610401565b3480156106e8575f80fd5b50604080518082019091526005815264312e302e3160d81b602082015261041e565b348015610715575f80fd5b506016546001600160a01b03165b6040516001600160a01b039091168152602001610401565b348015610746575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff9091168152602001610401565b348015610777575f80fd5b506106c96107863660046149f1565b611614565b348015610796575f80fd5b506107236107a5366004614a6d565b61170f565b3480156107b5575f80fd5b506107be611782565b6040516104019190614acb565b3480156107d6575f80fd5b506104966107e53660046149f1565b6001600160a01b03165f9081526020819052604090205490565b34801561080a575f80fd5b506103b5611913565b34801561081e575f80fd5b50600654600160381b900462ffffff166106c9565b34801561083e575f80fd5b506103b561197c565b348015610852575f80fd5b506103b56108613660046147f6565b6119bd565b348015610871575f80fd5b506103b56119d2565b348015610885575f80fd5b506103b5611a58565b348015610899575f80fd5b506106c9611b39565b3480156108ad575f80fd5b506106c96108bc3660046149f1565b611b3f565b3480156108cc575f80fd5b50601b546001600160a01b0316610723565b3480156108e9575f80fd5b506106c96108f83660046149f1565b611c09565b348015610908575f80fd5b5061041e611ce5565b34801561091c575f80fd5b506103e86106c9565b348015610930575f80fd5b506103b5611cf4565b348015610944575f80fd5b506103f56109533660046147f6565b611d88565b348015610963575f80fd5b506103b5610972366004614950565b611e08565b348015610982575f80fd5b506103b5610991366004614950565b611eb3565b3480156109a1575f80fd5b506103f56109b03660046147f6565b611f2e565b3480156109c0575f80fd5b50601a546001600160a01b0316610723565b3480156109dd575f80fd5b506103b56109ec3660046149f1565b611f3a565b3480156109fc575f80fd5b506018546001600160a01b0316610723565b348015610a19575f80fd5b506103b5611fba565b348015610a2d575f80fd5b506103b561203e565b348015610a41575f80fd5b506106c96120c6565b348015610a55575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925264010000000083048216151560608201526301000000909204161515608082015260a001610401565b348015610ab9575f80fd5b50600f54610496565b348015610acd575f80fd5b50600954610496565b348015610ae1575f80fd5b506103b5610af0366004614a0c565b6120d0565b348015610b00575f80fd5b50610496610b0f366004614a6d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b44575f80fd5b506103b561219e565b348015610b58575f80fd5b506103b5610b673660046147f6565b612220565b348015610b77575f80fd5b506103b5610b863660046149f1565b612346565b348015610b96575f80fd5b506103f5610ba53660046149f1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bd2575f80fd5b506103b5610be1366004614b4a565b6123aa565b348015610bf1575f80fd5b50600654640100000000900462ffffff166106c9565b348015610c12575f80fd5b506017546001600160a01b0316610723565b601b546001600160a01b03163314610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610cb557610cad858583818110610c9257610c92614b76565b9050602002016020810190610ca791906149f1565b846123f9565b600101610c75565b5050505050565b6060601c8054610ccb90614b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf790614b8a565b8015610d425780601f10610d1957610100808354040283529160200191610d42565b820191905f5260205f20905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b5f610d58338484612514565b5060015b92915050565b601b546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190614bbc565b90505f6001600160a01b0385163014610e49576016546001600160a01b03868116911614610e41575f610e51565b601454610e51565b600e54601154015b90508282821015610e625781610e64565b825b83031015610ea65760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190614bd3565b50505050565b601b546001600160a01b03163314610f675760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615610f7d575f80fd5b610f1884848484612575565b5f610f95843384612a41565b610fa0848484612ac3565b5060019392505050565b601b546001600160a01b03163314610ff35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561100a575f80fd5b80158061102157506017546001600160a01b031615155b61106d5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610c69565b6006805460ff1916911515919091179055565b601b546001600160a01b031633146110c95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff16156110df575f80fd5b6102588163ffffffff1611156110f3575f80fd5b6110fc81613122565b50565b6060805f805f6060601c601d7f0000000000000000000000000000000000000000000000000000000000000000601b5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461116e90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461119a90614b8a565b80156111e55780601f106111bc576101008083540402835291602001916111e5565b820191905f5260205f20905b8154815290600101906020018083116111c857829003601f168201915b505050505095508480546111f890614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461122490614b8a565b801561126f5780601f106112465761010080835404028352916020019161126f565b820191905f5260205f20905b81548152906001019060200180831161125257829003601f168201915b50505050509450955095509550955095509550909192939495565b601b546001600160a01b031633146112d35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d589185908501612514565b601b546001600160a01b031633146113855760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60155462010000900460ff161561139a575f80fd5b62ffffff811615806113c5575060648162ffffff16101580156113c55750620186a062ffffff821611155b6113cd575f80fd5b6113d68161318e565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6110fc3382613231565b601b546001600160a01b031633146114655760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561147c575f80fd5b60018262ffffff161015801561149957506103e88262ffffff1611155b6114d45760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b8162ffffff168162ffffff16101580156114f557506103e88162ffffff1611155b6115305760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b61153a8282613287565b5050565b601b546001600160a01b031633146115875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561159e575f80fd5b6016546001600160a01b038281169116148015906115bd57505f601254115b156115fc5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6110fc81613301565b5f61160f33611c09565b905090565b6006545f9062010000900460ff161561162e57505f919050565b6001600160a01b03821630148061165c57506001600160a01b0382165f9081526002602052604090205460ff165b8061167457506018546001600160a01b038381169116145b8061168c57506017546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff16806116dc575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6116f457600654600160801b900462ffffff16610d5c565b600654600160c81b900462ffffff16610d5c565b5f92915050565b601b545f906001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611771575f80fd5b61177b83836134d8565b9392505050565b60408051600580825260c08201909252606091816020015b6117a2614600565b81526020019060019003908161179a5790505090505f5b60058160ff16101561190f576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611816579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161188a5750505092845250505060ff83165f81815260046020908152604090912060030154920191909152835184919081106118fc576118fc614b76565b60209081029190910101526001016117b9565b5090565b601b546001600160a01b0316331461195c5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ffffffffff191664010101010117905561197a5f6137b9565b565b60065460ff1680156119965750600654610100900460ff16155b80156119ac57506006546301000000900460ff16155b6119b4575f80fd5b61197a5f61380a565b6119c8823383612a41565b61153a8282613231565b601b546001600160a01b03163314611a1b5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601b546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611ab8575f80fd5b600754600160381b900463ffffffff1615611b155760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610c69565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61160f335b5f6001600160a01b038216301480611b6e57506001600160a01b0382165f9081526002602052604090205460ff165b80611b8657506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611bd6575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611bf5576006546a0100000000000000000000900462ffffff16610d5c565b600654600160981b900462ffffff16610d5c565b6006545f9062010000900460ff1615611c2357505f919050565b6001600160a01b038216301480611c5157506001600160a01b0382165f9081526002602052604090205460ff165b80611c6957506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611cb9575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611cd157600654600160681b900462ffffff16610d5c565b600654600160b01b900462ffffff16610d5c565b6060601d8054610ccb90614b8a565b601b546001600160a01b0316331480611d1b5750335f9081526002602052604090205460ff165b611d565760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b600654610100900460ff16158015611d7857506006546301000000900460ff16155b611d80575f80fd5b61197a613d16565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611dfb5760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610c69565b610fa03385858403612514565b601b546001600160a01b0316331480611e2f5750335f9081526002602052604090205460ff165b611e6a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b8080611e78575060065460ff165b8015611e8c5750600654610100900460ff16155b8015611ea257506006546301000000900460ff16155b611eaa575f80fd5b6110fc8161380a565b601b546001600160a01b03163314611efc5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f12575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d58338484612ac3565b601b546001600160a01b03163314611f835760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f99575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601b546001600160a01b031633146120035760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601b546001600160a01b031633146120875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61160f33611614565b601b546001600160a01b031633146121195760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554610100900460ff161561212d575f80fd5b62ffffff81161580612158575060648162ffffff16101580156121585750620186a062ffffff821611155b612160575f80fd5b61216981613ea4565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b601b546001600160a01b031633146121e75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601b546001600160a01b031633146122695760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60195460165447915f916001600160a01b0390811691161461228b575f61228f565b6013545b905082828210156122a057816122a2565b825b830310156122e45760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461232f576040519150601f19603f3d011682016040523d82523d5f602084013e612334565b606091505b5050905080612341575f80fd5b505050565b601b546001600160a01b0316331461238f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6001600160a01b0381166123a1575f80fd5b6110fc816137b9565b601b546001600160a01b031633146123f35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b61153a82825b60155460ff1615612408575f80fd5b6001600160a01b0382161580159061242b57506001600160a01b03821661dead14155b612433575f80fd5b6017546001600160a01b0383811691161480159061245f57506018546001600160a01b03838116911614155b6124b65760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c69565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612584575f80fd5b6001600160a01b03831630148015906125a557506001600160a01b03831615155b6125ad575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead1480156125db57505f8160030154115b1561261a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6001810180548451600680546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a892900416118015906128a957506006546161a8600160681b90910462ffffff161180159061287a57506006546161a8600160801b90910462ffffff1611155b80156128a957506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6128f55760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610c69565b600654620186a0600160981b90910462ffffff16118015906129295750600654620186a0600160b01b90910462ffffff1611155b80156129475750600654620186a0600160c81b90910462ffffff1611155b6129935760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610c69565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038616021781556129d76001820184600361463b565b506129e76002820183600361463b565b50805460ff166129fd57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612a329493929190614bee565b60405180910390a15050505050565b6001600160a01b038381165f9081526001602090815260408083209386168352929052205481811015612ab65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610c69565b610f188484848403612514565b61deac196001600160a01b03831601612ae0576123418382613231565b6006546301000000900460ff16158015612b025750600654610100900460ff16155b8015612b3557506018546001600160a01b03848116911614801590612b3557506017546001600160a01b03848116911614155b15612b4b57612b435f61380a565b612b4b613d16565b5f81118015612b7257506001600160a01b0383165f9081526002602052604090205460ff16155b8015612b9657506001600160a01b0382165f9081526002602052604090205460ff16155b8015612bab57506001600160a01b0383163014155b8015612bc057506001600160a01b0382163014155b8015612bda57506017546001600160a01b03838116911614155b15613117576018546001600160a01b03848116911614801590612c0b57506018546001600160a01b03838116911614155b80612c5457506018546001600160a01b0384811691161480612c3a57506018546001600160a01b038381169116145b8015612c545750600754600160381b900463ffffffff1615155b612ca05760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610c69565b600a541580612cb15750600a548111155b612cfd5760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610c69565b600b541580612d1457506001600160a01b03821630145b80612d4357506018546001600160a01b0383811691161480612d4357506017546001600160a01b038381169116145b80612d695750600b546001600160a01b0383165f90815260208190526040902054820111155b612db55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610c69565b60065462010000900460ff16158015612dd857506006546301000000900460ff16155b8015612dec5750600654610100900460ff16155b15613117576018545f9081906001600160a01b0386811691161480612e1e57506018546001600160a01b038581169116145b15612e45576018546001600160a01b03868116911614612e3f576002612e42565b60015b90505b5f8160ff16600114612e575785612e59565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612eaa57506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612ed4576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff1610156130fe575f808460ff1611612f61576001600160a01b0383165f90815260036020526040902054610100900460ff16612f475760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613029565b60ff82165f90815260046020526040812060020190612f27565b8360ff16600114612fc7576001600160a01b0383165f90815260036020526040902054610100900460ff16612fab5760ff82165f9081526004602052604090206001016002612f27565b60ff82165f908152600460205260409020600290810190612f27565b6001600160a01b0383165f90815260036020526040902054610100900460ff166130075760ff82165f908152600460205260409020600190810190612f27565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f0361303d57506130f6565b620186a086820204613050893083613f45565b60185460ff84165f908152600460205260409020546001600160a01b039182166101009091049091160361308b57600e8054820190556130ef565b60ff83165f9081526004602052604090205461deac196101009091046001600160a01b0316016130c4576130bf3082613231565b6130ef565b60ff83165f908152600460205260409020600301805482019055601180548201905560108054820190555b9490940193505b600101612ed6565b50821561311357600f80548401905592829003925b5050505b612341838383613f45565b600780547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611407565b6006805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556131be575f6131d4565b6131d46008548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000006110fc5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611407565b61323b8282614082565b60065461325490640100000000900462ffffff16613ea4565b60065461326c90600160381b900462ffffff1661318e565b60065460075461153a9162ffffff600160e01b909104811691165b600680547fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546132e791620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b7f000000000000000000000000000000000000000000000000000000000000000015801561333657506001600160a01b038116155b8061334957506001600160a01b03811630145b8061336157506019546001600160a01b038281169116145b8061345257506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156133ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d29190614c2b565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614c2b565b6001600160a01b031614155b61349e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610c69565b6001600160a01b038116156134b357806134b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166134eb575f80fd5b6017546001600160a01b0384811691161461372e575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135659190614c2b565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c89190614c2b565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015613618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363c9190614c2b565b90506001600160a01b0381166136be576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bb9190614c2b565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b0383811691161461375f57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff0019166101001790558015801561382a575060065460ff16155b613d08575f80600e541161383e575f613852565b6002600e548161385057613850614c46565b045b6019546016549192505f916001600160a01b03908116911614613875575f613879565b6011545b90508181018315801561388d5750600d5481115b156138f6575f831161389f575f6138c5565b600d546138c59082620186a08602816138ba576138ba614c46565b04620186a091020490565b92505f82116138d4575f6138ef565b600d546138ef9082620186a08502816138ba576138ba614c46565b9150508181015b83806139045750600c548110155b80156139205750305f9081526020819052604090205481840111155b15613c1e5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061395c5761395c614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061398d5761398d614b76565b6001600160a01b0392831660209182029290920101526017546139b39130911685612514565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906139eb9086905f90869030904290600401614c5a565b5f604051808303815f87803b158015613a02575f80fd5b505af1925050508015613a13575060015b613a3457601754613a2f9030906001600160a01b03165f612514565b613c1b565b600e5415613a4657600e805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613c19575f613aa38286620186a08a02816138ba576138ba614c46565b6019546016549192506001600160a01b03908116911603613af157613ad68286620186a08902816138ba576138ba614c46565b60138054909101905560128054870190556011805487900390555b5f87118015613aff57505f81115b15613c1757601754613b1c9030906001600160a01b031689612514565b601754601a5460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613ba8575060408051601f3d908101601f19168201909252613ba591810190614ccb565b60015b613bc957601754613bc49030906001600160a01b03165f612514565b613c17565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600e80548990039055505b505b505b50505b6016546001600160a01b03163014801590613c4a57506019546016546001600160a01b03908116911614155b15613cd757601154915083158015613c635750600d5482115b15613c6e57600d5491505b8380613c7c5750600c548210155b8015613c965750305f908152602081905260409020548211155b15613cd7576016545f90613cb3906001600160a01b031684614145565b90508015613cd557601480548201905560128054840190556011805484900390555b505b505050613ce763ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff0000001916630100000017905560105415613e95575f805b60058160ff161015613e315760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b0316901580613d7f57506001600160a01b03811661dead145b80613d9757506018546001600160a01b038281169116145b15613da25750613e29565b6016545f90613df0906001600160a01b03163014613dc257601254613dc6565b6011545b60105460ff86165f90815260046020526040902060030154620186a002816138ba576138ba614c46565b90505f613dfd83836143bc565b90508015613e255760ff84165f90815260046020526040902060030180548290039055938401935b5050505b600101613d34565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613e60576010805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff00000000191664010000000062ffffff841690810291909117909155613ed2575f613ee8565b613ee86008548262ffffff16620186a091020490565b600a557f00000000000000000000000000000000000000000000000000000000000000006110fc5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b6001600160a01b03831615801590613f6557506001600160a01b03821615155b613fb15760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c69565b6001600160a01b0383165f9081526020819052604090205481111561400a5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b801561403d576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161256891815260200190565b6001600160a01b0382165f908152602081905260409020548111156140db5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b6001600160a01b0382165f8181526020818152604091829020805485900390556008805485900390556009805485019055905183815261dead92917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561418b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141af9190614bbc565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f815181106141e8576141e8614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061421957614219614b76565b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061424d5761424d614b76565b6001600160a01b0392831660209182029290920101526017546142739130911686612514565b601754604051635c11d79560e01b81526001600160a01b0390911690635c11d795906142ab9087905f90869030904290600401614c5a565b5f604051808303815f87803b1580156142c2575f80fd5b505af19250505080156142d3575060015b6142f4576017546142ef9030906001600160a01b03165f612514565b6143b4565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015614338573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435c9190614bbc565b6143669190614cf6565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f036143cb57505f610d5c565b601654306001600160a01b039091160361449f575f600b5411801561440a5750600b546001600160a01b0384165f908152602081905260409020548301115b801561442e57506001600160a01b0383165f9081526002602052604090205460ff16155b15614486576001600160a01b0383165f90815260208190526040902054600b5411614459575f614476565b6001600160a01b0383165f90815260208190526040902054600b54035b9150815f0361448657505f610d5c565b614491308484613f45565b6011805483900390556145fa565b6012545f90620186a08402816144b7576144b7614c46565b6019546016549290910492505f916001600160a01b0391821691160361455a57601354620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614532576040519150601f19603f3d011682016040523d82523d5f602084013e614537565b606091505b505090508061454b575f9350505050610d5c565b506013805482900390556145ee565b601454620186a09083020460165460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af19250505080156145d5575060408051601f3d908101601f191682019092526145d291810190614bd3565b60015b6145e3575f92505050610d5c565b506014805482900390555b50506012805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016146226146cf565b815260200161462f6146cf565b81526020015f81525090565b6001830191839082156146c3579160200282015f5b8382111561469257835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614650565b80156146c15782816101000a81549062ffffff0219169055600301602081600201049283019260010302614692565b505b5061190f9291506146ed565b60405180606001604052806003906020820280368337509192915050565b5b8082111561190f575f81556001016146ee565b80151581146110fc575f80fd5b5f805f60408486031215614720575f80fd5b833567ffffffffffffffff80821115614737575f80fd5b818601915086601f83011261474a575f80fd5b813581811115614758575f80fd5b8760208260051b850101111561476c575f80fd5b6020928301955093505084013561478281614701565b809150509250925092565b5f81518084525f5b818110156147b157602081850181015186830182015201614795565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61177b602083018461478d565b6001600160a01b03811681146110fc575f80fd5b5f8060408385031215614807575f80fd5b8235614812816147e2565b946020939093013593505050565b5f805f60608486031215614832575f80fd5b833561483d816147e2565b9250602084013561484d816147e2565b929592945050506040919091013590565b803562ffffff81168114614870575f80fd5b919050565b5f82601f830112614884575f80fd5b6040516060810181811067ffffffffffffffff821117156148b357634e487b7160e01b5f52604160045260245ffd5b6040528060608401858111156148c7575f80fd5b845b818110156148e8576148da8161485e565b8352602092830192016148c9565b509195945050505050565b5f805f806101008587031215614907575f80fd5b843560ff81168114614917575f80fd5b93506020850135614927816147e2565b92506149368660408701614875565b91506149458660a08701614875565b905092959194509250565b5f60208284031215614960575f80fd5b813561177b81614701565b5f6020828403121561497b575f80fd5b813563ffffffff8116811461177b575f80fd5b60c081525f6149a060c083018961478d565b82810360208401526149b2818961478d565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526149e4818561478d565b9998505050505050505050565b5f60208284031215614a01575f80fd5b813561177b816147e2565b5f60208284031215614a1c575f80fd5b61177b8261485e565b5f60208284031215614a35575f80fd5b5035919050565b5f8060408385031215614a4d575f80fd5b614a568361485e565b9150614a646020840161485e565b90509250929050565b5f8060408385031215614a7e575f80fd5b8235614a89816147e2565b91506020830135614a99816147e2565b809150509250929050565b805f5b6003811015610f1857815162ffffff16845260209384019390910190600101614aa7565b602080825282518282018190525f919060409081850190868401855b82811015614b3d5781516001600160a01b03815116855286810151614b0e88870182614aa4565b5085810151614b206080870182614aa4565b506060015160e08501526101009093019290850190600101614ae7565b5091979650505050505050565b5f8060408385031215614b5b575f80fd5b8235614b66816147e2565b91506020830135614a9981614701565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680614b9e57607f821691505b6020821081036145fa57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614bcc575f80fd5b5051919050565b5f60208284031215614be3575f80fd5b815161177b81614701565b60ff851681526001600160a01b03841660208201526101008101614c156040830185614aa4565b614c2260a0830184614aa4565b95945050505050565b5f60208284031215614c3b575f80fd5b815161177b816147e2565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614caa5784516001600160a01b031683529383019391830191600101614c85565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215614cdd575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d5c57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220e7865815a727d03ce34afaca24fe767934c4bf1b06e2161fb0af379a6da2b26764736f6c63430008180033

Deployed Bytecode

0x6080604052600436106103ae575f3560e01c806377004851116101f1578063be5e49b211610118578063da88d01a116100b1578063f2fde38b11610083578063f59c37081161006b578063f59c370814610bc7578063f7c3b38f14610be6578063f7de0e5714610c0757005b8063f2fde38b14610b6c578063f3dc4f4814610b8b57005b8063da88d01a14610ad6578063dd62ed3e14610af5578063e92871f614610b39578063f2cda82e14610b4d57005b8063cc1776d3116100ea578063cc1776d314610a36578063d232c22014610a4a578063d8454a8214610aae578063d89135cd14610ac257005b8063be5e49b2146109d2578063c2921583146109f1578063c77e006d14610a0e578063c78fe0d414610a2257005b806395d89b411161018a578063a4d8971a1161015c578063a4d8971a14610958578063a5596b4f14610977578063a9059cbb14610996578063b81a0145146109b557005b806395d89b41146108fd57806396ce0795146109115780639c5ef8d714610925578063a457c2d71461093957005b80638bf1acff116101c35780638bf1acff1461088e5780638d8350ca146108a25780638da5cb5b146108c157806395101f90146108de57005b8063770048511461083357806379cc6790146108475780638324c3b9146108665780638a8c523c1461087a57005b80633af32abf116102d55780635a0d4f881161026e5780636f05be97116102405780636f05be97146107aa57806370a08231146107cb578063715018a6146107ff57806375de14961461081357005b80635a0d4f881461070a5780635b90fe661461073b5780635f6417581461076c57806368a5d4141461078b57005b8063487d1ce5116102a7578063487d1ce51461067f5780634b7d9db41461069e5780634f7041a5146106b557806354fd4d50146106dd57005b80633af32abf146105eb5780633ed8a1691461062257806342966c681461064157806344b691ff1461066057005b806323b872dd1161034757806332acf3de1161031957806332acf3de1461055d578063370158ea1461059257806339137f8b146105b857806339509351146105cc57005b806323b872dd146104c35780632623e975146104e25780632984207a14610501578063313ce5671461052057005b8063095ea7b311610380578063095ea7b3146104485780631171bda91461046757806318160ddd14610486578063186488a8146104a457005b806301b38af5146103b7578063064a59d0146103d657806306fdde031461040a57806307e9652c1461042b57005b366103b557005b005b3480156103c2575f80fd5b506103b56103d136600461470e565b610c24565b3480156103e1575f80fd5b50600754600160381b900463ffffffff1615155b60405190151581526020015b60405180910390f35b348015610415575f80fd5b5061041e610cbc565b60405161040191906147d0565b348015610436575f80fd5b5060065462010000900460ff166103f5565b348015610453575f80fd5b506103f56104623660046147f6565b610d4c565b348015610472575f80fd5b506103b5610481366004614820565b610d62565b348015610491575f80fd5b506008545b604051908152602001610401565b3480156104af575f80fd5b506103b56104be3660046148f3565b610f1e565b3480156104ce575f80fd5b506103f56104dd366004614820565b610f89565b3480156104ed575f80fd5b506103b56104fc366004614950565b610faa565b34801561050c575f80fd5b506103b561051b36600461496b565b611080565b34801561052b575f80fd5b5060405160ff7f0000000000000000000000000000000000000000000000000000000000000012168152602001610401565b348015610568575f80fd5b5060065460075460408051600160e01b90930462ffffff9081168452909116602083015201610401565b34801561059d575f80fd5b506105a66110ff565b6040516104019695949392919061498e565b3480156105c3575f80fd5b506103b561128a565b3480156105d7575f80fd5b506103f56105e63660046147f6565b61130a565b3480156105f6575f80fd5b506103f56106053660046149f1565b6001600160a01b03165f9081526002602052604090205460ff1690565b34801561062d575f80fd5b506103b561063c366004614a0c565b61133c565b34801561064c575f80fd5b506103b561065b366004614a25565b611412565b34801561066b575f80fd5b506103b561067a366004614a3c565b61141c565b34801561068a575f80fd5b506103b56106993660046149f1565b61153e565b3480156106a9575f80fd5b5060065460ff166103f5565b3480156106c0575f80fd5b506106c9611605565b60405162ffffff9091168152602001610401565b3480156106e8575f80fd5b50604080518082019091526005815264312e302e3160d81b602082015261041e565b348015610715575f80fd5b506016546001600160a01b03165b6040516001600160a01b039091168152602001610401565b348015610746575f80fd5b50600754600160781b900463ffffffff1660405163ffffffff9091168152602001610401565b348015610777575f80fd5b506106c96107863660046149f1565b611614565b348015610796575f80fd5b506107236107a5366004614a6d565b61170f565b3480156107b5575f80fd5b506107be611782565b6040516104019190614acb565b3480156107d6575f80fd5b506104966107e53660046149f1565b6001600160a01b03165f9081526020819052604090205490565b34801561080a575f80fd5b506103b5611913565b34801561081e575f80fd5b50600654600160381b900462ffffff166106c9565b34801561083e575f80fd5b506103b561197c565b348015610852575f80fd5b506103b56108613660046147f6565b6119bd565b348015610871575f80fd5b506103b56119d2565b348015610885575f80fd5b506103b5611a58565b348015610899575f80fd5b506106c9611b39565b3480156108ad575f80fd5b506106c96108bc3660046149f1565b611b3f565b3480156108cc575f80fd5b50601b546001600160a01b0316610723565b3480156108e9575f80fd5b506106c96108f83660046149f1565b611c09565b348015610908575f80fd5b5061041e611ce5565b34801561091c575f80fd5b506103e86106c9565b348015610930575f80fd5b506103b5611cf4565b348015610944575f80fd5b506103f56109533660046147f6565b611d88565b348015610963575f80fd5b506103b5610972366004614950565b611e08565b348015610982575f80fd5b506103b5610991366004614950565b611eb3565b3480156109a1575f80fd5b506103f56109b03660046147f6565b611f2e565b3480156109c0575f80fd5b50601a546001600160a01b0316610723565b3480156109dd575f80fd5b506103b56109ec3660046149f1565b611f3a565b3480156109fc575f80fd5b506018546001600160a01b0316610723565b348015610a19575f80fd5b506103b5611fba565b348015610a2d575f80fd5b506103b561203e565b348015610a41575f80fd5b506106c96120c6565b348015610a55575f80fd5b506015546040805160ff808416151582526101008404811615156020830152620100008404811615159282019290925264010000000083048216151560608201526301000000909204161515608082015260a001610401565b348015610ab9575f80fd5b50600f54610496565b348015610acd575f80fd5b50600954610496565b348015610ae1575f80fd5b506103b5610af0366004614a0c565b6120d0565b348015610b00575f80fd5b50610496610b0f366004614a6d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610b44575f80fd5b506103b561219e565b348015610b58575f80fd5b506103b5610b673660046147f6565b612220565b348015610b77575f80fd5b506103b5610b863660046149f1565b612346565b348015610b96575f80fd5b506103f5610ba53660046149f1565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610bd2575f80fd5b506103b5610be1366004614b4a565b6123aa565b348015610bf1575f80fd5b50600654640100000000900462ffffff166106c9565b348015610c12575f80fd5b506017546001600160a01b0316610723565b601b546001600160a01b03163314610c725760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b815f5b81811015610cb557610cad858583818110610c9257610c92614b76565b9050602002016020810190610ca791906149f1565b846123f9565b600101610c75565b5050505050565b6060601c8054610ccb90614b8a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf790614b8a565b8015610d425780601f10610d1957610100808354040283529160200191610d42565b820191905f5260205f20905b815481529060010190602001808311610d2557829003601f168201915b5050505050905090565b5f610d58338484612514565b5060015b92915050565b601b546001600160a01b03163314610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190614bbc565b90505f6001600160a01b0385163014610e49576016546001600160a01b03868116911614610e41575f610e51565b601454610e51565b600e54601154015b90508282821015610e625781610e64565b825b83031015610ea65760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610ef4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f189190614bd3565b50505050565b601b546001600160a01b03163314610f675760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615610f7d575f80fd5b610f1884848484612575565b5f610f95843384612a41565b610fa0848484612ac3565b5060019392505050565b601b546001600160a01b03163314610ff35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561100a575f80fd5b80158061102157506017546001600160a01b031615155b61106d5760405162461bcd60e51b815260206004820152600660248201527f4e6f2044455800000000000000000000000000000000000000000000000000006044820152606401610c69565b6006805460ff1916911515919091179055565b601b546001600160a01b031633146110c95760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff16156110df575f80fd5b6102588163ffffffff1611156110f3575f80fd5b6110fc81613122565b50565b6060805f805f6060601c601d7f0000000000000000000000000000000000000000000000000000000000000012601b5f9054906101000a90046001600160a01b031660085460405180604001604052806005815260200164312e302e3160d81b81525085805461116e90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461119a90614b8a565b80156111e55780601f106111bc576101008083540402835291602001916111e5565b820191905f5260205f20905b8154815290600101906020018083116111c857829003601f168201915b505050505095508480546111f890614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461122490614b8a565b801561126f5780601f106112465761010080835404028352916020019161126f565b820191905f5260205f20905b81548152906001019060200180831161125257829003601f168201915b50505050509450955095509550955095509550909192939495565b601b546001600160a01b031633146112d35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610d589185908501612514565b601b546001600160a01b031633146113855760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60155462010000900460ff161561139a575f80fd5b62ffffff811615806113c5575060648162ffffff16101580156113c55750620186a062ffffff821611155b6113cd575f80fd5b6113d68161318e565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b6110fc3382613231565b601b546001600160a01b031633146114655760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561147c575f80fd5b60018262ffffff161015801561149957506103e88262ffffff1611155b6114d45760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b8162ffffff168162ffffff16101580156114f557506103e88162ffffff1611155b6115305760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610c69565b61153a8282613287565b5050565b601b546001600160a01b031633146115875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff161561159e575f80fd5b6016546001600160a01b038281169116148015906115bd57505f601254115b156115fc5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6110fc81613301565b5f61160f33611c09565b905090565b6006545f9062010000900460ff161561162e57505f919050565b6001600160a01b03821630148061165c57506001600160a01b0382165f9081526002602052604090205460ff165b8061167457506018546001600160a01b038381169116145b8061168c57506017546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff16806116dc575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b6116f457600654600160801b900462ffffff16610d5c565b600654600160c81b900462ffffff16610d5c565b5f92915050565b601b545f906001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611771575f80fd5b61177b83836134d8565b9392505050565b60408051600580825260c08201909252606091816020015b6117a2614600565b81526020019060019003908161179a5790505090505f5b60058160ff16101561190f576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff1681526020019060030190602082600201049283019260010382029150808411611816579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161188a5750505092845250505060ff83165f81815260046020908152604090912060030154920191909152835184919081106118fc576118fc614b76565b60209081029190910101526001016117b9565b5090565b601b546001600160a01b0316331461195c5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ffffffffff191664010101010117905561197a5f6137b9565b565b60065460ff1680156119965750600654610100900460ff16155b80156119ac57506006546301000000900460ff16155b6119b4575f80fd5b61197a5f61380a565b6119c8823383612a41565b61153a8282613231565b601b546001600160a01b03163314611a1b5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805463ff000000191663010000001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601b546001600160a01b03163314611aa15760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554640100000000900460ff1615611ab8575f80fd5b600754600160381b900463ffffffff1615611b155760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610c69565b600780546affffffff0000000000000019164263ffffffff16600160381b02179055565b5f61160f335b5f6001600160a01b038216301480611b6e57506001600160a01b0382165f9081526002602052604090205460ff165b80611b8657506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611bd6575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611bf5576006546a0100000000000000000000900462ffffff16610d5c565b600654600160981b900462ffffff16610d5c565b6006545f9062010000900460ff1615611c2357505f919050565b6001600160a01b038216301480611c5157506001600160a01b0382165f9081526002602052604090205460ff165b80611c6957506018546001600160a01b038381169116145b611708576001600160a01b0382165f90815260036020526040902054610100900460ff1680611cb9575060075463ffffffff428116600160781b83048216600160381b9093048216929092011610155b611cd157600654600160681b900462ffffff16610d5c565b600654600160b01b900462ffffff16610d5c565b6060601d8054610ccb90614b8a565b601b546001600160a01b0316331480611d1b5750335f9081526002602052604090205460ff165b611d565760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b600654610100900460ff16158015611d7857506006546301000000900460ff16155b611d80575f80fd5b61197a613d16565b335f9081526001602090815260408083206001600160a01b038616845290915281205482811015611dfb5760405162461bcd60e51b815260206004820152601260248201527f4e6567617469766520616c6c6f77616e636500000000000000000000000000006044820152606401610c69565b610fa03385858403612514565b601b546001600160a01b0316331480611e2f5750335f9081526002602052604090205460ff165b611e6a5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b8080611e78575060065460ff165b8015611e8c5750600654610100900460ff16155b8015611ea257506006546301000000900460ff16155b611eaa575f80fd5b6110fc8161380a565b601b546001600160a01b03163314611efc5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f12575f80fd5b60068054911515620100000262ff000019909216919091179055565b5f610d58338484612ac3565b601b546001600160a01b03163314611f835760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015546301000000900460ff1615611f99575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601b546001600160a01b031633146120035760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805462ff00001916620100001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601b546001600160a01b031633146120875760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805464ff0000000019166401000000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f61160f33611614565b601b546001600160a01b031633146121195760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b601554610100900460ff161561212d575f80fd5b62ffffff81161580612158575060648162ffffff16101580156121585750620186a062ffffff821611155b612160575f80fd5b61216981613ea4565b60405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b601b546001600160a01b031633146121e75760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6015805461ff0019166101001790556040517fcc2f10fb1214ece03bcb178c4d75943daee74aff93182bfb58ba9b8ef5d8c5aa905f90a1565b601b546001600160a01b031633146122695760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b60195460165447915f916001600160a01b0390811691161461228b575f61228f565b6013545b905082828210156122a057816122a2565b825b830310156122e45760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461232f576040519150601f19603f3d011682016040523d82523d5f602084013e612334565b606091505b5050905080612341575f80fd5b505050565b601b546001600160a01b0316331461238f5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b6001600160a01b0381166123a1575f80fd5b6110fc816137b9565b601b546001600160a01b031633146123f35760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610c69565b61153a82825b60155460ff1615612408575f80fd5b6001600160a01b0382161580159061242b57506001600160a01b03821661dead14155b612433575f80fd5b6017546001600160a01b0383811691161480159061245f57506018546001600160a01b03838116911614155b6124b65760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610c69565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1610612584575f80fd5b6001600160a01b03831630148015906125a557506001600160a01b03831615155b6125ad575f80fd5b60ff84165f9081526004602052604090206001600160a01b03841661dead1480156125db57505f8160030154115b1561261a5760405162461bcd60e51b815260206004820152600f60248201526e556e636c61696d656420746178657360881b6044820152606401610c69565b6001810180548451600680546cffffff0000000000000000000019811662ffffff9485169093036a01000000000000000000008083048616919091018516810293841780845586546020808c01516fffffff00000000000000000000000000199097166fffffffffffff0000000000000000000019909516949094176301000000918290048816909603600160681b9283900488160187169091029490941780845595546040808b01517fffffffffffffffffffffffffff000000ffffffffffffffffffffffffffffffff89166601000000000000938490048916909103600160801b808b048a169190910189160290811780875560028b0180548d517fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff9094167fffffffffffffffffffff000000000000ffffffffffffffffffffffffffffffff909c169b909b179a8a16909203600160981b918290048a1601891602989098178086558854948b01517fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff8216979095048816909403600160b01b8086048916919091018816029586178086559754908a0151600160c81b98899004881692909104871690030185169095027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff9093167fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff9091161791909117908190556161a892900416118015906128a957506006546161a8600160681b90910462ffffff161180159061287a57506006546161a8600160801b90910462ffffff1611155b80156128a957506006546161a8600160681b820462ffffff908116600160801b90930481169290920190911611155b6128f55760405162461bcd60e51b815260206004820152600860248201527f48696768205461780000000000000000000000000000000000000000000000006044820152606401610c69565b600654620186a0600160981b90910462ffffff16118015906129295750600654620186a0600160b01b90910462ffffff1611155b80156129475750600654620186a0600160c81b90910462ffffff1611155b6129935760405162461bcd60e51b815260206004820152600f60248201527f496e76616c69642050656e616c747900000000000000000000000000000000006044820152606401610c69565b80547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038616021781556129d76001820184600361463b565b506129e76002820183600361463b565b50805460ff166129fd57805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a85858585604051612a329493929190614bee565b60405180910390a15050505050565b6001600160a01b038381165f9081526001602090815260408083209386168352929052205481811015612ab65760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e7420616c6c6f77616e6365000000000000000000006044820152606401610c69565b610f188484848403612514565b61deac196001600160a01b03831601612ae0576123418382613231565b6006546301000000900460ff16158015612b025750600654610100900460ff16155b8015612b3557506018546001600160a01b03848116911614801590612b3557506017546001600160a01b03848116911614155b15612b4b57612b435f61380a565b612b4b613d16565b5f81118015612b7257506001600160a01b0383165f9081526002602052604090205460ff16155b8015612b9657506001600160a01b0382165f9081526002602052604090205460ff16155b8015612bab57506001600160a01b0383163014155b8015612bc057506001600160a01b0382163014155b8015612bda57506017546001600160a01b03838116911614155b15613117576018546001600160a01b03848116911614801590612c0b57506018546001600160a01b03838116911614155b80612c5457506018546001600160a01b0384811691161480612c3a57506018546001600160a01b038381169116145b8015612c545750600754600160381b900463ffffffff1615155b612ca05760405162461bcd60e51b815260206004820152601060248201527f54726164696e672064697361626c6564000000000000000000000000000000006044820152606401610c69565b600a541580612cb15750600a548111155b612cfd5760405162461bcd60e51b815260206004820152600d60248201527f45786365656473206d61785478000000000000000000000000000000000000006044820152606401610c69565b600b541580612d1457506001600160a01b03821630145b80612d4357506018546001600160a01b0383811691161480612d4357506017546001600160a01b038381169116145b80612d695750600b546001600160a01b0383165f90815260208190526040902054820111155b612db55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d617842616c616e636500000000000000000000000000006044820152606401610c69565b60065462010000900460ff16158015612dd857506006546301000000900460ff16155b8015612dec5750600654610100900460ff16155b15613117576018545f9081906001600160a01b0386811691161480612e1e57506018546001600160a01b038581169116145b15612e45576018546001600160a01b03868116911614612e3f576002612e42565b60015b90505b5f8160ff16600114612e575785612e59565b845b60075490915063ffffffff428116600160781b83048216600160381b9093048216929092011610801590612eaa57506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612ed4576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60058160ff1610156130fe575f808460ff1611612f61576001600160a01b0383165f90815260036020526040902054610100900460ff16612f475760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16613029565b60ff82165f90815260046020526040812060020190612f27565b8360ff16600114612fc7576001600160a01b0383165f90815260036020526040902054610100900460ff16612fab5760ff82165f9081526004602052604090206001016002612f27565b60ff82165f908152600460205260409020600290810190612f27565b6001600160a01b0383165f90815260036020526040902054610100900460ff166130075760ff82165f908152600460205260409020600190810190612f27565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f0361303d57506130f6565b620186a086820204613050893083613f45565b60185460ff84165f908152600460205260409020546001600160a01b039182166101009091049091160361308b57600e8054820190556130ef565b60ff83165f9081526004602052604090205461deac196101009091046001600160a01b0316016130c4576130bf3082613231565b6130ef565b60ff83165f908152600460205260409020600301805482019055601180548201905560108054820190555b9490940193505b600101612ed6565b50821561311357600f80548401905592829003925b5050505b612341838383613f45565b600780547fffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffff16600160781b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611407565b6006805469ffffff000000000000001916600160381b62ffffff8416908102919091179091556131be575f6131d4565b6131d46008548262ffffff16620186a091020490565b600b557f00000000000000000000000000000000000000000000000000000000000000016110fc5760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611407565b61323b8282614082565b60065461325490640100000000900462ffffff16613ea4565b60065461326c90600160381b900462ffffff1661318e565b60065460075461153a9162ffffff600160e01b909104811691165b600680547fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b62ffffff858116918202929092179092556007805462ffffff19169184169190911790556008546132e791620186a091020490565b600c55600854620186a062ffffff929092160204600d5550565b7f000000000000000000000000000000000000000000000000000000000000000115801561333657506001600160a01b038116155b8061334957506001600160a01b03811630145b8061336157506019546001600160a01b038281169116145b8061345257506017546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa1580156133ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133d29190614c2b565b60195460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614c2b565b6001600160a01b031614155b61349e5760405162461bcd60e51b815260206004820152600760248201527f4e6f2050616972000000000000000000000000000000000000000000000000006044820152606401610c69565b6001600160a01b038116156134b357806134b5565b305b601680546001600160a01b0319166001600160a01b039290921691909117905550565b5f6001600160a01b0383166134eb575f80fd5b6017546001600160a01b0384811691161461372e575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015613541573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135659190614c2b565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135c89190614c2b565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015613618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363c9190614c2b565b90506001600160a01b0381166136be576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015613697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136bb9190614c2b565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601780546001600160a01b031990811690941790556018805484169094179093556019805483169091179055601a8054909116909117905550505b601a546001600160a01b0383811691161461375f57601a80546001600160a01b0319166001600160a01b0384161790555b6018546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506018546001600160a01b031692915050565b601b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6006805461ff0019166101001790558015801561382a575060065460ff16155b613d08575f80600e541161383e575f613852565b6002600e548161385057613850614c46565b045b6019546016549192505f916001600160a01b03908116911614613875575f613879565b6011545b90508181018315801561388d5750600d5481115b156138f6575f831161389f575f6138c5565b600d546138c59082620186a08602816138ba576138ba614c46565b04620186a091020490565b92505f82116138d4575f6138ef565b600d546138ef9082620186a08502816138ba576138ba614c46565b9150508181015b83806139045750600c548110155b80156139205750305f9081526020819052604090205481840111155b15613c1e5760408051600280825260608201835247925f92919060208301908036833701905050905030815f8151811061395c5761395c614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061398d5761398d614b76565b6001600160a01b0392831660209182029290920101526017546139b39130911685612514565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906139eb9086905f90869030904290600401614c5a565b5f604051808303815f87803b158015613a02575f80fd5b505af1925050508015613a13575060015b613a3457601754613a2f9030906001600160a01b03165f612514565b613c1b565b600e5415613a4657600e805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613c19575f613aa38286620186a08a02816138ba576138ba614c46565b6019546016549192506001600160a01b03908116911603613af157613ad68286620186a08902816138ba576138ba614c46565b60138054909101905560128054870190556011805487900390555b5f87118015613aff57505f81115b15613c1757601754613b1c9030906001600160a01b031689612514565b601754601a5460405163f305d71960e01b8152306004820152602481018a90525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613ba8575060408051601f3d908101601f19168201909252613ba591810190614ccb565b60015b613bc957601754613bc49030906001600160a01b03165f612514565b613c17565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050600e80548990039055505b505b505b50505b6016546001600160a01b03163014801590613c4a57506019546016546001600160a01b03908116911614155b15613cd757601154915083158015613c635750600d5482115b15613c6e57600d5491505b8380613c7c5750600c548210155b8015613c965750305f908152602081905260409020548211155b15613cd7576016545f90613cb3906001600160a01b031684614145565b90508015613cd557601480548201905560128054840190556011805484900390555b505b505050613ce763ffffffff421690565b6007600b6101000a81548163ffffffff021916908363ffffffff1602179055505b506006805461ff0019169055565b6006805463ff0000001916630100000017905560105415613e95575f805b60058160ff161015613e315760ff81165f90815260046020526040902080546003909101546101009091046001600160a01b0316901580613d7f57506001600160a01b03811661dead145b80613d9757506018546001600160a01b038281169116145b15613da25750613e29565b6016545f90613df0906001600160a01b03163014613dc257601254613dc6565b6011545b60105460ff86165f90815260046020526040902060030154620186a002816138ba576138ba614c46565b90505f613dfd83836143bc565b90508015613e255760ff84165f90815260046020526040902060030180548290039055938401935b5050505b600101613d34565b506007805466ffffffff0000001916630100000063ffffffff4216021790558015613e60576010805482900390555b6040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a1505b6006805463ff00000019169055565b6006805466ffffff00000000191664010000000062ffffff841690810291909117909155613ed2575f613ee8565b613ee86008548262ffffff16620186a091020490565b600a557f00000000000000000000000000000000000000000000000000000000000000016110fc5760405162ffffff821681527ff01936354f43c5b49521c6c3fdc9740709976ee07acac3ebf79fbd6282cda19590602001611407565b6001600160a01b03831615801590613f6557506001600160a01b03821615155b613fb15760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610c69565b6001600160a01b0383165f9081526020819052604090205481111561400a5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b801561403d576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161256891815260200190565b6001600160a01b0382165f908152602081905260409020548111156140db5760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610c69565b6001600160a01b0382165f8181526020818152604091829020805485900390556008805485900390556009805485019055905183815261dead92917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561418b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141af9190614bbc565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f815181106141e8576141e8614b76565b6001600160a01b03928316602091820292909201015260195482519116908290600190811061421957614219614b76565b60200260200101906001600160a01b031690816001600160a01b031681525050848160028151811061424d5761424d614b76565b6001600160a01b0392831660209182029290920101526017546142739130911686612514565b601754604051635c11d79560e01b81526001600160a01b0390911690635c11d795906142ab9087905f90869030904290600401614c5a565b5f604051808303815f87803b1580156142c2575f80fd5b505af19250505080156142d3575060015b6142f4576017546142ef9030906001600160a01b03165f612514565b6143b4565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa158015614338573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435c9190614bbc565b6143669190614cf6565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b5f815f036143cb57505f610d5c565b601654306001600160a01b039091160361449f575f600b5411801561440a5750600b546001600160a01b0384165f908152602081905260409020548301115b801561442e57506001600160a01b0383165f9081526002602052604090205460ff16155b15614486576001600160a01b0383165f90815260208190526040902054600b5411614459575f614476565b6001600160a01b0383165f90815260208190526040902054600b54035b9150815f0361448657505f610d5c565b614491308484613f45565b6011805483900390556145fa565b6012545f90620186a08402816144b7576144b7614c46565b6019546016549290910492505f916001600160a01b0391821691160361455a57601354620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114614532576040519150601f19603f3d011682016040523d82523d5f602084013e614537565b606091505b505090508061454b575f9350505050610d5c565b506013805482900390556145ee565b601454620186a09083020460165460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af19250505080156145d5575060408051601f3d908101601f191682019092526145d291810190614bd3565b60015b6145e3575f92505050610d5c565b506014805482900390555b50506012805483900390555b50919050565b60405180608001604052805f6001600160a01b031681526020016146226146cf565b815260200161462f6146cf565b81526020015f81525090565b6001830191839082156146c3579160200282015f5b8382111561469257835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302614650565b80156146c15782816101000a81549062ffffff0219169055600301602081600201049283019260010302614692565b505b5061190f9291506146ed565b60405180606001604052806003906020820280368337509192915050565b5b8082111561190f575f81556001016146ee565b80151581146110fc575f80fd5b5f805f60408486031215614720575f80fd5b833567ffffffffffffffff80821115614737575f80fd5b818601915086601f83011261474a575f80fd5b813581811115614758575f80fd5b8760208260051b850101111561476c575f80fd5b6020928301955093505084013561478281614701565b809150509250925092565b5f81518084525f5b818110156147b157602081850181015186830182015201614795565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61177b602083018461478d565b6001600160a01b03811681146110fc575f80fd5b5f8060408385031215614807575f80fd5b8235614812816147e2565b946020939093013593505050565b5f805f60608486031215614832575f80fd5b833561483d816147e2565b9250602084013561484d816147e2565b929592945050506040919091013590565b803562ffffff81168114614870575f80fd5b919050565b5f82601f830112614884575f80fd5b6040516060810181811067ffffffffffffffff821117156148b357634e487b7160e01b5f52604160045260245ffd5b6040528060608401858111156148c7575f80fd5b845b818110156148e8576148da8161485e565b8352602092830192016148c9565b509195945050505050565b5f805f806101008587031215614907575f80fd5b843560ff81168114614917575f80fd5b93506020850135614927816147e2565b92506149368660408701614875565b91506149458660a08701614875565b905092959194509250565b5f60208284031215614960575f80fd5b813561177b81614701565b5f6020828403121561497b575f80fd5b813563ffffffff8116811461177b575f80fd5b60c081525f6149a060c083018961478d565b82810360208401526149b2818961478d565b905060ff871660408401526001600160a01b038616606084015284608084015282810360a08401526149e4818561478d565b9998505050505050505050565b5f60208284031215614a01575f80fd5b813561177b816147e2565b5f60208284031215614a1c575f80fd5b61177b8261485e565b5f60208284031215614a35575f80fd5b5035919050565b5f8060408385031215614a4d575f80fd5b614a568361485e565b9150614a646020840161485e565b90509250929050565b5f8060408385031215614a7e575f80fd5b8235614a89816147e2565b91506020830135614a99816147e2565b809150509250929050565b805f5b6003811015610f1857815162ffffff16845260209384019390910190600101614aa7565b602080825282518282018190525f919060409081850190868401855b82811015614b3d5781516001600160a01b03815116855286810151614b0e88870182614aa4565b5085810151614b206080870182614aa4565b506060015160e08501526101009093019290850190600101614ae7565b5091979650505050505050565b5f8060408385031215614b5b575f80fd5b8235614b66816147e2565b91506020830135614a9981614701565b634e487b7160e01b5f52603260045260245ffd5b600181811c90821680614b9e57607f821691505b6020821081036145fa57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614bcc575f80fd5b5051919050565b5f60208284031215614be3575f80fd5b815161177b81614701565b60ff851681526001600160a01b03841660208201526101008101614c156040830185614aa4565b614c2260a0830184614aa4565b95945050505050565b5f60208284031215614c3b575f80fd5b815161177b816147e2565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015614caa5784516001600160a01b031683529383019391830191600101614c85565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215614cdd575f80fd5b8351925060208401519150604084015190509250925092565b81810381811115610d5c57634e487b7160e01b5f52601160045260245ffdfea2646970667358221220e7865815a727d03ce34afaca24fe767934c4bf1b06e2161fb0af379a6da2b26764736f6c63430008180033

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.