ETH Price: $2,412.30 (-0.88%)

Token

Fenikkusu (Fenikkusu)
 

Overview

Max Total Supply

1,000,000 Fenikkusu

Holders

220

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,000 Fenikkusu

Value
$0.00
0x9cd47764cb31d297c3f7db6506cf26f0e229e876
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:
Fenikkusu

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT                                                                               
pragma solidity 0.8.17;

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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


contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _createInitialSupply(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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


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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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



library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

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

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

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

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

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

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

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


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

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

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function removeLiquidity(address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB);
}

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

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

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

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

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

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

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

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

contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

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

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

  uint256 public totalDividendsDistributed;

  /// @dev Distributes dividends whenever ether is paid to this contract.
  receive() external payable {
    distributeDividends();
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.
    
  function distributeDividends() public override payable {
    if(totalBalance > 0 && msg.value > 0){
        magnifiedDividendPerShare = magnifiedDividendPerShare.add(
            (msg.value).mul(magnitude) / totalBalance
        );
        emit DividendsDistributed(msg.sender, msg.value);

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

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

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

      emit DividendWithdrawn(user, _withdrawableDividend);
      (bool success,) = user.call{value: _withdrawableDividend}("");

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

      return _withdrawableDividend;
    }

    return 0;
  }


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

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

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


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

  /// @dev Internal function that increases tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _increase(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  /// @dev Internal function that reduces an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  function _reduce(address account, uint256 value) internal {
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }

  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = holderBalance[account];
    holderBalance[account] = newBalance;
    if(newBalance > currentBalance) {
      uint256 increaseAmount = newBalance.sub(currentBalance);
      _increase(account, increaseAmount);
      totalBalance += increaseAmount;
    } else if(newBalance < currentBalance) {
      uint256 reduceAmount = currentBalance.sub(newBalance);
      _reduce(account, reduceAmount);
      totalBalance -= reduceAmount;
    }
  }
}


contract DividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(address key) private view returns (uint) {
        return tokenHoldersMap.values[key];
    }

    function getIndexOfKey(address key) private view returns (int) {
        if(!tokenHoldersMap.inserted[key]) {
            return -1;
        }
        return int(tokenHoldersMap.indexOf[key]);
    }

    function getKeyAtIndex(uint index) private view returns (address) {
        return tokenHoldersMap.keys[index];
    }



    function size() private view returns (uint) {
        return tokenHoldersMap.keys.length;
    }

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

    function remove(address key) private {
        if (!tokenHoldersMap.inserted[key]) {
            return;
        }

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

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

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

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

    Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public immutable minimumTokenBalanceForDividends;

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

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

    constructor() {
    	claimWait = 1;
        minimumTokenBalanceForDividends = 1;
    }

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

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

    	emit ExcludeFromDividends(account);
    }
    
    function includeInDividends(address account) external onlyOwner {
    	require(excludedFromDividends[account]);
    	excludedFromDividends[account] = false;

    	emit IncludeInDividends(account);
    }

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

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

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

        index = getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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


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


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

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

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

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

    	processAccount(account, true);
    }
    
    
    function process(uint256 gas) external returns (uint256, uint256, uint256) {
    	uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

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

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

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

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

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

    		iterations++;

    		uint256 newGasLeft = gasleft();

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

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

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

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

    	return false;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface ILpPair {
    function sync() external;
}

interface IPriceFeed {
    function latestAnswer() external view returns (int256);
}

contract Fenikkusu is ERC20, Ownable {
    using SafeMath for uint256;

    IPriceFeed internal immutable priceFeed;
    mapping(address => uint256) public walletDollarCostAverage;

    IDexRouter public immutable dexRouter;
    address public lpPair;

    bool private swapping;

    DividendTracker public dividendTracker;

    address public operationsAddress;
    
    uint256 public swapTokensAtAmount;
    uint256 public maxTransactionAmt;
    uint256 public maxWallet;
    
    uint256 public liquidityActiveBlock = 0; // 0 means liquidity is not active yet
    uint256 public tradingActiveBlock = 0; // 0 means trading is not active
    
    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;
    
     // Anti-bot and anti-whale mappings and variables
    mapping(address => uint256) private _holderLastTransferBlock; // to hold last Transfers temporarily during launch
    bool public transferDelayEnabled = true;
    mapping(uint256 => mapping(uint256 => uint256)) public gweiMapping;
    uint256 public gasPriceCheckLimit;
    
    uint256 public constant FEE_DIVISOR = 10000;

    uint256 public totalMaxSellFees;
    uint256 public rewardsMaxSellFee;
    uint256 public operationsMaxSellFee;
    uint256 public liquidityMaxSellFee;
    
    uint256 public tokensForRewards;
    uint256 public tokensForOperations;
    uint256 public tokensForLiquidity;

    mapping(address => uint256) public airdropAmount;
    uint256 public launchTime;
    uint256 public vestingPeriods = 10;
    uint256 public vestingPercent = 10;
    uint256 public vestingPeriodDuration = 10 minutes;
    bool public vestingFinished = false;

    /******************/

    // exlcude from fees and max transaction amount
    mapping (address => bool) public _isExcludedFromFees;

    mapping (address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);

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

    event OperationsWalletUpdated(address indexed newWallet, address indexed oldWallet);

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

    event AutoBurnLP(uint256 indexed tokensBurned);

    event ManualBurnLP(uint256 indexed tokensBurned);
    
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

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

    constructor() ERC20("Fenikkusu", "Fenikkusu") {

        address _dexRouter;
        address _priceFeed;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _dexRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // ETH Router
            _priceFeed = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_dexRouter);

        dividendTracker = new DividendTracker();

        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), dexRouter.WETH());
        _setAutomatedMarketMakerPair(address(lpPair), true);

        uint256 totalSupply = 1 * 1e6 * 1e18;
        
        maxTransactionAmt = totalSupply * 5 / 1000;
        swapTokensAtAmount = totalSupply * 5 / 10000;
        maxWallet = totalSupply * 1 / 100;

        priceFeed = IPriceFeed(_priceFeed);
        require(priceFeed.latestAnswer() > 0, "wrong price feed");
        
        rewardsMaxSellFee = 500;
        operationsMaxSellFee = 2000;
        liquidityMaxSellFee = 500;
        totalMaxSellFees = rewardsMaxSellFee + operationsMaxSellFee + liquidityMaxSellFee;
    	
    	operationsAddress = address(0xa09A720E99179ae49243EAd407848f626A90f1Af);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_dexRouter));
        dividendTracker.excludeFromDividends(address(0xdead));
        
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(0x14228eAB73883E2fB36c31c54649E4ad39290eb6, true); // future owner
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(_dexRouter), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(0x14228eAB73883E2fB36c31c54649E4ad39290eb6, true); // future owner
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(dividendTracker), true);
        excludeFromMaxTransaction(address(_dexRouter), true);
        excludeFromMaxTransaction(address(0xdead), true);

        _createInitialSupply(address(owner()), totalSupply);

        _approve(address(owner()), address(dexRouter), totalSupply);
        _approve(address(this), address(dexRouter), type(uint256).max);
        // IERC20(address(lpPair)).approve(address(dexRouter), type(uint256).max);
    }

    receive() external payable {}

    // leaving external and open for long-term viability for swapbacks
    function updateAllowanceForSwapping() external {
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

     // disable Transfer delay - cannot be reenabled
    function disableTransferDelay() external onlyOwner {
        transferDelayEnabled = false;
    }


    function updateDCA(address[] calldata wallets, uint256[] calldata dcas) external onlyOwner {
        require(wallets.length == dcas.length, "array length mismatch");
        for(uint256 i = 0; i < wallets.length; i++){
            if(dcas[i] > walletDollarCostAverage[wallets[i]]){
                walletDollarCostAverage[wallets[i]] = dcas[i];
            }
        }
    }

    // in the event that vesting causes any issues after 100 minutes.
    function endVesting() external onlyOwner {
        require(!vestingFinished, "Vesting already over");
        vestingFinished = true;
    }

    // excludes wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // removes exclusion on wallets and contracts from dividends (such as CEX hotwallets, etc.)
    function includeInDividends(address account) external onlyOwner {
        dividendTracker.includeInDividends(account);
    }
    
    // once enabled, can never be turned off
    function enableTrading(uint256 gasPrice) external onlyOwner {
        require(!tradingActive, "Cannot re-enable trading");
        tradingActive = true;
        swapEnabled = true;
        tradingActiveBlock = block.number;
        launchTime = block.timestamp;
        gasPriceCheckLimit = gasPrice * 1 gwei;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }

    function setGasPriceCheckLimit(uint256 gas) external onlyOwner {
        gasPriceCheckLimit = gas * 1 gwei;
    }

    function removeGasPriceCheckLimit() external onlyOwner {
        gasPriceCheckLimit = type(uint256).max;
    }

    function updateMaxAmount(uint256 newNum) external onlyOwner {
        require(newNum > (totalSupply() * 5 / 1000)/1e18, "Cannot set maxTransactionAmt lower than 0.5%");
        maxTransactionAmt = newNum * (10**18);
    }
    
    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%");
        maxWallet = newNum * (10**18);
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
  	    require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
  	    require(newAmount <= totalSupply() * 1 / 1000, "Swap amount cannot be higher than 0.1% total supply.");
  	    swapTokensAtAmount = newAmount;
  	}
    
    function updateMaxSellFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
        operationsMaxSellFee = _operationsFee;
        rewardsMaxSellFee = _rewardsFee;
        liquidityMaxSellFee = _liquidityFee;
        totalMaxSellFees = operationsMaxSellFee + rewardsMaxSellFee + liquidityMaxSellFee;
        require(totalMaxSellFees <= 3000, "Must keep fees at 30% or less");
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
        emit ExcludedMaxTransactionAmount(updAds, isEx);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

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

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != lpPair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateOperationsWallet(address newOperationsWallet) external onlyOwner {
        require(newOperationsWallet != address(0), "may not set to 0 address");
        excludeFromFees(newOperationsWallet, true);
        emit OperationsWalletUpdated(newOperationsWallet, operationsAddress);
        operationsAddress = newOperationsWallet;
    }

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

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

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

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

	function dividendTokenBalanceOf(address account) external view returns (uint256) {
		return dividendTracker.holderBalance(account);
	}

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

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

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

    function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }

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

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
    
    function getNumberOfDividends() external view returns(uint256) {
        return dividendTracker.totalBalance();
    }
    
    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool){
        limitsInEffect = false;
        transferDelayEnabled = false;
        return true;
    }
    
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
        if(!tradingActive){
            require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet.");
        }

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to] || swapping){
            setDCAForWallet(to, amount, false);
            super._transfer(from, to, amount);
            dividendTracker.setBalance(payable(from), balanceOf(from));
            dividendTracker.setBalance(payable(to), balanceOf(to));
            return;
        }
        
        if(limitsInEffect){
            // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch.  
            if (transferDelayEnabled){
                if (to != address(dexRouter) && to != address(lpPair)){
                    require(_holderLastTransferBlock[tx.origin] + 5 < block.number && _holderLastTransferBlock[to] + 5 < block.number, "_transfer:: Transfer Delay enabled.  Try again later.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                    _holderLastTransferBlock[to] = block.number;
                    if(tx.gasprice >= gasPriceCheckLimit){
                        require(gweiMapping[tx.gasprice][amount] < block.number, "Dupe Txn");
                        gweiMapping[tx.gasprice][amount] = block.number;
                    }
                }
            }

            //when buy
            if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                require(amount <= maxTransactionAmt, "Buy transfer amount exceeds the maxTransactionAmt.");
                require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
            } 
            //when sell
            else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                require(amount <= maxTransactionAmt, "Sell transfer amount exceeds the maxTransactionAmt.");
            }
            else if(!_isExcludedMaxTransactionAmount[to]) {
                require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
            }
        }

        if (!vestingFinished) {
            
            uint256 airdroppedTokenAmount = airdropAmount[from];

            if (airdroppedTokenAmount > 0) {
                
                uint256 elapsedPeriods = (block.timestamp - launchTime) / vestingPeriodDuration;

                if (elapsedPeriods < vestingPeriods) {
                    uint256 minimumBalance = airdroppedTokenAmount - (
                        // a number ranging from 0 to 100
                        elapsedPeriods * vestingPercent
                        * airdroppedTokenAmount
                        / 100
                    );
                    require(balanceOf(from) - amount >= minimumBalance);
                } else {
                    vestingFinished = true;
                }
            }
        }

        if( 
            automatedMarketMakerPairs[to] && 
            swapEnabled &&
            balanceOf(address(this)) >= swapTokensAtAmount
        ) {
            swapping = true;
            swapBack();
            swapping = false;
        }

        // on sell
        if (automatedMarketMakerPairs[to] && totalMaxSellFees > 0){
            uint256 fees = getWalletCurrentTax(from, amount);
            if(fees > 0){ // only take fees if current wallet tax is non-zero.
                tokensForRewards += fees * rewardsMaxSellFee / totalMaxSellFees;
                tokensForLiquidity += fees * liquidityMaxSellFee / totalMaxSellFees;
                tokensForOperations += fees * operationsMaxSellFee / totalMaxSellFees;
                super._transfer(from, address(this), fees);
                amount -= fees;
            }                
        } else if (automatedMarketMakerPairs[from]){
            setDCAForWallet(to, amount, true);
        } else {
            setDCAForWallet(to, amount, false);
        }

        super._transfer(from, to, amount);

        dividendTracker.setBalance(payable(from), balanceOf(from));
        dividendTracker.setBalance(payable(to), balanceOf(to));
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = dexRouter.WETH();

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
    }
    
    function swapBack() private {
        bool success;

        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForRewards + tokensForOperations + tokensForLiquidity;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmount * 20){
            contractBalance = swapTokensAtAmount * 20;
        }

        if(tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {emit LpSyncFailed();}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForLiquidity;
        }

        swapTokensForEth(contractBalance);
        
        uint256 ethBalance = address(this).balance;

        uint256 ethForOperations = ethBalance * tokensForOperations / totalTokensToSwap;

        tokensForRewards = 0;
        tokensForOperations = 0;
        tokensForLiquidity = 0;

        if(ethForOperations > 0){
            (success, ) = operationsAddress.call{value: ethForOperations}("");
        }

        if(address(this).balance > 0){
            (success, ) = address(dividendTracker).call{value: address(this).balance}("");
        }
    }

    // special functions for taxing only profits and calculating DCA

    function getPriceImpact(uint256 tokenAmount) public view returns (uint256 priceImpact) {
        uint256 amountInWithFee = tokenAmount * 9970 / 10000; // @dev 0.3% for Uniswap V2, 0.25% for PancakeSwap
        return (amountInWithFee * 10000 / (balanceOf(lpPair) + amountInWithFee));
    }

    function getTokenPrice() public view returns (uint256){
        return (IERC20(dexRouter.WETH()).balanceOf(address(lpPair)) * uint256(priceFeed.latestAnswer()) * 1e18 / balanceOf(address(lpPair)) / 1e8); 
    }

    function calculatePurchaseValue(uint256 tokenAmount, bool isPurchase) public view returns (uint256){
        if(isPurchase){
            return((tokenAmount * getTokenPrice()) + (tokenAmount*getTokenPrice()*getPriceImpact(tokenAmount)/10000)/1e18);
        } else {
            // all wallet to wallet transfers will be viewed as a 0 Cost Basis to prevent people from gaming the DCA feature.
            return 0;
        }
    }

    function setDCAForWallet(address wallet, uint256 tokenAmount, bool isPurchase) internal {
        uint256 currentAverage = walletDollarCostAverage[wallet];
        uint256 currentBalance = balanceOf(wallet);
        walletDollarCostAverage[wallet] = (calculatePurchaseValue(tokenAmount, isPurchase) + (currentAverage * currentBalance)) / (currentBalance + tokenAmount);
    }

    function estimateNewDCA(address wallet, uint256 tokenAmount, bool isPurchase) public view returns (uint256){
        uint256 currentAverage = walletDollarCostAverage[wallet];
        uint256 currentBalance = balanceOf(wallet);
        return((calculatePurchaseValue(tokenAmount, isPurchase) + (currentAverage * currentBalance)) / (currentBalance + tokenAmount));
    }    

    // tax is always calculated relative to profits earned.  Tax will only be paid on profits, so this can never be higher than 100% of the max sell tax
    // price impact is not taken into account in light of potential flash loan attacks to destabilize price
    function getRelativeTax(address wallet) public view returns (uint256){
        uint256 tokenPrice = getTokenPrice();
        if(walletDollarCostAverage[wallet] >= tokenPrice){
            return 0;
        }
        return (tokenPrice - walletDollarCostAverage[wallet]) * FEE_DIVISOR / tokenPrice;
    }

    function getWalletCurrentTax(address wallet, uint256 tokenAmount) public view returns (uint256){
        uint256 relativeFee = getRelativeTax(wallet);
        return (tokenAmount * (relativeFee * totalMaxSellFees / FEE_DIVISOR)  / FEE_DIVISOR);
    }

    // recovery features

    function forceSwapBack() external onlyOwner {
        require(balanceOf(address(this)) >= swapTokensAtAmount, "Can only swap when token amount is at or higher than restriction");
        swapping = true;
        swapBack();
        swapping = false;
    }

    function sendEth() external onlyOwner {
        bool success;
        (success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "withdraw unsuccessful");
    }

    function transferForeignToken(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        require(_token != address(this) || !tradingActive, "Can't withdraw native tokens while trading is active");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
    }

    // airdrop function
    function airdropToWallets(address[] calldata wallets, uint256[] calldata amountsInWei, uint256[] calldata walletDcas) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays must be the same length");
        require(wallets.length < 600, "Can only airdrop 600 wallets per txn due to gas limits");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
            airdropAmount[wallets[i]] += amountsInWei[i] / 2;
            dividendTracker.setBalance(payable(wallets[i]), balanceOf(wallets[i]));
            if(walletDcas[i] > walletDollarCostAverage[wallets[i]]){
                walletDollarCostAverage[wallets[i]] = walletDcas[i];
            }
        }
    }
}

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":"uint256","name":"tokensBurned","type":"uint256"}],"name":"AutoBurnLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"LpSyncFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokensBurned","type":"uint256"}],"name":"ManualBurnLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"OperationsWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdropAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"},{"internalType":"uint256[]","name":"walletDcas","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"bool","name":"isPurchase","type":"bool"}],"name":"calculatePurchaseValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasPrice","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"bool","name":"isPurchase","type":"bool"}],"name":"estimateNewDCA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwapBack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasPriceCheckLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getPriceImpact","outputs":[{"internalType":"uint256","name":"priceImpact","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getRelativeTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getWalletCurrentTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"gweiMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityMaxSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsMaxSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeGasPriceCheckLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsMaxSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setGasPriceCheckLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForOperations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaxSellFees","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":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateAllowanceForSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"dcas","type":"uint256[]"}],"name":"updateDCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_operationsFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateMaxSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperationsWallet","type":"address"}],"name":"updateOperationsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingPeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletDollarCostAverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600d819055600e55600f805462ffffff191660019081179091556011805460ff199081169092179055600a601d819055601e55610258601f556020805490911690553480156200005557600080fd5b5060408051808201825260098082526846656e696b6b75737560b81b602080840182905284518086019095529184529083015290600362000097838262000d24565b506004620000a6828262000d24565b5050506000620000bb6200082d60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060008046600103620001485750737a250d5630b4cf539739df2c5dacb4c659f2488d9050735f4ec3df9cbd43714fe2740f5e3616155c5b841962000195565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821660a052604051620001b09062000c71565b604051809103906000f080158015620001cd573d6000803e3d6000fd5b50600860006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000235573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025b919062000df0565b6001600160a01b031663c9c653963060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002d1919062000df0565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200031f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000345919062000df0565b600780546001600160a01b0319166001600160a01b039290921691821790556200037190600162000831565b69d3c21bcecceda10000006103e86200038c82600562000e38565b62000398919062000e58565b600b55612710620003ab82600562000e38565b620003b7919062000e58565b600a556064620003c982600162000e38565b620003d5919062000e58565b600c556001600160a01b0382166080819052604080516350d25bcd60e01b81529051600092916350d25bcd9160048083019260209291908290030181865afa15801562000426573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200044c919062000e7b565b136200048e5760405162461bcd60e51b815260206004820152601060248201526f1ddc9bdb99c81c1c9a58d9481999595960821b60448201526064016200018c565b6101f460158190556107d060168190556017829055620004af908262000e95565b620004bb919062000e95565b601455600980546001600160a01b03191673a09a720e99179ae49243ead407848f626a90f1af17905560085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200052b57600080fd5b505af115801562000540573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200058a57600080fd5b505af11580156200059f573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620005c96005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200060b57600080fd5b505af115801562000620573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b03878116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200066c57600080fd5b505af115801562000681573d6000803e3d6000fd5b505060085460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620006cd57600080fd5b505af1158015620006e2573d6000803e3d6000fd5b5050505062000702620006fa6200090660201b60201c565b600162000915565b620007237314228eab73883e2fb36c31c54649e4ad39290eb6600162000915565b6200073030600162000915565b6200073f61dead600162000915565b6200074c83600162000915565b6200076b620007636005546001600160a01b031690565b6001620009c0565b6200078c7314228eab73883e2fb36c31c54649e4ad39290eb66001620009c0565b62000799306001620009c0565b600854620007b2906001600160a01b03166001620009c0565b620007bf836001620009c0565b620007ce61dead6001620009c0565b620007ec620007e56005546001600160a01b031690565b8262000a64565b6200080d620008036005546001600160a01b031690565b60a0518362000b49565b620008243060a05160001962000b4960201b60201c565b50505062000eab565b3390565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055620008618282620009c0565b8015620008ca5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620008b057600080fd5b505af1158015620008c5573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620009605760405162461bcd60e51b8152602060048201819052602482015260008051602062006df383398151915260448201526064016200018c565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b6005546001600160a01b0316331462000a0b5760405162461bcd60e51b8152602060048201819052602482015260008051602062006df383398151915260448201526064016200018c565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d959101620009b4565b6001600160a01b03821662000abc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200018c565b806002600082825462000ad0919062000e95565b90915550506001600160a01b0382166000908152602081905260408120805483929062000aff90849062000e95565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b03831662000bad5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200018c565b6001600160a01b03821662000c105760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200018c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6116c5806200572e83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000caa57607f821691505b60208210810362000ccb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000d1f57600081815260208120601f850160051c8101602086101562000cfa5750805b601f850160051c820191505b8181101562000d1b5782815560010162000d06565b5050505b505050565b81516001600160401b0381111562000d405762000d4062000c7f565b62000d588162000d51845462000c95565b8462000cd1565b602080601f83116001811462000d90576000841562000d775750858301515b600019600386901b1c1916600185901b17855562000d1b565b600085815260208120601f198616915b8281101562000dc15788860151825594840194600190910190840162000da0565b508582101562000de05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000e0357600080fd5b81516001600160a01b038116811462000e1b57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000e525762000e5262000e22565b92915050565b60008262000e7657634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000e8e57600080fd5b5051919050565b8082018082111562000e525762000e5262000e22565b60805160a05161483a62000ef46000396000818161055a015281816112b1015281816119380152818161319c01528181613d810152613e39015260006118b6015261483a6000f3fe6080604052600436106104da5760003560e01c80638d75b84611610281578063c18bc1951161015a578063e884f260116100cc578063f503412011610085578063f503412014610f07578063f54afa7814610f27578063f8b45b0514610f3d578063fb002c9714610f53578063fdc149ef14610f69578063fe40fd7114610f7f57600080fd5b8063e884f26014610e66578063ea4cfe1214610e7b578063ea6ccbf914610e9b578063ee40166e14610eb1578063f27fd25414610ec7578063f2fde38b14610ee757600080fd5b8063dd62ed3e1161011e578063dd62ed3e14610d8f578063e0bf7fd114610dd5578063e2f4560514610e05578063e32247b814610e1b578063e588ee7514610e3b578063e7841ec014610e5157600080fd5b8063c18bc19514610cf5578063c492f04614610d15578063c876d0b914610d35578063cd27289214610d4f578063d257b34f14610d6f57600080fd5b8063a457c2d7116101f3578063b530dc8c116101b7578063b530dc8c14610c19578063b62496f514610c46578063bbc0c74214610c76578063bfe0d02014610c95578063c024666814610cb5578063c0f306ef14610cd557600080fd5b8063a457c2d714610b3e578063a8b9d24014610b5e578063a9059cbb14610b7e578063abbf007314610b9e578063ad56c13c14610bb457600080fd5b80639a7a23d6116102455780639a7a23d614610a865780639c8a12da14610aa65780639e43fac514610ac65780639e93ad8e14610ae6578063a1144bfc14610afc578063a26579ad14610b2957600080fd5b80638d75b846146109fe5780638da5cb5b14610a1e578063904f684314610a3c578063924de9b714610a5157806395d89b4114610a7157600080fd5b80633aeb6c71116103b3578063700bb1911161032557806375529329116102e957806375529329146109525780637571336a14610968578063790ca4131461098857806382aa7c681461099e5780638366e79a146109be5780638561e8ce146109de57600080fd5b8063700bb191146108d357806370a08231146108f3578063715018a61461091357806371778e7d14610928578063751039fc1461093d57600080fd5b80634fbee193116103775780634fbee1931461081a57806351f205e41461085357806353ae3f0a1461086857806364b0f6531461087e5780636843cd84146108935780636ddd1713146108b357600080fd5b80633aeb6c71146107a0578063452ed4f1146107b65780634a62bb65146107d65780634b94f50e146107f05780634e71d92d1461080557600080fd5b806323b872dd1161044c57806330d5d18d1161041057806330d5d18d146106ea578063313ce5671461070a57806331e79db014610726578063388ac95b14610746578063395093511461076057806339940d751461078057600080fd5b806323b872dd1461066b578063254248961461068b5780632c1f5216146106a057806330769f0c146106c057806330bb4cff146106d557600080fd5b80630f4432e31161049e5780630f4432e3146105c4578063106b5da1146105da57806310d5de53146105fa57806318160ddd1461062a5780631a8145bb1461063f57806320d830551461065557600080fd5b80630640d941146104e657806306e99fef1461050f57806306fdde03146105265780630758d92414610548578063095ea7b31461059457600080fd5b366104e157005b600080fd5b3480156104f257600080fd5b506104fc601f5481565b6040519081526020015b60405180910390f35b34801561051b57600080fd5b50610524610fb7565b005b34801561053257600080fd5b5061053b61107f565b60405161050691906140c8565b34801561055457600080fd5b5061057c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610506565b3480156105a057600080fd5b506105b46105af366004614110565b611111565b6040519015158152602001610506565b3480156105d057600080fd5b506104fc600d5481565b3480156105e657600080fd5b506105246105f536600461413c565b611128565b34801561060657600080fd5b506105b4610615366004614155565b60226020526000908152604090205460ff1681565b34801561063657600080fd5b506002546104fc565b34801561064b57600080fd5b506104fc601a5481565b34801561066157600080fd5b506104fc600b5481565b34801561067757600080fd5b506105b4610686366004614172565b611201565b34801561069757600080fd5b506105246112ab565b3480156106ac57600080fd5b5060085461057c906001600160a01b031681565b3480156106cc57600080fd5b506105246112da565b3480156106e157600080fd5b506104fc61130c565b3480156106f657600080fd5b50610524610705366004614155565b61137f565b34801561071657600080fd5b5060405160128152602001610506565b34801561073257600080fd5b50610524610741366004614155565b611467565b34801561075257600080fd5b506020546105b49060ff1681565b34801561076c57600080fd5b506105b461077b366004614110565b6114f4565b34801561078c57600080fd5b5061052461079b3660046141ff565b611530565b3480156107ac57600080fd5b506104fc601e5481565b3480156107c257600080fd5b5060075461057c906001600160a01b031681565b3480156107e257600080fd5b50600f546105b49060ff1681565b3480156107fc57600080fd5b506104fc611896565b34801561081157600080fd5b50610524611a55565b34801561082657600080fd5b506105b4610835366004614155565b6001600160a01b031660009081526021602052604090205460ff1690565b34801561085f57600080fd5b50610524611aca565b34801561087457600080fd5b506104fc60155481565b34801561088a57600080fd5b506104fc611ba0565b34801561089f57600080fd5b506104fc6108ae366004614155565b611bea565b3480156108bf57600080fd5b50600f546105b49062010000900460ff1681565b3480156108df57600080fd5b506105246108ee36600461413c565b611c5a565b3480156108ff57600080fd5b506104fc61090e366004614155565b611d2d565b34801561091f57600080fd5b50610524611d48565b34801561093457600080fd5b506104fc611dbc565b34801561094957600080fd5b506105b4611e06565b34801561095e57600080fd5b506104fc60175481565b34801561097457600080fd5b506105246109833660046142a7565b611e4f565b34801561099457600080fd5b506104fc601c5481565b3480156109aa57600080fd5b506105246109b936600461413c565b611ed9565b3480156109ca57600080fd5b506105246109d93660046142e0565b611f88565b3480156109ea57600080fd5b506104fc6109f936600461430e565b61210e565b348015610a0a57600080fd5b506104fc610a19366004614110565b61216f565b348015610a2a57600080fd5b506005546001600160a01b031661057c565b348015610a4857600080fd5b506105246121b5565b348015610a5d57600080fd5b50610524610a6c366004614350565b612238565b348015610a7d57600080fd5b5061053b61227e565b348015610a9257600080fd5b50610524610aa13660046142a7565b61228d565b348015610ab257600080fd5b50610524610ac136600461436d565b612357565b348015610ad257600080fd5b506104fc610ae13660046143d9565b6124af565b348015610af257600080fd5b506104fc61271081565b348015610b0857600080fd5b506104fc610b17366004614155565b60066020526000908152604090205481565b348015610b3557600080fd5b506104fc612527565b348015610b4a57600080fd5b506105b4610b59366004614110565b612571565b348015610b6a57600080fd5b506104fc610b79366004614155565b61260a565b348015610b8a57600080fd5b506105b4610b99366004614110565b61263d565b348015610baa57600080fd5b506104fc60135481565b348015610bc057600080fd5b50610bd4610bcf366004614155565b61264a565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610506565b348015610c2557600080fd5b506104fc610c34366004614155565b601b6020526000908152604090205481565b348015610c5257600080fd5b506105b4610c61366004614155565b60236020526000908152604090205460ff1681565b348015610c8257600080fd5b50600f546105b490610100900460ff1681565b348015610ca157600080fd5b506104fc610cb0366004614155565b6126e5565b348015610cc157600080fd5b50610524610cd03660046142a7565b61275f565b348015610ce157600080fd5b50610524610cf0366004614155565b6127e1565b348015610d0157600080fd5b50610524610d1036600461413c565b61283d565b348015610d2157600080fd5b50610524610d303660046143fe565b61290b565b348015610d4157600080fd5b506011546105b49060ff1681565b348015610d5b57600080fd5b50610524610d6a36600461413c565b6129e7565b348015610d7b57600080fd5b50610524610d8a36600461413c565b612a1f565b348015610d9b57600080fd5b506104fc610daa3660046142e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610de157600080fd5b506105b4610df0366004614155565b60216020526000908152604090205460ff1681565b348015610e1157600080fd5b506104fc600a5481565b348015610e2757600080fd5b50610524610e3636600461444a565b612b6a565b348015610e4757600080fd5b506104fc60165481565b348015610e5d57600080fd5b506104fc612c0e565b348015610e7257600080fd5b50610524612c58565b348015610e8757600080fd5b5060095461057c906001600160a01b031681565b348015610ea757600080fd5b506104fc60145481565b348015610ebd57600080fd5b506104fc600e5481565b348015610ed357600080fd5b50610bd4610ee236600461413c565b612c8e565b348015610ef357600080fd5b50610524610f02366004614155565b612cd0565b348015610f1357600080fd5b506104fc610f2236600461413c565b612dbb565b348015610f3357600080fd5b506104fc60185481565b348015610f4957600080fd5b506104fc600c5481565b348015610f5f57600080fd5b506104fc60195481565b348015610f7557600080fd5b506104fc601d5481565b348015610f8b57600080fd5b506104fc610f9a366004614476565b601260209081526000928352604080842090915290825290205481565b6005546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610fe190614498565b60405180910390fd5b604051600090339047908381818185875af1925050503d806000811461102c576040519150601f19603f3d011682016040523d82523d6000602084013e611031565b606091505b5050809150508061107c5760405162461bcd60e51b81526020600482015260156024820152741dda5d1a191c985dc81d5b9cdd58d8d95cdcd99d5b605a1b6044820152606401610fe1565b50565b60606003805461108e906144cd565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba906144cd565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905090565b600061111e338484612e07565b5060015b92915050565b6005546001600160a01b031633146111525760405162461bcd60e51b8152600401610fe190614498565b670de0b6b3a76400006103e861116760025490565b61117290600561451d565b61117c9190614534565b6111869190614534565b81116111e95760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610fe1565b6111fb81670de0b6b3a764000061451d565b600b5550565b600061120e848484612f2b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156112935760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610fe1565b6112a08533858403612e07565b506001949350505050565b6112d8307f0000000000000000000000000000000000000000000000000000000000000000600019612e07565b565b6005546001600160a01b031633146113045760405162461bcd60e51b8152600401610fe190614498565b600019601355565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137a9190614556565b905090565b6005546001600160a01b031633146113a95760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b0381166113ff5760405162461bcd60e51b815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610fe1565b61140a81600161275f565b6009546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114915760405162461bcd60e51b8152600401610fe190614498565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161111e91859061152b90869061456f565b612e07565b6005546001600160a01b0316331461155a5760405162461bcd60e51b8152600401610fe190614498565b8483146115a95760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610fe1565b61025885106116195760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610fe1565b60005b8581101561188d5761166d3388888481811061163a5761163a614582565b905060200201602081019061164f9190614155565b87878581811061166157611661614582565b905060200201356137fa565b600285858381811061168157611681614582565b905060200201356116929190614534565b601b60008989858181106116a8576116a8614582565b90506020020160208101906116bd9190614155565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546116ec919061456f565b90915550506008546001600160a01b031663e30443bc88888481811061171457611714614582565b90506020020160208101906117299190614155565b6117538a8a8681811061173e5761173e614582565b905060200201602081019061090e9190614155565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b50505050600660008888848181106117c7576117c7614582565b90506020020160208101906117dc9190614155565b6001600160a01b03166001600160a01b031681526020019081526020016000205483838381811061180f5761180f614582565b90506020020135111561187b5782828281811061182e5761182e614582565b905060200201356006600089898581811061184b5761184b614582565b90506020020160208101906118609190614155565b6001600160a01b031681526020810191909152604001600020555b8061188581614598565b91505061161c565b50505050505050565b6007546000906305f5e100906118b4906001600160a01b0316611d2d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119369190614556565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906145b1565b6007546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a259190614556565b611a2f919061451d565b611a4190670de0b6b3a764000061451d565b611a4b9190614534565b61137a9190614534565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906145ce565b6005546001600160a01b03163314611af45760405162461bcd60e51b8152600401610fe190614498565b600a54611b0030611d2d565b1015611b76576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610fe1565b6007805460ff60a01b1916600160a01b179055611b91613941565b6007805460ff60a01b19169055565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b60085460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614556565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906145eb565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611d725760405162461bcd60e51b8152600401610fe190614498565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6008546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b6005546000906001600160a01b03163314611e335760405162461bcd60e51b8152600401610fe190614498565b50600f805460ff19908116909155601180549091169055600190565b6005546001600160a01b03163314611e795760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b03163314611f035760405162461bcd60e51b8152600401610fe190614498565b600f54610100900460ff1615611f5b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610fe1565b600f805462ffff0019166201010017905543600e5542601c55611f8281633b9aca0061451d565b60135550565b6005546001600160a01b03163314611fb25760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b0382166120085760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610fe1565b6001600160a01b038216301415806120285750600f54610100900460ff16155b6120915760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610fe1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156120d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fc9190614556565b9050612109838383613b8e565b505050565b6001600160a01b0383166000908152600660205260408120548161213186611d2d565b905061213d858261456f565b612147828461451d565b61215187876124af565b61215b919061456f565b6121659190614534565b9695505050505050565b60008061217b846126e5565b9050612710806014548361218f919061451d565b6121999190614534565b6121a3908561451d565b6121ad9190614534565b949350505050565b6005546001600160a01b031633146121df5760405162461bcd60e51b8152600401610fe190614498565b60205460ff16156122295760405162461bcd60e51b81526020600482015260146024820152732b32b9ba34b7339030b63932b0b23c9037bb32b960611b6044820152606401610fe1565b6020805460ff19166001179055565b6005546001600160a01b031633146122625760405162461bcd60e51b8152600401610fe190614498565b600f8054911515620100000262ff000019909216919091179055565b60606004805461108e906144cd565b6005546001600160a01b031633146122b75760405162461bcd60e51b8152600401610fe190614498565b6007546001600160a01b03908116908316036123495760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610fe1565b6123538282613be0565b5050565b6005546001600160a01b031633146123815760405162461bcd60e51b8152600401610fe190614498565b8281146123c85760405162461bcd60e51b81526020600482015260156024820152740c2e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606401610fe1565b60005b838110156114ed57600660008686848181106123e9576123e9614582565b90506020020160208101906123fe9190614155565b6001600160a01b03166001600160a01b031681526020019081526020016000205483838381811061243157612431614582565b90506020020135111561249d5782828281811061245057612450614582565b905060200201356006600087878581811061246d5761246d614582565b90506020020160208101906124829190614155565b6001600160a01b031681526020810191909152604001600020555b806124a781614598565b9150506123cb565b6000811561251f57670de0b6b3a76400006127106124cc85612dbb565b6124d4611896565b6124de908761451d565b6124e8919061451d565b6124f29190614534565b6124fc9190614534565b612504611896565b61250e908561451d565b612518919061456f565b9050611122565b506000611122565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156125f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fe1565b6126003385858403612e07565b5060019392505050565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611c19565b600061111e338484612f2b565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156126a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ca9190614619565b97509750975097509750975097509750919395975091939597565b6000806126f0611896565b6001600160a01b038416600090815260066020526040902054909150811161271b5750600092915050565b6001600160a01b0383166000908152600660205260409020548190612710906127449083614683565b61274e919061451d565b6127589190614534565b9392505050565b6005546001600160a01b031633146127895760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611ecd565b6005546001600160a01b0316331461280b5760405162461bcd60e51b8152600401610fe190614498565b60085460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016114bf565b6005546001600160a01b031633146128675760405162461bcd60e51b8152600401610fe190614498565b670de0b6b3a7640000606461287b60025490565b61288690600161451d565b6128909190614534565b61289a9190614534565b81116128f35760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610fe1565b61290581670de0b6b3a764000061451d565b600c5550565b6005546001600160a01b031633146129355760405162461bcd60e51b8152600401610fe190614498565b60005b828110156129a657816021600086868581811061295757612957614582565b905060200201602081019061296c9190614155565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061299e81614598565b915050612938565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516129da93929190614696565b60405180910390a1505050565b6005546001600160a01b03163314612a115760405162461bcd60e51b8152600401610fe190614498565b611f8281633b9aca0061451d565b6005546001600160a01b03163314612a495760405162461bcd60e51b8152600401610fe190614498565b620186a0612a5660025490565b612a6190600161451d565b612a6b9190614534565b811015612ad85760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610fe1565b6103e8612ae460025490565b612aef90600161451d565b612af99190614534565b811115612b655760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610fe1565b600a55565b6005546001600160a01b03163314612b945760405162461bcd60e51b8152600401610fe190614498565b60168390556015829055601781905580612bae838561456f565b612bb8919061456f565b6014819055610bb810156121095760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610fe1565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b6005546001600160a01b03163314612c825760405162461bcd60e51b8152600401610fe190614498565b6011805460ff19169055565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401612688565b6005546001600160a01b03163314612cfa5760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038116612d5f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fe1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080612710612dcd846126f261451d565b612dd79190614534565b6007549091508190612df1906001600160a01b0316611d2d565b612dfb919061456f565b61274e8261271061451d565b6001600160a01b038316612e695760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fe1565b6001600160a01b038216612eca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fe1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612f515760405162461bcd60e51b8152600401610fe1906146ef565b6001600160a01b038216612f775760405162461bcd60e51b8152600401610fe190614734565b80600003612f8b57612109838360006137fa565b600f54610100900460ff16613025576001600160a01b03831660009081526021602052604090205460ff1680612fd957506001600160a01b03821660009081526021602052604090205460ff165b6130255760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610fe1565b6001600160a01b03831660009081526021602052604090205460ff168061306457506001600160a01b03821660009081526021602052604090205460ff165b806130785750600754600160a01b900460ff165b156131845761308982826000613cb0565b6130948383836137fa565b6008546001600160a01b031663e30443bc846130af81611d2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130f557600080fd5b505af1158015613109573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361312a81611d2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561317057600080fd5b505af115801561188d573d6000803e3d6000fd5b600f5460ff16156135995760115460ff1615613345577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141580156131ea57506007546001600160a01b03838116911614155b156133455732600090815260106020526040902054439061320c90600561456f565b10801561323c57506001600160a01b038216600090815260106020526040902054439061323a90600561456f565b105b6132a65760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610fe1565b3260009081526010602052604080822043908190556001600160a01b03851683529120556013543a10613345573a600090815260126020908152604080832084845290915290205443116133275760405162461bcd60e51b8152602060048201526008602482015267223ab832902a3c3760c11b6044820152606401610fe1565b3a600090815260126020908152604080832084845290915290204390555b6001600160a01b03831660009081526023602052604090205460ff16801561338657506001600160a01b03821660009081526022602052604090205460ff16155b1561346157600b548111156133f85760405162461bcd60e51b815260206004820152603260248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527136b0bc2a3930b739b0b1ba34b7b720b6ba1760711b6064820152608401610fe1565b600c5461340483611d2d565b61340e908361456f565b111561345c5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610fe1565b613599565b6001600160a01b03821660009081526023602052604090205460ff1680156134a257506001600160a01b03831660009081526022602052604090205460ff16155b1561351557600b5481111561345c5760405162461bcd60e51b815260206004820152603360248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152721036b0bc2a3930b739b0b1ba34b7b720b6ba1760691b6064820152608401610fe1565b6001600160a01b03821660009081526022602052604090205460ff1661359957600c5461354183611d2d565b61354b908361456f565b11156135995760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610fe1565b60205460ff16613656576001600160a01b0383166000908152601b60205260409020548015613654576000601f54601c54426135d59190614683565b6135df9190614534565b9050601d54811015613644576000606483601e54846135fe919061451d565b613608919061451d565b6136129190614534565b61361c9084614683565b9050808461362988611d2d565b6136339190614683565b101561363e57600080fd5b50613652565b6020805460ff191660011790555b505b505b6001600160a01b03821660009081526023602052604090205460ff1680156136865750600f5462010000900460ff165b801561369c5750600a5461369930611d2d565b10155b156136ca576007805460ff60a01b1916600160a01b1790556136bc613941565b6007805460ff60a01b191690555b6001600160a01b03821660009081526023602052604090205460ff1680156136f457506000601454115b156137bc576000613705848361216f565b905080156137b65760145460155461371d908361451d565b6137279190614534565b60186000828254613738919061456f565b909155505060145460175461374d908361451d565b6137579190614534565b601a6000828254613768919061456f565b909155505060145460165461377d908361451d565b6137879190614534565b60196000828254613798919061456f565b909155506137a990508430836137fa565b6137b38183614683565b91505b50613089565b6001600160a01b03831660009081526023602052604090205460ff16156137ee576137e982826001613cb0565b613089565b61308982826000613cb0565b6001600160a01b0383166138205760405162461bcd60e51b8152600401610fe1906146ef565b6001600160a01b0382166138465760405162461bcd60e51b8152600401610fe190614734565b6001600160a01b038316600090815260208190526040902054818110156138be5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610fe1565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f590849061456f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d1f91815260200190565b60008061394d30611d2d565b90506000601a54601954601854613964919061456f565b61396e919061456f565b905081158061397b575080155b1561398557505050565b600a5461399390601461451d565b8211156139ab57600a546139a890601461451d565b91505b601a5415613a9657600081601a54846139c4919061451d565b6139ce9190614534565b6007549091506139e99030906001600160a01b0316836137fa565b600760009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a3957600080fd5b505af1925050508015613a4a575060015b613a78576040517f369bc1927dd877d0df49584cd599d33d299580bdbb12f0ec30ef965da981640190600090a15b613a828184614683565b9250601a5482613a929190614683565b9150505b613a9f82613d2a565b60195447906000908390613ab3908461451d565b613abd9190614534565b600060188190556019819055601a5590508015613b2c576009546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613b21576040519150601f19603f3d011682016040523d82523d6000602084013e613b26565b606091505b50909550505b47156114ed576008546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613b7f576040519150601f19603f3d011682016040523d82523d6000602084013e613b84565b606091505b5050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612109908490613eaf565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055613c0e8282611e4f565b8015613c745760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831660009081526006602052604081205490613cd385611d2d565b9050613cdf848261456f565b613ce9828461451d565b613cf386866124af565b613cfd919061456f565b613d079190614534565b6001600160a01b0390951660009081526006602052604090209490945550505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d5f57613d5f614582565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0191906145b1565b81600181518110613e1457613e14614582565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790613e79908590600090869030904290600401614777565b600060405180830381600087803b158015613e9357600080fd5b505af1158015613ea7573d6000803e3d6000fd5b505050505050565b6000613f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613f819092919063ffffffff16565b8051909150156121095780806020019051810190613f2291906145ce565b6121095760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610fe1565b60606121ad848460008585600080866001600160a01b03168587604051613fa891906147e8565b60006040518083038185875af1925050503d8060008114613fe5576040519150601f19603f3d011682016040523d82523d6000602084013e613fea565b606091505b5091509150613ffb87838387614006565b979650505050505050565b6060831561407557825160000361406e576001600160a01b0385163b61406e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610fe1565b50816121ad565b6121ad838381511561408a5781518083602001fd5b8060405162461bcd60e51b8152600401610fe191906140c8565b60005b838110156140bf5781810151838201526020016140a7565b50506000910152565b60208152600082518060208401526140e78160408501602087016140a4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461107c57600080fd5b6000806040838503121561412357600080fd5b823561412e816140fb565b946020939093013593505050565b60006020828403121561414e57600080fd5b5035919050565b60006020828403121561416757600080fd5b8135612758816140fb565b60008060006060848603121561418757600080fd5b8335614192816140fb565b925060208401356141a2816140fb565b929592945050506040919091013590565b60008083601f8401126141c557600080fd5b50813567ffffffffffffffff8111156141dd57600080fd5b6020830191508360208260051b85010111156141f857600080fd5b9250929050565b6000806000806000806060878903121561421857600080fd5b863567ffffffffffffffff8082111561423057600080fd5b61423c8a838b016141b3565b9098509650602089013591508082111561425557600080fd5b6142618a838b016141b3565b9096509450604089013591508082111561427a57600080fd5b5061428789828a016141b3565b979a9699509497509295939492505050565b801515811461107c57600080fd5b600080604083850312156142ba57600080fd5b82356142c5816140fb565b915060208301356142d581614299565b809150509250929050565b600080604083850312156142f357600080fd5b82356142fe816140fb565b915060208301356142d5816140fb565b60008060006060848603121561432357600080fd5b833561432e816140fb565b925060208401359150604084013561434581614299565b809150509250925092565b60006020828403121561436257600080fd5b813561275881614299565b6000806000806040858703121561438357600080fd5b843567ffffffffffffffff8082111561439b57600080fd5b6143a7888389016141b3565b909650945060208701359150808211156143c057600080fd5b506143cd878288016141b3565b95989497509550505050565b600080604083850312156143ec57600080fd5b8235915060208301356142d581614299565b60008060006040848603121561441357600080fd5b833567ffffffffffffffff81111561442a57600080fd5b614436868287016141b3565b909450925050602084013561434581614299565b60008060006060848603121561445f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561448957600080fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144e157607f821691505b60208210810361450157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761112257611122614507565b60008261455157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561456857600080fd5b5051919050565b8082018082111561112257611122614507565b634e487b7160e01b600052603260045260246000fd5b6000600182016145aa576145aa614507565b5060010190565b6000602082840312156145c357600080fd5b8151612758816140fb565b6000602082840312156145e057600080fd5b815161275881614299565b60008060006060848603121561460057600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b03121561463657600080fd5b8851614641816140fb565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b8181038181111561112257611122614507565b6040808252810183905260008460608301825b868110156146d95782356146bc816140fb565b6001600160a01b03168252602092830192909101906001016146a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156147c75784516001600160a01b0316835293830193918301916001016147a2565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516147fa8184602087016140a4565b919091019291505056fea264697066735822122056bb09f1fbf8d50d006f5872ee1284f6c51cc5718d72811b895ebd3839d76f6f64736f6c6343000811003360a060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600e81905560805260805161164761007e60003960008181610456015261098601526116476000f3fe6080604052600436106101855760003560e01c806391b89fba116100d1578063be10b6141161008a578063e7841ec011610064578063e7841ec0146104b8578063f2fde38b146104cd578063fbcbc0f1146104ed578063ffb2c4791461050d57600080fd5b8063be10b61414610444578063c0f306ef14610478578063e30443bc1461049857600080fd5b806391b89fba1461036b578063a8b9d2401461038b578063aafd847a146103ab578063ab6ddfa8146103e1578063ad7a672f1461040e578063bc4c4b371461042457600080fd5b80634e7b827f1161013e5780636f2789ec116101185780636f2789ec14610302578063715018a61461031857806385a6b3ae1461032d5780638da5cb5b1461034357600080fd5b80634e7b827f146102485780635183d6fd146102885780636a474002146102ed57600080fd5b806303c833021461019957806309bbedde146101a1578063226cfa3d146101c557806327ce0147146101f25780633009a6091461021257806331e79db01461022857600080fd5b3661019457610192610548565b005b600080fd5b610192610548565b3480156101ad57600080fd5b506007545b6040519081526020015b60405180910390f35b3480156101d157600080fd5b506101b26101e03660046113ec565b600d6020526000908152604090205481565b3480156101fe57600080fd5b506101b261020d3660046113ec565b6105d2565b34801561021e57600080fd5b506101b2600b5481565b34801561023457600080fd5b506101926102433660046113ec565b610635565b34801561025457600080fd5b506102786102633660046113ec565b600c6020526000908152604090205460ff1681565b60405190151581526020016101bc565b34801561029457600080fd5b506102a86102a3366004611409565b6106d6565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101bc565b3480156102f957600080fd5b50610192610743565b34801561030e57600080fd5b506101b2600e5481565b34801561032457600080fd5b5061019261074f565b34801561033957600080fd5b506101b260065481565b34801561034f57600080fd5b506000546040516001600160a01b0390911681526020016101bc565b34801561037757600080fd5b506101b26103863660046113ec565b6107c3565b34801561039757600080fd5b506101b26103a63660046113ec565b6107ca565b3480156103b757600080fd5b506101b26103c63660046113ec565b6001600160a01b031660009081526003602052604090205490565b3480156103ed57600080fd5b506101b26103fc3660046113ec565b60046020526000908152604090205481565b34801561041a57600080fd5b506101b260055481565b34801561043057600080fd5b5061027861043f366004611422565b6107f6565b34801561045057600080fd5b506101b27f000000000000000000000000000000000000000000000000000000000000000081565b34801561048457600080fd5b506101926104933660046113ec565b6108a2565b3480156104a457600080fd5b506101926104b3366004611460565b61093a565b3480156104c457600080fd5b50600b546101b2565b3480156104d957600080fd5b506101926104e83660046113ec565b6109e9565b3480156104f957600080fd5b506102a86105083660046113ec565b610ad3565b34801561051957600080fd5b5061052d610528366004611409565b610bba565b604080519384526020840192909252908201526060016101bc565b600060055411801561055a5750600034115b156105d0576005546105879061057434600160801b610cd7565b61057e91906114a2565b60015490610d60565b60015560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26006546105cc9034610d60565b6006555b565b6001600160a01b0381166000908152600260209081526040808320546004909252822054600154600160801b92610625926106209261061a916106159190610cd7565b610dbf565b90610dcf565b610e0d565b61062f91906114a2565b92915050565b6000546001600160a01b031633146106685760405162461bcd60e51b815260040161065f906114c4565b60405180910390fd5b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610696908290610e20565b61069f81610eb9565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6000806000806000806000806106eb60075490565b8910610710575060009650600019955085945086935083925082915081905080610738565b600061071b8a610fec565b905061072681610ad3565b98509850985098509850985098509850505b919395975091939597565b61074c3361101f565b50565b6000546001600160a01b031633146107795760405162461bcd60e51b815260040161065f906114c4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600061062f825b6001600160a01b03811660009081526003602052604081205461062f906107f0846105d2565b90611160565b600080546001600160a01b031633146108215760405162461bcd60e51b815260040161065f906114c4565b600061082c8461101f565b90508015610898576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906108869085815260200190565b60405180910390a3600191505061062f565b5060009392505050565b6000546001600160a01b031633146108cc5760405162461bcd60e51b815260040161065f906114c4565b6001600160a01b0381166000908152600c602052604090205460ff166108f157600080fd5b6001600160a01b0381166000818152600c6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b6000546001600160a01b031633146109645760405162461bcd60e51b815260040161065f906114c4565b6001600160a01b0382166000908152600c602052604090205460ff166109e5577f000000000000000000000000000000000000000000000000000000000000000081106109c4576109b58282610e20565b6109bf82826111a2565b6109d8565b6109cf826000610e20565b6109d882610eb9565b6109e38260016107f6565b505b5050565b6000546001600160a01b03163314610a135760405162461bcd60e51b815260040161065f906114c4565b6001600160a01b038116610a785760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161065f565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b806000808080808080610ae588611260565b9650600019955060008712610b4757600b54871115610b1357600b54610b0c9088906112a5565b9550610b47565b600b5460075460009110610b28576000610b37565b600b54600754610b3791611160565b9050610b438882610dcf565b9650505b610b50886107ca565b9450610b5b886105d2565b6001600160a01b0389166000908152600d6020526040902054909450925082610b85576000610b93565b600e54610b93908490610d60565b9150428211610ba3576000610bad565b610bad8242611160565b9050919395975091939597565b60075460009081908190808203610bdc575050600b5460009250829150610cd0565b600b546000805a90506000805b8984108015610bf757508582105b15610cbf5784610c06816114f9565b60075490965086109050610c1957600094505b600060076000018681548110610c3157610c31611512565b60009182526020808320909101546001600160a01b0316808352600d909152604090912054909150610c62906112e2565b15610c8557610c728160016107f6565b15610c855781610c81816114f9565b9250505b82610c8f816114f9565b93505060005a905080851115610cb657610cb3610cac8683611160565b8790610d60565b95505b9350610be99050565b600b85905590975095509193505050505b9193909250565b600082600003610ce95750600061062f565b6000610cf58385611528565b905082610d0285836114a2565b14610d595760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161065f565b9392505050565b600080610d6d838561153f565b905083811015610d595760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161065f565b6000818181121561062f57600080fd5b600080610ddc8385611552565b905060008312158015610def5750838112155b80610e045750600083128015610e0457508381125b610d5957600080fd5b600080821215610e1c57600080fd5b5090565b6001600160a01b038216600090815260046020526040902080549082905580821115610e7c576000610e528383611160565b9050610e5e8482611309565b8060056000828254610e70919061153f565b909155506109e3915050565b808210156109e3576000610e908284611160565b9050610e9c8482611363565b8060056000828254610eae919061157a565b909155505050505050565b6001600160a01b0381166000908152600a602052604090205460ff16610edc5750565b6001600160a01b0381166000908152600a60209081526040808320805460ff19169055600882528083208390556009909152812054600754909190610f239060019061157a565b9050600060076000018281548110610f3d57610f3d611512565b60009182526020808320909101546001600160a01b0390811680845260099092526040808420879055908716835282209190915560078054919250829185908110610f8a57610f8a611512565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790556007805480610fc457610fc461158d565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b60006007600001828154811061100457611004611512565b6000918252602090912001546001600160a01b031692915050565b60008061102b836107ca565b90508015611157576001600160a01b0383166000908152600360205260409020546110569082610d60565b6001600160a01b038416600081815260036020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906110a59084815260200190565b60405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d80600081146110fa576040519150601f19603f3d011682016040523d82523d6000602084013e6110ff565b606091505b5050905080611150576001600160a01b03841660009081526003602052604090205461112b9083611160565b6001600160a01b03909416600090815260036020526040812094909455509192915050565b5092915050565b50600092915050565b6000610d5983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061139d565b6001600160a01b0382166000908152600a602052604090205460ff16156111e0576001600160a01b0391909116600090815260086020526040902055565b6001600160a01b0382166000818152600a60209081526040808320805460ff1916600190811790915560088352818420869055600780546009909452918420839055820181559091527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600a602052604081205460ff166112895750600019919050565b506001600160a01b031660009081526009602052604090205490565b6000806112b283856115a3565b9050600083121580156112c55750838113155b80610e045750600083128015610e045750838113610d5957600080fd5b6000428211156112f457506000919050565b600e546113014284611160565b101592915050565b61134361132461061583600154610cd790919063ffffffff16565b6001600160a01b038416600090815260026020526040902054906112a5565b6001600160a01b0390921660009081526002602052604090209190915550565b61134361137e61061583600154610cd790919063ffffffff16565b6001600160a01b03841660009081526002602052604090205490610dcf565b600081848411156113c15760405162461bcd60e51b815260040161065f91906115c3565b5060006113ce848661157a565b95945050505050565b6001600160a01b038116811461074c57600080fd5b6000602082840312156113fe57600080fd5b8135610d59816113d7565b60006020828403121561141b57600080fd5b5035919050565b6000806040838503121561143557600080fd5b8235611440816113d7565b91506020830135801515811461145557600080fd5b809150509250929050565b6000806040838503121561147357600080fd5b823561147e816113d7565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b6000826114bf57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006001820161150b5761150b61148c565b5060010190565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761062f5761062f61148c565b8082018082111561062f5761062f61148c565b80820182811260008312801582168215821617156115725761157261148c565b505092915050565b8181038181111561062f5761062f61148c565b634e487b7160e01b600052603160045260246000fd5b81810360008312801583831316838312821617156111505761115061148c565b600060208083528351808285015260005b818110156115f0578581018301518582016040015282016115d4565b506000604082860101526040601f19601f830116850101925050509291505056fea264697066735822122012371724598703c4bb2623ac8cf755576b0dff8823562c17c18dbfae1d55ae8064736f6c634300081100334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x6080604052600436106104da5760003560e01c80638d75b84611610281578063c18bc1951161015a578063e884f260116100cc578063f503412011610085578063f503412014610f07578063f54afa7814610f27578063f8b45b0514610f3d578063fb002c9714610f53578063fdc149ef14610f69578063fe40fd7114610f7f57600080fd5b8063e884f26014610e66578063ea4cfe1214610e7b578063ea6ccbf914610e9b578063ee40166e14610eb1578063f27fd25414610ec7578063f2fde38b14610ee757600080fd5b8063dd62ed3e1161011e578063dd62ed3e14610d8f578063e0bf7fd114610dd5578063e2f4560514610e05578063e32247b814610e1b578063e588ee7514610e3b578063e7841ec014610e5157600080fd5b8063c18bc19514610cf5578063c492f04614610d15578063c876d0b914610d35578063cd27289214610d4f578063d257b34f14610d6f57600080fd5b8063a457c2d7116101f3578063b530dc8c116101b7578063b530dc8c14610c19578063b62496f514610c46578063bbc0c74214610c76578063bfe0d02014610c95578063c024666814610cb5578063c0f306ef14610cd557600080fd5b8063a457c2d714610b3e578063a8b9d24014610b5e578063a9059cbb14610b7e578063abbf007314610b9e578063ad56c13c14610bb457600080fd5b80639a7a23d6116102455780639a7a23d614610a865780639c8a12da14610aa65780639e43fac514610ac65780639e93ad8e14610ae6578063a1144bfc14610afc578063a26579ad14610b2957600080fd5b80638d75b846146109fe5780638da5cb5b14610a1e578063904f684314610a3c578063924de9b714610a5157806395d89b4114610a7157600080fd5b80633aeb6c71116103b3578063700bb1911161032557806375529329116102e957806375529329146109525780637571336a14610968578063790ca4131461098857806382aa7c681461099e5780638366e79a146109be5780638561e8ce146109de57600080fd5b8063700bb191146108d357806370a08231146108f3578063715018a61461091357806371778e7d14610928578063751039fc1461093d57600080fd5b80634fbee193116103775780634fbee1931461081a57806351f205e41461085357806353ae3f0a1461086857806364b0f6531461087e5780636843cd84146108935780636ddd1713146108b357600080fd5b80633aeb6c71146107a0578063452ed4f1146107b65780634a62bb65146107d65780634b94f50e146107f05780634e71d92d1461080557600080fd5b806323b872dd1161044c57806330d5d18d1161041057806330d5d18d146106ea578063313ce5671461070a57806331e79db014610726578063388ac95b14610746578063395093511461076057806339940d751461078057600080fd5b806323b872dd1461066b578063254248961461068b5780632c1f5216146106a057806330769f0c146106c057806330bb4cff146106d557600080fd5b80630f4432e31161049e5780630f4432e3146105c4578063106b5da1146105da57806310d5de53146105fa57806318160ddd1461062a5780631a8145bb1461063f57806320d830551461065557600080fd5b80630640d941146104e657806306e99fef1461050f57806306fdde03146105265780630758d92414610548578063095ea7b31461059457600080fd5b366104e157005b600080fd5b3480156104f257600080fd5b506104fc601f5481565b6040519081526020015b60405180910390f35b34801561051b57600080fd5b50610524610fb7565b005b34801561053257600080fd5b5061053b61107f565b60405161050691906140c8565b34801561055457600080fd5b5061057c7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610506565b3480156105a057600080fd5b506105b46105af366004614110565b611111565b6040519015158152602001610506565b3480156105d057600080fd5b506104fc600d5481565b3480156105e657600080fd5b506105246105f536600461413c565b611128565b34801561060657600080fd5b506105b4610615366004614155565b60226020526000908152604090205460ff1681565b34801561063657600080fd5b506002546104fc565b34801561064b57600080fd5b506104fc601a5481565b34801561066157600080fd5b506104fc600b5481565b34801561067757600080fd5b506105b4610686366004614172565b611201565b34801561069757600080fd5b506105246112ab565b3480156106ac57600080fd5b5060085461057c906001600160a01b031681565b3480156106cc57600080fd5b506105246112da565b3480156106e157600080fd5b506104fc61130c565b3480156106f657600080fd5b50610524610705366004614155565b61137f565b34801561071657600080fd5b5060405160128152602001610506565b34801561073257600080fd5b50610524610741366004614155565b611467565b34801561075257600080fd5b506020546105b49060ff1681565b34801561076c57600080fd5b506105b461077b366004614110565b6114f4565b34801561078c57600080fd5b5061052461079b3660046141ff565b611530565b3480156107ac57600080fd5b506104fc601e5481565b3480156107c257600080fd5b5060075461057c906001600160a01b031681565b3480156107e257600080fd5b50600f546105b49060ff1681565b3480156107fc57600080fd5b506104fc611896565b34801561081157600080fd5b50610524611a55565b34801561082657600080fd5b506105b4610835366004614155565b6001600160a01b031660009081526021602052604090205460ff1690565b34801561085f57600080fd5b50610524611aca565b34801561087457600080fd5b506104fc60155481565b34801561088a57600080fd5b506104fc611ba0565b34801561089f57600080fd5b506104fc6108ae366004614155565b611bea565b3480156108bf57600080fd5b50600f546105b49062010000900460ff1681565b3480156108df57600080fd5b506105246108ee36600461413c565b611c5a565b3480156108ff57600080fd5b506104fc61090e366004614155565b611d2d565b34801561091f57600080fd5b50610524611d48565b34801561093457600080fd5b506104fc611dbc565b34801561094957600080fd5b506105b4611e06565b34801561095e57600080fd5b506104fc60175481565b34801561097457600080fd5b506105246109833660046142a7565b611e4f565b34801561099457600080fd5b506104fc601c5481565b3480156109aa57600080fd5b506105246109b936600461413c565b611ed9565b3480156109ca57600080fd5b506105246109d93660046142e0565b611f88565b3480156109ea57600080fd5b506104fc6109f936600461430e565b61210e565b348015610a0a57600080fd5b506104fc610a19366004614110565b61216f565b348015610a2a57600080fd5b506005546001600160a01b031661057c565b348015610a4857600080fd5b506105246121b5565b348015610a5d57600080fd5b50610524610a6c366004614350565b612238565b348015610a7d57600080fd5b5061053b61227e565b348015610a9257600080fd5b50610524610aa13660046142a7565b61228d565b348015610ab257600080fd5b50610524610ac136600461436d565b612357565b348015610ad257600080fd5b506104fc610ae13660046143d9565b6124af565b348015610af257600080fd5b506104fc61271081565b348015610b0857600080fd5b506104fc610b17366004614155565b60066020526000908152604090205481565b348015610b3557600080fd5b506104fc612527565b348015610b4a57600080fd5b506105b4610b59366004614110565b612571565b348015610b6a57600080fd5b506104fc610b79366004614155565b61260a565b348015610b8a57600080fd5b506105b4610b99366004614110565b61263d565b348015610baa57600080fd5b506104fc60135481565b348015610bc057600080fd5b50610bd4610bcf366004614155565b61264a565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610506565b348015610c2557600080fd5b506104fc610c34366004614155565b601b6020526000908152604090205481565b348015610c5257600080fd5b506105b4610c61366004614155565b60236020526000908152604090205460ff1681565b348015610c8257600080fd5b50600f546105b490610100900460ff1681565b348015610ca157600080fd5b506104fc610cb0366004614155565b6126e5565b348015610cc157600080fd5b50610524610cd03660046142a7565b61275f565b348015610ce157600080fd5b50610524610cf0366004614155565b6127e1565b348015610d0157600080fd5b50610524610d1036600461413c565b61283d565b348015610d2157600080fd5b50610524610d303660046143fe565b61290b565b348015610d4157600080fd5b506011546105b49060ff1681565b348015610d5b57600080fd5b50610524610d6a36600461413c565b6129e7565b348015610d7b57600080fd5b50610524610d8a36600461413c565b612a1f565b348015610d9b57600080fd5b506104fc610daa3660046142e0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610de157600080fd5b506105b4610df0366004614155565b60216020526000908152604090205460ff1681565b348015610e1157600080fd5b506104fc600a5481565b348015610e2757600080fd5b50610524610e3636600461444a565b612b6a565b348015610e4757600080fd5b506104fc60165481565b348015610e5d57600080fd5b506104fc612c0e565b348015610e7257600080fd5b50610524612c58565b348015610e8757600080fd5b5060095461057c906001600160a01b031681565b348015610ea757600080fd5b506104fc60145481565b348015610ebd57600080fd5b506104fc600e5481565b348015610ed357600080fd5b50610bd4610ee236600461413c565b612c8e565b348015610ef357600080fd5b50610524610f02366004614155565b612cd0565b348015610f1357600080fd5b506104fc610f2236600461413c565b612dbb565b348015610f3357600080fd5b506104fc60185481565b348015610f4957600080fd5b506104fc600c5481565b348015610f5f57600080fd5b506104fc60195481565b348015610f7557600080fd5b506104fc601d5481565b348015610f8b57600080fd5b506104fc610f9a366004614476565b601260209081526000928352604080842090915290825290205481565b6005546001600160a01b03163314610fea5760405162461bcd60e51b8152600401610fe190614498565b60405180910390fd5b604051600090339047908381818185875af1925050503d806000811461102c576040519150601f19603f3d011682016040523d82523d6000602084013e611031565b606091505b5050809150508061107c5760405162461bcd60e51b81526020600482015260156024820152741dda5d1a191c985dc81d5b9cdd58d8d95cdcd99d5b605a1b6044820152606401610fe1565b50565b60606003805461108e906144cd565b80601f01602080910402602001604051908101604052809291908181526020018280546110ba906144cd565b80156111075780601f106110dc57610100808354040283529160200191611107565b820191906000526020600020905b8154815290600101906020018083116110ea57829003601f168201915b5050505050905090565b600061111e338484612e07565b5060015b92915050565b6005546001600160a01b031633146111525760405162461bcd60e51b8152600401610fe190614498565b670de0b6b3a76400006103e861116760025490565b61117290600561451d565b61117c9190614534565b6111869190614534565b81116111e95760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d74206c6f7760448201526b6572207468616e20302e352560a01b6064820152608401610fe1565b6111fb81670de0b6b3a764000061451d565b600b5550565b600061120e848484612f2b565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156112935760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610fe1565b6112a08533858403612e07565b506001949350505050565b6112d8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d600019612e07565b565b6005546001600160a01b031633146113045760405162461bcd60e51b8152600401610fe190614498565b600019601355565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137a9190614556565b905090565b6005546001600160a01b031633146113a95760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b0381166113ff5760405162461bcd60e51b815260206004820152601860248201527f6d6179206e6f742073657420746f2030206164647265737300000000000000006044820152606401610fe1565b61140a81600161275f565b6009546040516001600160a01b03918216918316907f086aa05ff00214e2d0c7c02b8a46b2614ad955732e6b43aa8afca69ed1ad76f890600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114915760405162461bcd60e51b8152600401610fe190614498565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156114d957600080fd5b505af11580156114ed573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161111e91859061152b90869061456f565b612e07565b6005546001600160a01b0316331461155a5760405162461bcd60e51b8152600401610fe190614498565b8483146115a95760405162461bcd60e51b815260206004820152601e60248201527f617272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610fe1565b61025885106116195760405162461bcd60e51b815260206004820152603660248201527f43616e206f6e6c792061697264726f70203630302077616c6c657473207065726044820152752074786e2064756520746f20676173206c696d69747360501b6064820152608401610fe1565b60005b8581101561188d5761166d3388888481811061163a5761163a614582565b905060200201602081019061164f9190614155565b87878581811061166157611661614582565b905060200201356137fa565b600285858381811061168157611681614582565b905060200201356116929190614534565b601b60008989858181106116a8576116a8614582565b90506020020160208101906116bd9190614155565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546116ec919061456f565b90915550506008546001600160a01b031663e30443bc88888481811061171457611714614582565b90506020020160208101906117299190614155565b6117538a8a8681811061173e5761173e614582565b905060200201602081019061090e9190614155565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b50505050600660008888848181106117c7576117c7614582565b90506020020160208101906117dc9190614155565b6001600160a01b03166001600160a01b031681526020019081526020016000205483838381811061180f5761180f614582565b90506020020135111561187b5782828281811061182e5761182e614582565b905060200201356006600089898581811061184b5761184b614582565b90506020020160208101906118609190614155565b6001600160a01b031681526020810191909152604001600020555b8061188581614598565b91505061161c565b50505050505050565b6007546000906305f5e100906118b4906001600160a01b0316611d2d565b7f0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b84196001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611912573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119369190614556565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b891906145b1565b6007546040516370a0823160e01b81526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015611a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a259190614556565b611a2f919061451d565b611a4190670de0b6b3a764000061451d565b611a4b9190614534565b61137a9190614534565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611aa6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c91906145ce565b6005546001600160a01b03163314611af45760405162461bcd60e51b8152600401610fe190614498565b600a54611b0030611d2d565b1015611b76576040805162461bcd60e51b81526020600482015260248101919091527f43616e206f6e6c792073776170207768656e20746f6b656e20616d6f756e742060448201527f6973206174206f7220686967686572207468616e207265737472696374696f6e6064820152608401610fe1565b6007805460ff60a01b1916600160a01b179055611b91613941565b6007805460ff60a01b19169055565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b60085460405163156dbbf560e31b81526001600160a01b038381166004830152600092169063ab6ddfa8906024015b602060405180830381865afa158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614556565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906145eb565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b03163314611d725760405162461bcd60e51b8152600401610fe190614498565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6008546040805163ad7a672f60e01b815290516000926001600160a01b03169163ad7a672f9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b6005546000906001600160a01b03163314611e335760405162461bcd60e51b8152600401610fe190614498565b50600f805460ff19908116909155601180549091169055600190565b6005546001600160a01b03163314611e795760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f575f9d01836c9206322151b9e9ec3f2b77b87e71176933b9b44d2d732f768d9591015b60405180910390a25050565b6005546001600160a01b03163314611f035760405162461bcd60e51b8152600401610fe190614498565b600f54610100900460ff1615611f5b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f742072652d656e61626c652074726164696e6700000000000000006044820152606401610fe1565b600f805462ffff0019166201010017905543600e5542601c55611f8281633b9aca0061451d565b60135550565b6005546001600160a01b03163314611fb25760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b0382166120085760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610fe1565b6001600160a01b038216301415806120285750600f54610100900460ff16155b6120915760405162461bcd60e51b815260206004820152603460248201527f43616e2774207769746864726177206e617469766520746f6b656e73207768696044820152736c652074726164696e672069732061637469766560601b6064820152608401610fe1565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156120d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fc9190614556565b9050612109838383613b8e565b505050565b6001600160a01b0383166000908152600660205260408120548161213186611d2d565b905061213d858261456f565b612147828461451d565b61215187876124af565b61215b919061456f565b6121659190614534565b9695505050505050565b60008061217b846126e5565b9050612710806014548361218f919061451d565b6121999190614534565b6121a3908561451d565b6121ad9190614534565b949350505050565b6005546001600160a01b031633146121df5760405162461bcd60e51b8152600401610fe190614498565b60205460ff16156122295760405162461bcd60e51b81526020600482015260146024820152732b32b9ba34b7339030b63932b0b23c9037bb32b960611b6044820152606401610fe1565b6020805460ff19166001179055565b6005546001600160a01b031633146122625760405162461bcd60e51b8152600401610fe190614498565b600f8054911515620100000262ff000019909216919091179055565b60606004805461108e906144cd565b6005546001600160a01b031633146122b75760405162461bcd60e51b8152600401610fe190614498565b6007546001600160a01b03908116908316036123495760405162461bcd60e51b815260206004820152604560248201527f5468652050616e63616b655377617020706169722063616e6e6f74206265207260448201527f656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b6572606482015264506169727360d81b608482015260a401610fe1565b6123538282613be0565b5050565b6005546001600160a01b031633146123815760405162461bcd60e51b8152600401610fe190614498565b8281146123c85760405162461bcd60e51b81526020600482015260156024820152740c2e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606401610fe1565b60005b838110156114ed57600660008686848181106123e9576123e9614582565b90506020020160208101906123fe9190614155565b6001600160a01b03166001600160a01b031681526020019081526020016000205483838381811061243157612431614582565b90506020020135111561249d5782828281811061245057612450614582565b905060200201356006600087878581811061246d5761246d614582565b90506020020160208101906124829190614155565b6001600160a01b031681526020810191909152604001600020555b806124a781614598565b9150506123cb565b6000811561251f57670de0b6b3a76400006127106124cc85612dbb565b6124d4611896565b6124de908761451d565b6124e8919061451d565b6124f29190614534565b6124fc9190614534565b612504611896565b61250e908561451d565b612518919061456f565b9050611122565b506000611122565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156125f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610fe1565b6126003385858403612e07565b5060019392505050565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611c19565b600061111e338484612f2b565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156126a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ca9190614619565b97509750975097509750975097509750919395975091939597565b6000806126f0611896565b6001600160a01b038416600090815260066020526040902054909150811161271b5750600092915050565b6001600160a01b0383166000908152600660205260409020548190612710906127449083614683565b61274e919061451d565b6127589190614534565b9392505050565b6005546001600160a01b031633146127895760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038216600081815260216020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611ecd565b6005546001600160a01b0316331461280b5760405162461bcd60e51b8152600401610fe190614498565b60085460405163c0f306ef60e01b81526001600160a01b0383811660048301529091169063c0f306ef906024016114bf565b6005546001600160a01b031633146128675760405162461bcd60e51b8152600401610fe190614498565b670de0b6b3a7640000606461287b60025490565b61288690600161451d565b6128909190614534565b61289a9190614534565b81116128f35760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015261312560f01b6064820152608401610fe1565b61290581670de0b6b3a764000061451d565b600c5550565b6005546001600160a01b031633146129355760405162461bcd60e51b8152600401610fe190614498565b60005b828110156129a657816021600086868581811061295757612957614582565b905060200201602081019061296c9190614155565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061299e81614598565b915050612938565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b358383836040516129da93929190614696565b60405180910390a1505050565b6005546001600160a01b03163314612a115760405162461bcd60e51b8152600401610fe190614498565b611f8281633b9aca0061451d565b6005546001600160a01b03163314612a495760405162461bcd60e51b8152600401610fe190614498565b620186a0612a5660025490565b612a6190600161451d565b612a6b9190614534565b811015612ad85760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610fe1565b6103e8612ae460025490565b612aef90600161451d565b612af99190614534565b811115612b655760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171892903a37ba30b61039bab838363c9760611b6064820152608401610fe1565b600a55565b6005546001600160a01b03163314612b945760405162461bcd60e51b8152600401610fe190614498565b60168390556015829055601781905580612bae838561456f565b612bb8919061456f565b6014819055610bb810156121095760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420333025206f72206c6573730000006044820152606401610fe1565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611356573d6000803e3d6000fd5b6005546001600160a01b03163314612c825760405162461bcd60e51b8152600401610fe190614498565b6011805460ff19169055565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401612688565b6005546001600160a01b03163314612cfa5760405162461bcd60e51b8152600401610fe190614498565b6001600160a01b038116612d5f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610fe1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600080612710612dcd846126f261451d565b612dd79190614534565b6007549091508190612df1906001600160a01b0316611d2d565b612dfb919061456f565b61274e8261271061451d565b6001600160a01b038316612e695760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610fe1565b6001600160a01b038216612eca5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610fe1565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612f515760405162461bcd60e51b8152600401610fe1906146ef565b6001600160a01b038216612f775760405162461bcd60e51b8152600401610fe190614734565b80600003612f8b57612109838360006137fa565b600f54610100900460ff16613025576001600160a01b03831660009081526021602052604090205460ff1680612fd957506001600160a01b03821660009081526021602052604090205460ff165b6130255760405162461bcd60e51b815260206004820152601a60248201527f54726164696e67206973206e6f7420616374697665207965742e0000000000006044820152606401610fe1565b6001600160a01b03831660009081526021602052604090205460ff168061306457506001600160a01b03821660009081526021602052604090205460ff165b806130785750600754600160a01b900460ff165b156131845761308982826000613cb0565b6130948383836137fa565b6008546001600160a01b031663e30443bc846130af81611d2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156130f557600080fd5b505af1158015613109573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361312a81611d2d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561317057600080fd5b505af115801561188d573d6000803e3d6000fd5b600f5460ff16156135995760115460ff1615613345577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b0316141580156131ea57506007546001600160a01b03838116911614155b156133455732600090815260106020526040902054439061320c90600561456f565b10801561323c57506001600160a01b038216600090815260106020526040902054439061323a90600561456f565b105b6132a65760405162461bcd60e51b815260206004820152603560248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527432b21710102a393c9030b3b0b4b7103630ba32b91760591b6064820152608401610fe1565b3260009081526010602052604080822043908190556001600160a01b03851683529120556013543a10613345573a600090815260126020908152604080832084845290915290205443116133275760405162461bcd60e51b8152602060048201526008602482015267223ab832902a3c3760c11b6044820152606401610fe1565b3a600090815260126020908152604080832084845290915290204390555b6001600160a01b03831660009081526023602052604090205460ff16801561338657506001600160a01b03821660009081526022602052604090205460ff16155b1561346157600b548111156133f85760405162461bcd60e51b815260206004820152603260248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527136b0bc2a3930b739b0b1ba34b7b720b6ba1760711b6064820152608401610fe1565b600c5461340483611d2d565b61340e908361456f565b111561345c5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610fe1565b613599565b6001600160a01b03821660009081526023602052604090205460ff1680156134a257506001600160a01b03831660009081526022602052604090205460ff16155b1561351557600b5481111561345c5760405162461bcd60e51b815260206004820152603360248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152721036b0bc2a3930b739b0b1ba34b7b720b6ba1760691b6064820152608401610fe1565b6001600160a01b03821660009081526022602052604090205460ff1661359957600c5461354183611d2d565b61354b908361456f565b11156135995760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c657400000000006044820152606401610fe1565b60205460ff16613656576001600160a01b0383166000908152601b60205260409020548015613654576000601f54601c54426135d59190614683565b6135df9190614534565b9050601d54811015613644576000606483601e54846135fe919061451d565b613608919061451d565b6136129190614534565b61361c9084614683565b9050808461362988611d2d565b6136339190614683565b101561363e57600080fd5b50613652565b6020805460ff191660011790555b505b505b6001600160a01b03821660009081526023602052604090205460ff1680156136865750600f5462010000900460ff165b801561369c5750600a5461369930611d2d565b10155b156136ca576007805460ff60a01b1916600160a01b1790556136bc613941565b6007805460ff60a01b191690555b6001600160a01b03821660009081526023602052604090205460ff1680156136f457506000601454115b156137bc576000613705848361216f565b905080156137b65760145460155461371d908361451d565b6137279190614534565b60186000828254613738919061456f565b909155505060145460175461374d908361451d565b6137579190614534565b601a6000828254613768919061456f565b909155505060145460165461377d908361451d565b6137879190614534565b60196000828254613798919061456f565b909155506137a990508430836137fa565b6137b38183614683565b91505b50613089565b6001600160a01b03831660009081526023602052604090205460ff16156137ee576137e982826001613cb0565b613089565b61308982826000613cb0565b6001600160a01b0383166138205760405162461bcd60e51b8152600401610fe1906146ef565b6001600160a01b0382166138465760405162461bcd60e51b8152600401610fe190614734565b6001600160a01b038316600090815260208190526040902054818110156138be5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610fe1565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906138f590849061456f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d1f91815260200190565b60008061394d30611d2d565b90506000601a54601954601854613964919061456f565b61396e919061456f565b905081158061397b575080155b1561398557505050565b600a5461399390601461451d565b8211156139ab57600a546139a890601461451d565b91505b601a5415613a9657600081601a54846139c4919061451d565b6139ce9190614534565b6007549091506139e99030906001600160a01b0316836137fa565b600760009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015613a3957600080fd5b505af1925050508015613a4a575060015b613a78576040517f369bc1927dd877d0df49584cd599d33d299580bdbb12f0ec30ef965da981640190600090a15b613a828184614683565b9250601a5482613a929190614683565b9150505b613a9f82613d2a565b60195447906000908390613ab3908461451d565b613abd9190614534565b600060188190556019819055601a5590508015613b2c576009546040516001600160a01b03909116908290600081818185875af1925050503d8060008114613b21576040519150601f19603f3d011682016040523d82523d6000602084013e613b26565b606091505b50909550505b47156114ed576008546040516001600160a01b03909116904790600081818185875af1925050503d8060008114613b7f576040519150601f19603f3d011682016040523d82523d6000602084013e613b84565b606091505b5050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612109908490613eaf565b6001600160a01b0382166000908152602360205260409020805460ff1916821515179055613c0e8282611e4f565b8015613c745760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831660009081526006602052604081205490613cd385611d2d565b9050613cdf848261456f565b613ce9828461451d565b613cf386866124af565b613cfd919061456f565b613d079190614534565b6001600160a01b0390951660009081526006602052604090209490945550505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613d5f57613d5f614582565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e0191906145b1565b81600181518110613e1457613e14614582565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790613e79908590600090869030904290600401614777565b600060405180830381600087803b158015613e9357600080fd5b505af1158015613ea7573d6000803e3d6000fd5b505050505050565b6000613f04826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613f819092919063ffffffff16565b8051909150156121095780806020019051810190613f2291906145ce565b6121095760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610fe1565b60606121ad848460008585600080866001600160a01b03168587604051613fa891906147e8565b60006040518083038185875af1925050503d8060008114613fe5576040519150601f19603f3d011682016040523d82523d6000602084013e613fea565b606091505b5091509150613ffb87838387614006565b979650505050505050565b6060831561407557825160000361406e576001600160a01b0385163b61406e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610fe1565b50816121ad565b6121ad838381511561408a5781518083602001fd5b8060405162461bcd60e51b8152600401610fe191906140c8565b60005b838110156140bf5781810151838201526020016140a7565b50506000910152565b60208152600082518060208401526140e78160408501602087016140a4565b601f01601f19169190910160400192915050565b6001600160a01b038116811461107c57600080fd5b6000806040838503121561412357600080fd5b823561412e816140fb565b946020939093013593505050565b60006020828403121561414e57600080fd5b5035919050565b60006020828403121561416757600080fd5b8135612758816140fb565b60008060006060848603121561418757600080fd5b8335614192816140fb565b925060208401356141a2816140fb565b929592945050506040919091013590565b60008083601f8401126141c557600080fd5b50813567ffffffffffffffff8111156141dd57600080fd5b6020830191508360208260051b85010111156141f857600080fd5b9250929050565b6000806000806000806060878903121561421857600080fd5b863567ffffffffffffffff8082111561423057600080fd5b61423c8a838b016141b3565b9098509650602089013591508082111561425557600080fd5b6142618a838b016141b3565b9096509450604089013591508082111561427a57600080fd5b5061428789828a016141b3565b979a9699509497509295939492505050565b801515811461107c57600080fd5b600080604083850312156142ba57600080fd5b82356142c5816140fb565b915060208301356142d581614299565b809150509250929050565b600080604083850312156142f357600080fd5b82356142fe816140fb565b915060208301356142d5816140fb565b60008060006060848603121561432357600080fd5b833561432e816140fb565b925060208401359150604084013561434581614299565b809150509250925092565b60006020828403121561436257600080fd5b813561275881614299565b6000806000806040858703121561438357600080fd5b843567ffffffffffffffff8082111561439b57600080fd5b6143a7888389016141b3565b909650945060208701359150808211156143c057600080fd5b506143cd878288016141b3565b95989497509550505050565b600080604083850312156143ec57600080fd5b8235915060208301356142d581614299565b60008060006040848603121561441357600080fd5b833567ffffffffffffffff81111561442a57600080fd5b614436868287016141b3565b909450925050602084013561434581614299565b60008060006060848603121561445f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561448957600080fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806144e157607f821691505b60208210810361450157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761112257611122614507565b60008261455157634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561456857600080fd5b5051919050565b8082018082111561112257611122614507565b634e487b7160e01b600052603260045260246000fd5b6000600182016145aa576145aa614507565b5060010190565b6000602082840312156145c357600080fd5b8151612758816140fb565b6000602082840312156145e057600080fd5b815161275881614299565b60008060006060848603121561460057600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b03121561463657600080fd5b8851614641816140fb565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b8181038181111561112257611122614507565b6040808252810183905260008460608301825b868110156146d95782356146bc816140fb565b6001600160a01b03168252602092830192909101906001016146a9565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156147c75784516001600160a01b0316835293830193918301916001016147a2565b50506001600160a01b03969096166060850152505050608001529392505050565b600082516147fa8184602087016140a4565b919091019291505056fea264697066735822122056bb09f1fbf8d50d006f5872ee1284f6c51cc5718d72811b895ebd3839d76f6f64736f6c63430008110033

Deployed Bytecode Sourcemap

42084:24358:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43728:49;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;43728:49:0;;;;;;;;65009:195;;;;;;;;;;;;;:::i;:::-;;4145:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42276:37::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1035:32:1;;;1017:51;;1005:2;990:18;42276:37:0;852:222:1;5059:169:0;;;;;;;;;;-1:-1:-1;5059:169:0;;;;;:::i;:::-;;:::i;:::-;;;1700:14:1;;1693:22;1675:41;;1663:2;1648:18;5059:169:0;1535:187:1;42588:39:0;;;;;;;;;;;;;;;;50367:224;;;;;;;;;;-1:-1:-1;50367:224:0;;;;;:::i;:::-;;:::i;43970:64::-;;;;;;;;;;-1:-1:-1;43970:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4466:108;;;;;;;;;;-1:-1:-1;4554:12:0;;4466:108;;43517:33;;;;;;;;;;;;;;;;42512:32;;;;;;;;;;;;;;;;5236:492;;;;;;;;;;-1:-1:-1;5236:492:0;;;;;:::i;:::-;;:::i;48181:128::-;;;;;;;;;;;;;:::i;42380:38::-;;;;;;;;;;-1:-1:-1;42380:38:0;;;;-1:-1:-1;;;;;42380:38:0;;;50247:112;;;;;;;;;;;;;:::i;53473:141::-;;;;;;;;;;;;;:::i;52998:351::-;;;;;;;;;;-1:-1:-1;52998:351:0;;;;;:::i;:::-;;:::i;4365:93::-;;;;;;;;;;-1:-1:-1;4365:93:0;;4448:2;3007:36:1;;2995:2;2980:18;4365:93:0;2865:184:1;49174:130:0;;;;;;;;;;-1:-1:-1;49174:130:0;;;;;:::i;:::-;;:::i;43784:35::-;;;;;;;;;;-1:-1:-1;43784:35:0;;;;;;;;5736:215;;;;;;;;;;-1:-1:-1;5736:215:0;;;;;:::i;:::-;;:::i;65666:773::-;;;;;;;;;;-1:-1:-1;65666:773:0;;;;;:::i;:::-;;:::i;43687:34::-;;;;;;;;;;;;;;;;42320:21;;;;;;;;;;-1:-1:-1;42320:21:0;;;;-1:-1:-1;;;;;42320:21:0;;;42756:33;;;;;;;;;;-1:-1:-1;42756:33:0;;;;;;;;62437:212;;;;;;;;;;;;;:::i;54975:97::-;;;;;;;;;;;;;:::i;53622:127::-;;;;;;;;;;-1:-1:-1;53622:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;53713:28:0;53689:4;53713:28;;;:19;:28;;;;;;;;;53622:127;64741:260;;;;;;;;;;;;;:::i;43310:32::-;;;;;;;;;;;;;;;;55214:141;;;;;;;;;;;;;:::i;53911:136::-;;;;;;;;;;-1:-1:-1;53911:136:0;;;;;:::i;:::-;;:::i;42836:31::-;;;;;;;;;;-1:-1:-1;42836:31:0;;;;;;;;;;;54708:259;;;;;;;;;;-1:-1:-1;54708:259:0;;;;;:::i;:::-;;:::i;4582:127::-;;;;;;;;;;-1:-1:-1;4582:127:0;;;;;:::i;:::-;;:::i;13549:148::-;;;;;;;;;;;;;:::i;55367:119::-;;;;;;;;;;;;;:::i;55542:159::-;;;;;;;;;;;;;:::i;43391:34::-;;;;;;;;;;;;;;;;51677:202;;;;;;;;;;-1:-1:-1;51677:202:0;;;;;:::i;:::-;;:::i;43614:25::-;;;;;;;;;;;;;;;;49593:322;;;;;;;;;;-1:-1:-1;49593:322:0;;;;;:::i;:::-;;:::i;65212:421::-;;;;;;;;;;-1:-1:-1;65212:421:0;;;;;:::i;:::-;;:::i;63488:372::-;;;;;;;;;;-1:-1:-1;63488:372:0;;;;;:::i;:::-;;:::i;64452:253::-;;;;;;;;;;-1:-1:-1;64452:253:0;;;;;:::i;:::-;;:::i;12907:79::-;;;;;;;;;;-1:-1:-1;12972:6:0;;-1:-1:-1;;;;;12972:6:0;12907:79;;48939:142;;;;;;;;;;;;;:::i;50015:101::-;;;;;;;;;;-1:-1:-1;50015:101:0;;;;;:::i;:::-;;:::i;4253:104::-;;;;;;;;;;;;;:::i;52393:251::-;;;;;;;;;;-1:-1:-1;52393:251:0;;;;;:::i;:::-;;:::i;48479:381::-;;;;;;;;;;-1:-1:-1;48479:381:0;;;;;:::i;:::-;;:::i;62657:436::-;;;;;;;;;;-1:-1:-1;62657:436:0;;;;;:::i;:::-;;:::i;43220:43::-;;;;;;;;;;;;43258:5;43220:43;;42209:58;;;;;;;;;;-1:-1:-1;42209:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;53357:108;;;;;;;;;;;;;:::i;5959:413::-;;;;;;;;;;-1:-1:-1;5959:413:0;;;;;:::i;:::-;;:::i;53757:149::-;;;;;;;;;;-1:-1:-1;53757:149:0;;;;;:::i;:::-;;:::i;4717:175::-;;;;;;;;;;-1:-1:-1;4717:175:0;;;;;:::i;:::-;;:::i;43174:33::-;;;;;;;;;;;;;;;;54055:318;;;;;;;;;;-1:-1:-1;54055:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7780:32:1;;;7762:51;;7844:2;7829:18;;7822:34;;;;7872:18;;;7865:34;;;;7930:2;7915:18;;7908:34;;;;7973:3;7958:19;;7951:35;7800:3;8002:19;;7995:35;8061:3;8046:19;;8039:35;8105:3;8090:19;;8083:35;7749:3;7734:19;54055:318:0;7423:701:1;43559:48:0;;;;;;;;;;-1:-1:-1;43559:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;44192:58;;;;;;;;;;-1:-1:-1;44192:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42796:33;;;;;;;;;;-1:-1:-1;42796:33:0;;;;;;;;;;;64135:309;;;;;;;;;;-1:-1:-1;64135:309:0;;;;;:::i;:::-;;:::i;51887:184::-;;;;;;;;;;-1:-1:-1;51887:184:0;;;;;:::i;:::-;;:::i;49409:126::-;;;;;;;;;;-1:-1:-1;49409:126:0;;;;;:::i;:::-;;:::i;50603:211::-;;;;;;;;;;-1:-1:-1;50603:211:0;;;;;:::i;:::-;;:::i;52079:306::-;;;;;;;;;;-1:-1:-1;52079:306:0;;;;;:::i;:::-;;:::i;43055:39::-;;;;;;;;;;-1:-1:-1;43055:39:0;;;;;;;;50124:115;;;;;;;;;;-1:-1:-1;50124:115:0;;;;;:::i;:::-;;:::i;50884:346::-;;;;;;;;;;-1:-1:-1;50884:346:0;;;;;:::i;:::-;;:::i;4900:151::-;;;;;;;;;;-1:-1:-1;4900:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;5016:18:0;;;4989:7;5016:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4900:151;43909:52;;;;;;;;;;-1:-1:-1;43909:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42472:33;;;;;;;;;;;;;;;;51242:427;;;;;;;;;;-1:-1:-1;51242:427:0;;;;;:::i;:::-;;:::i;43349:35::-;;;;;;;;;;;;;;;;55080:126;;;;;;;;;;;;;:::i;48371:98::-;;;;;;;;;;;;;:::i;42427:32::-;;;;;;;;;;-1:-1:-1;42427:32:0;;;;-1:-1:-1;;;;;42427:32:0;;;43272:31;;;;;;;;;;;;;;;;42673:37;;;;;;;;;;;;;;;;54378:325;;;;;;;;;;-1:-1:-1;54378:325:0;;;;;:::i;:::-;;:::i;13852:244::-;;;;;;;;;;-1:-1:-1;13852:244:0;;;;;:::i;:::-;;:::i;62137:292::-;;;;;;;;;;-1:-1:-1;62137:292:0;;;;;:::i;:::-;;:::i;43438:31::-;;;;;;;;;;;;;;;;42551:24;;;;;;;;;;;;;;;;43476:34;;;;;;;;;;;;;;;;43646;;;;;;;;;;;;;;;;43101:66;;;;;;;;;;-1:-1:-1;43101:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;65009:195;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;;;;;;;;;65095:49:::1;::::0;65058:12:::1;::::0;65095:10:::1;::::0;65118:21:::1;::::0;65058:12;65095:49;65058:12;65095:49;65118:21;65095:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65081:63;;;;;65163:7;65155:41;;;::::0;-1:-1:-1;;;65155:41:0;;10047:2:1;65155:41:0::1;::::0;::::1;10029:21:1::0;10086:2;10066:18;;;10059:30;-1:-1:-1;;;10105:18:1;;;10098:51;10166:18;;65155:41:0::1;9845:345:1::0;65155:41:0::1;65047:157;65009:195::o:0;4145:100::-;4199:13;4232:5;4225:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4145:100;:::o;5059:169::-;5142:4;5159:39;252:10;5182:7;5191:6;5159:8;:39::i;:::-;-1:-1:-1;5216:4:0;5059:169;;;;;:::o;50367:224::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;50482:4:::1;50476;50456:13;4554:12:::0;;;4466:108;50456:13:::1;:17;::::0;50472:1:::1;50456:17;:::i;:::-;:24;;;;:::i;:::-;50455:31;;;;:::i;:::-;50446:6;:40;50438:97;;;::::0;-1:-1:-1;;;50438:97:0;;11309:2:1;50438:97:0::1;::::0;::::1;11291:21:1::0;11348:2;11328:18;;;11321:30;11387:34;11367:18;;;11360:62;-1:-1:-1;;;11438:18:1;;;11431:42;11490:19;;50438:97:0::1;11107:408:1::0;50438:97:0::1;50566:17;:6:::0;50576::::1;50566:17;:::i;:::-;50546;:37:::0;-1:-1:-1;50367:224:0:o;5236:492::-;5376:4;5393:36;5403:6;5411:9;5422:6;5393:9;:36::i;:::-;-1:-1:-1;;;;;5469:19:0;;5442:24;5469:19;;;:11;:19;;;;;;;;252:10;5469:33;;;;;;;;5521:26;;;;5513:79;;;;-1:-1:-1;;;5513:79:0;;11722:2:1;5513:79:0;;;11704:21:1;11761:2;11741:18;;;11734:30;11800:34;11780:18;;;11773:62;-1:-1:-1;;;11851:18:1;;;11844:38;11899:19;;5513:79:0;11520:404:1;5513:79:0;5628:57;5637:6;252:10;5678:6;5659:16;:25;5628:8;:57::i;:::-;-1:-1:-1;5716:4:0;;5236:492;-1:-1:-1;;;;5236:492:0:o;48181:128::-;48239:62;48256:4;48271:9;-1:-1:-1;;48239:8:0;:62::i;:::-;48181:128::o;50247:112::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;50313:18:0::1;:38:::0;50247:112::o;53473:141::-;53563:15;;:43;;;-1:-1:-1;;;53563:43:0;;;;53536:7;;-1:-1:-1;;;;;53563:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53556:50;;53473:141;:::o;52998:351::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;53097:33:0;::::1;53089:70;;;::::0;-1:-1:-1;;;53089:70:0;;12320:2:1;53089:70:0::1;::::0;::::1;12302:21:1::0;12359:2;12339:18;;;12332:30;12398:26;12378:18;;;12371:54;12442:18;;53089:70:0::1;12118:348:1::0;53089:70:0::1;53170:42;53186:19;53207:4;53170:15;:42::i;:::-;53273:17;::::0;53228:63:::1;::::0;-1:-1:-1;;;;;53273:17:0;;::::1;::::0;53228:63;::::1;::::0;::::1;::::0;53273:17:::1;::::0;53228:63:::1;53302:17;:39:::0;;-1:-1:-1;;;;;;53302:39:0::1;-1:-1:-1::0;;;;;53302:39:0;;;::::1;::::0;;;::::1;::::0;;52998:351::o;49174:130::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;49251:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;49251:45:0;;-1:-1:-1;;;;;1035:32:1;;;49251:45:0::1;::::0;::::1;1017:51:1::0;49251:15:0;;::::1;::::0;:36:::1;::::0;990:18:1;;49251:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49174:130:::0;:::o;5736:215::-;252:10;5824:4;5873:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5873:34:0;;;;;;;;;;5824:4;;5841:80;;5864:7;;5873:47;;5910:10;;5873:47;:::i;:::-;5841:8;:80::i;65666:773::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;65822:37;;::::1;65814:80;;;::::0;-1:-1:-1;;;65814:80:0;;12803:2:1;65814:80:0::1;::::0;::::1;12785:21:1::0;12842:2;12822:18;;;12815:30;12881:32;12861:18;;;12854:60;12931:18;;65814:80:0::1;12601:354:1::0;65814:80:0::1;65930:3;65913:20:::0;::::1;65905:87;;;::::0;-1:-1:-1;;;65905:87:0;;13162:2:1;65905:87:0::1;::::0;::::1;13144:21:1::0;13201:2;13181:18;;;13174:30;13240:34;13220:18;;;13213:62;-1:-1:-1;;;13291:18:1;;;13284:52;13353:19;;65905:87:0::1;12960:418:1::0;65905:87:0::1;66007:9;66003:429;66022:18:::0;;::::1;66003:429;;;66061:56;66077:10;66089:7;;66097:1;66089:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66101:12;;66114:1;66101:15;;;;;;;:::i;:::-;;;;;;;66061;:56::i;:::-;66179:1;66161:12;;66174:1;66161:15;;;;;;;:::i;:::-;;;;;;;:19;;;;:::i;:::-;66132:13;:25;66146:7;;66154:1;66146:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66132:25:0::1;-1:-1:-1::0;;;;;66132:25:0::1;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66195:15:0::1;::::0;-1:-1:-1;;;;;66195:15:0::1;:26;66230:7:::0;;66238:1;66230:10;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;66243:21;66253:7;;66261:1;66253:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;66243:21::-;66195:70;::::0;-1:-1:-1;;;;;;66195:70:0::1;::::0;;;;;;-1:-1:-1;;;;;13723:32:1;;;66195:70:0::1;::::0;::::1;13705:51:1::0;13772:18;;;13765:34;13678:18;;66195:70:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;66299:23;:35;66323:7;;66331:1;66323:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66299:35:0::1;-1:-1:-1::0;;;;;66299:35:0::1;;;;;;;;;;;;;66283:10;;66294:1;66283:13;;;;;;;:::i;:::-;;;;;;;:51;66280:141;;;66392:10;;66403:1;66392:13;;;;;;;:::i;:::-;;;;;;;66354:23;:35;66378:7;;66386:1;66378:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66354:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;66354:35:0;:51;66280:141:::1;66042:3:::0;::::1;::::0;::::1;:::i;:::-;;;;66003:429;;;;65666:773:::0;;;;;;:::o;62437:212::-;62625:6;;62483:7;;62636:3;;62607:26;;-1:-1:-1;;;;;62625:6:0;62607:9;:26::i;:::-;62572:9;-1:-1:-1;;;;;62572:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62517:9;-1:-1:-1;;;;;62517:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62553:6;;62510:51;;-1:-1:-1;;;62510:51:0;;-1:-1:-1;;;;;62553:6:0;;;62510:51;;;1017::1;62510:34:0;;;;;990:18:1;;62510:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:87;;;;:::i;:::-;:94;;62600:4;62510:94;:::i;:::-;:123;;;;:::i;:::-;:129;;;;:::i;54975:97::-;55006:15;;:58;;-1:-1:-1;;;55006:58:0;;55045:10;55006:58;;;14578:51:1;55006:15:0;14645:18:1;;;14638:50;-1:-1:-1;;;;;55006:15:0;;;;:30;;14551:18:1;;55006:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64741:260::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;64832:18:::1;;64804:24;64822:4;64804:9;:24::i;:::-;:46;;64796:123;;;::::0;;-1:-1:-1;;;64796:123:0;;15151:2:1;64796:123:0::1;::::0;::::1;15133:21:1::0;15170:18;;;15163:30;;;;15229:34;15209:18;;;15202:62;15300:34;15280:18;;;15273:62;15352:19;;64796:123:0::1;14949:428:1::0;64796:123:0::1;64930:8;:15:::0;;-1:-1:-1;;;;64930:15:0::1;-1:-1:-1::0;;;64930:15:0::1;::::0;;64956:10:::1;:8;:10::i;:::-;64977:8;:16:::0;;-1:-1:-1;;;;64977:16:0::1;::::0;;64741:260::o;55214:141::-;55306:15;;:41;;;-1:-1:-1;;;55306:41:0;;;;55279:7;;-1:-1:-1;;;;;55306:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;53911:136;54004:15;;:38;;-1:-1:-1;;;54004:38:0;;-1:-1:-1;;;;;1035:32:1;;;54004:38:0;;;1017:51:1;53983:7:0;;54004:15;;:29;;990:18:1;;54004:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54708:259::-;54834:15;;:28;;-1:-1:-1;;;;;;54834:28:0;;;;;160:25:1;;;54768:18:0;;;;;;-1:-1:-1;;;;;54834:15:0;;:23;;133:18:1;;54834:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54872:87;;;15924:25:1;;;15980:2;15965:18;;15958:34;;;16008:18;;;16001:34;;;16066:2;16051:18;;16044:34;;;54767:95:0;;-1:-1:-1;54767:95:0;;-1:-1:-1;54767:95:0;-1:-1:-1;54949:9:0;;54937:5;;54872:87;;15911:3:1;15896:19;54872:87:0;;;;;;;;54762:205;;;54708:259;:::o;4582:127::-;-1:-1:-1;;;;;4683:18:0;4656:7;4683:18;;;;;;;;;;;;4582:127::o;13549:148::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;13640:6:::1;::::0;13619:40:::1;::::0;13656:1:::1;::::0;-1:-1:-1;;;;;13640:6:0::1;::::0;13619:40:::1;::::0;13656:1;;13619:40:::1;13670:6;:19:::0;;-1:-1:-1;;;;;;13670:19:0::1;::::0;;13549:148::o;55367:119::-;55448:15;;:30;;;-1:-1:-1;;;55448:30:0;;;;55421:7;;-1:-1:-1;;;;;55448:15:0;;:28;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;55542:159;13119:6;;55594:4;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;55610:14:0::1;:22:::0;;-1:-1:-1;;55610:22:0;;::::1;::::0;;;55643:20:::1;:28:::0;;;;::::1;::::0;;55610:22;55542:159;:::o;51677:202::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51767:39:0;::::1;;::::0;;;:31:::1;:39;::::0;;;;;;;;:46;;-1:-1:-1;;51767:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;51829:42;;1675:41:1;;;51829:42:0::1;::::0;1648:18:1;51829:42:0::1;;;;;;;;51677:202:::0;;:::o;49593:322::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;49673:13:::1;::::0;::::1;::::0;::::1;;;49672:14;49664:51;;;::::0;-1:-1:-1;;;49664:51:0;;16291:2:1;49664:51:0::1;::::0;::::1;16273:21:1::0;16330:2;16310:18;;;16303:30;16369:26;16349:18;;;16342:54;16413:18;;49664:51:0::1;16089:348:1::0;49664:51:0::1;49726:13;:20:::0;;-1:-1:-1;;49757:18:0;;;;;49807:12:::1;49786:18;:33:::0;49843:15:::1;49830:10;:28:::0;49890:17:::1;:8:::0;49901:6:::1;49890:17;:::i;:::-;49869:18;:38:::0;-1:-1:-1;49593:322:0:o;65212:421::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65309:20:0;::::1;65301:59;;;::::0;-1:-1:-1;;;65301:59:0;;16644:2:1;65301:59:0::1;::::0;::::1;16626:21:1::0;16683:2;16663:18;;;16656:30;16722:28;16702:18;;;16695:56;16768:18;;65301:59:0::1;16442:350:1::0;65301:59:0::1;-1:-1:-1::0;;;;;65379:23:0;::::1;65397:4;65379:23;;::::0;:41:::1;;-1:-1:-1::0;65407:13:0::1;::::0;::::1;::::0;::::1;;;65406:14;65379:41;65371:106;;;::::0;-1:-1:-1;;;65371:106:0;;16999:2:1;65371:106:0::1;::::0;::::1;16981:21:1::0;17038:2;17018:18;;;17011:30;17077:34;17057:18;;;17050:62;-1:-1:-1;;;17128:18:1;;;17121:50;17188:19;;65371:106:0::1;16797:416:1::0;65371:106:0::1;65515:39;::::0;-1:-1:-1;;;65515:39:0;;65548:4:::1;65515:39;::::0;::::1;1017:51:1::0;65488:24:0::1;::::0;-1:-1:-1;;;;;65515:24:0;::::1;::::0;::::1;::::0;990:18:1;;65515:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65488:66;;65565:60;65595:6;65603:3;65608:16;65565:22;:60::i;:::-;65290:343;65212:421:::0;;:::o;63488:372::-;-1:-1:-1;;;;;63631:31:0;;63587:7;63631:31;;;:23;:31;;;;;;63587:7;63698:17;63655:6;63698:9;:17::i;:::-;63673:42;-1:-1:-1;63822:28:0;63839:11;63673:42;63822:28;:::i;:::-;63785:31;63802:14;63785;:31;:::i;:::-;63734:47;63757:11;63770:10;63734:22;:47::i;:::-;:83;;;;:::i;:::-;63733:118;;;;:::i;:::-;63726:126;63488:372;-1:-1:-1;;;;;;63488:372:0:o;64452:253::-;64539:7;64558:19;64580:22;64595:6;64580:14;:22::i;:::-;64558:44;;43258:5;;64650:16;;64636:11;:30;;;;:::i;:::-;:44;;;;:::i;:::-;64621:60;;:11;:60;:::i;:::-;:75;;;;:::i;:::-;64613:84;64452:253;-1:-1:-1;;;;64452:253:0:o;48939:142::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;49000:15:::1;::::0;::::1;;48999:16;48991:49;;;::::0;-1:-1:-1;;;48991:49:0;;17420:2:1;48991:49:0::1;::::0;::::1;17402:21:1::0;17459:2;17439:18;;;17432:30;-1:-1:-1;;;17478:18:1;;;17471:50;17538:18;;48991:49:0::1;17218:344:1::0;48991:49:0::1;49051:15;:22:::0;;-1:-1:-1;;49051:22:0::1;49069:4;49051:22;::::0;;48939:142::o;50015:101::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;50087:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;50087:21:0;;::::1;::::0;;;::::1;::::0;;50015:101::o;4253:104::-;4309:13;4342:7;4335:14;;;;;:::i;52393:251::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;52502:6:::1;::::0;-1:-1:-1;;;;;52502:6:0;;::::1;52494:14:::0;;::::1;::::0;52486:96:::1;;;::::0;-1:-1:-1;;;52486:96:0;;17769:2:1;52486:96:0::1;::::0;::::1;17751:21:1::0;17808:2;17788:18;;;17781:30;17847:34;17827:18;;;17820:62;17918:34;17898:18;;;17891:62;-1:-1:-1;;;17969:19:1;;;17962:36;18015:19;;52486:96:0::1;17567:473:1::0;52486:96:0::1;52595:41;52624:4;52630:5;52595:28;:41::i;:::-;52393:251:::0;;:::o;48479:381::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;48589:29;;::::1;48581:63;;;::::0;-1:-1:-1;;;48581:63:0;;18247:2:1;48581:63:0::1;::::0;::::1;18229:21:1::0;18286:2;18266:18;;;18259:30;-1:-1:-1;;;18305:18:1;;;18298:51;18366:18;;48581:63:0::1;18045:345:1::0;48581:63:0::1;48659:9;48655:198;48674:18:::0;;::::1;48655:198;;;48726:23;:35;48750:7;;48758:1;48750:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48726:35:0::1;-1:-1:-1::0;;;;;48726:35:0::1;;;;;;;;;;;;;48716:4;;48721:1;48716:7;;;;;;;:::i;:::-;;;;;;;:45;48713:129;;;48819:4;;48824:1;48819:7;;;;;;;:::i;:::-;;;;;;;48781:23;:35;48805:7;;48813:1;48805:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48781:35:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48781:35:0;:45;48713:129:::1;48694:3:::0;::::1;::::0;::::1;:::i;:::-;;;;48655:198;;62657:436:::0;62748:7;62770:10;62767:319;;;62901:4;62894:5;62866:27;62881:11;62866:14;:27::i;:::-;62850:15;:13;:15::i;:::-;62838:27;;:11;:27;:::i;:::-;:55;;;;:::i;:::-;:61;;;;:::i;:::-;62837:68;;;;:::i;:::-;62818:15;:13;:15::i;:::-;62804:29;;:11;:29;:::i;:::-;62803:102;;;;:::i;:::-;62796:110;;;;62767:319;-1:-1:-1;63073:1:0;63066:8;;53357:108;53430:15;;:27;;;-1:-1:-1;;;53430:27:0;;;;53403:7;;-1:-1:-1;;;;;53430:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;5959:413;252:10;6052:4;6096:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6096:34:0;;;;;;;;;;6149:35;;;;6141:85;;;;-1:-1:-1;;;6141:85:0;;18597:2:1;6141:85:0;;;18579:21:1;18636:2;18616:18;;;18609:30;18675:34;18655:18;;;18648:62;-1:-1:-1;;;18726:18:1;;;18719:35;18771:19;;6141:85:0;18395:401:1;6141:85:0;6262:67;252:10;6285:7;6313:15;6294:16;:34;6262:8;:67::i;:::-;-1:-1:-1;6360:4:0;;5959:413;-1:-1:-1;;;5959:413:0:o;53757:149::-;53852:15;;:47;;-1:-1:-1;;;53852:47:0;;-1:-1:-1;;;;;1035:32:1;;;53852:47:0;;;1017:51:1;53828:7:0;;53852:15;;:38;;990:18:1;;53852:47:0;852:222:1;4717:175:0;4803:4;4820:42;252:10;4844:9;4855:6;4820:9;:42::i;54055:318::-;54330:15;;:35;;-1:-1:-1;;;54330:35:0;;-1:-1:-1;;;;;1035:32:1;;;54330:35:0;;;1017:51:1;54151:7:0;;;;;;;;;;;;;;;;54330:15;;;:26;;990:18:1;;54330:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54323:42;;;;;;;;;;;;;;;;54055:318;;;;;;;;;:::o;64135:309::-;64196:7;64215:18;64236:15;:13;:15::i;:::-;-1:-1:-1;;;;;64265:31:0;;;;;;:23;:31;;;;;;64215:36;;-1:-1:-1;64265:45:0;-1:-1:-1;64262:84:0;;-1:-1:-1;64333:1:0;;64135:309;-1:-1:-1;;64135:309:0:o;64262:84::-;-1:-1:-1;;;;;64377:31:0;;;;;;:23;:31;;;;;;64426:10;;43258:5;;64364:44;;64426:10;64364:44;:::i;:::-;64363:60;;;;:::i;:::-;:73;;;;:::i;:::-;64356:80;64135:309;-1:-1:-1;;;64135:309:0:o;51887:184::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51972:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;51972:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;52029:34;;1675:41:1;;;52029:34:0::1;::::0;1648:18:1;52029:34:0::1;1535:187:1::0;49409:126:0;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;49484:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;49484:43:0;;-1:-1:-1;;;;;1035:32:1;;;49484:43:0::1;::::0;::::1;1017:51:1::0;49484:15:0;;::::1;::::0;:34:::1;::::0;990:18:1;;49484:43:0::1;852:222:1::0;50603:211:0;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;50723:4:::1;50718:3;50698:13;4554:12:::0;;;4466:108;50698:13:::1;:17;::::0;50714:1:::1;50698:17;:::i;:::-;:23;;;;:::i;:::-;50697:30;;;;:::i;:::-;50688:6;:39;50680:86;;;::::0;-1:-1:-1;;;50680:86:0;;19822:2:1;50680:86:0::1;::::0;::::1;19804:21:1::0;19861:2;19841:18;;;19834:30;19900:34;19880:18;;;19873:62;-1:-1:-1;;;19951:18:1;;;19944:32;19993:19;;50680:86:0::1;19620:398:1::0;50680:86:0::1;50789:17;:6:::0;50799::::1;50789:17;:::i;:::-;50777:9;:29:::0;-1:-1:-1;50603:211:0:o;52079:306::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;52198:9:::1;52194:115;52213:19:::0;;::::1;52194:115;;;52289:8;52254:19;:32;52274:8;;52283:1;52274:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52254:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;52254:32:0;:43;;-1:-1:-1;;52254:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52234:3;::::1;::::0;::::1;:::i;:::-;;;;52194:115;;;;52326:51;52358:8;;52368;52326:51;;;;;;;;:::i;:::-;;;;;;;;52079:306:::0;;;:::o;50124:115::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;50219:12:::1;:3:::0;50225:6:::1;50219:12;:::i;50884:346::-:0;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;51007:6:::1;50987:13;4554:12:::0;;;4466:108;50987:13:::1;:17;::::0;51003:1:::1;50987:17;:::i;:::-;:26;;;;:::i;:::-;50974:9;:39;;50966:105;;;::::0;-1:-1:-1;;;50966:105:0;;21024:2:1;50966:105:0::1;::::0;::::1;21006:21:1::0;21063:2;21043:18;;;21036:30;21102:34;21082:18;;;21075:62;-1:-1:-1;;;21153:18:1;;;21146:51;21214:19;;50966:105:0::1;20822:417:1::0;50966:105:0::1;51122:4;51102:13;4554:12:::0;;;4466:108;51102:13:::1;:17;::::0;51118:1:::1;51102:17;:::i;:::-;:24;;;;:::i;:::-;51089:9;:37;;51081:102;;;::::0;-1:-1:-1;;;51081:102:0;;21446:2:1;51081:102:0::1;::::0;::::1;21428:21:1::0;21485:2;21465:18;;;21458:30;21524:34;21504:18;;;21497:62;-1:-1:-1;;;21575:18:1;;;21568:50;21635:19;;51081:102:0::1;21244:416:1::0;51081:102:0::1;51193:18;:30:::0;50884:346::o;51242:427::-;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;51367:20:::1;:37:::0;;;51415:17:::1;:31:::0;;;51457:19:::1;:35:::0;;;51479:13;51522:40:::1;51435:11:::0;51390:14;51522:40:::1;:::i;:::-;:62;;;;:::i;:::-;51503:16;:81:::0;;;51623:4:::1;-1:-1:-1::0;51603:24:0::1;51595:66;;;::::0;-1:-1:-1;;;51595:66:0;;21867:2:1;51595:66:0::1;::::0;::::1;21849:21:1::0;21906:2;21886:18;;;21879:30;21945:31;21925:18;;;21918:59;21994:18;;51595:66:0::1;21665:353:1::0;55080:126:0;55159:15;;:39;;;-1:-1:-1;;;55159:39:0;;;;55135:7;;-1:-1:-1;;;;;55159:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;48371:98;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;48433:20:::1;:28:::0;;-1:-1:-1;;48433:28:0::1;::::0;;48371:98::o;54378:325::-;54655:15;;:40;;-1:-1:-1;;;54655:40:0;;;;;160:25:1;;;54479:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54655:15:0;;;;:33;;133:18:1;;54655:40:0;14:177:1;13852:244:0;13119:6;;-1:-1:-1;;;;;13119:6:0;252:10;13119:22;13111:67;;;;-1:-1:-1;;;13111:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13941:22:0;::::1;13933:73;;;::::0;-1:-1:-1;;;13933:73:0;;22225:2:1;13933:73:0::1;::::0;::::1;22207:21:1::0;22264:2;22244:18;;;22237:30;22303:34;22283:18;;;22276:62;-1:-1:-1;;;22354:18:1;;;22347:36;22400:19;;13933:73:0::1;22023:402:1::0;13933:73:0::1;14043:6;::::0;14022:38:::1;::::0;-1:-1:-1;;;;;14022:38:0;;::::1;::::0;14043:6:::1;::::0;14022:38:::1;::::0;14043:6:::1;::::0;14022:38:::1;14071:6;:17:::0;;-1:-1:-1;;;;;;14071:17:0::1;-1:-1:-1::0;;;;;14071:17:0;;;::::1;::::0;;;::::1;::::0;;13852:244::o;62137:292::-;62203:19;;62282:5;62261:18;:11;62275:4;62261:18;:::i;:::-;:26;;;;:::i;:::-;62394:6;;62235:52;;-1:-1:-1;62235:52:0;;62384:17;;-1:-1:-1;;;;;62394:6:0;62384:9;:17::i;:::-;:35;;;;:::i;:::-;62357:23;:15;62375:5;62357:23;:::i;7299:380::-;-1:-1:-1;;;;;7435:19:0;;7427:68;;;;-1:-1:-1;;;7427:68:0;;22632:2:1;7427:68:0;;;22614:21:1;22671:2;22651:18;;;22644:30;22710:34;22690:18;;;22683:62;-1:-1:-1;;;22761:18:1;;;22754:34;22805:19;;7427:68:0;22430:400:1;7427:68:0;-1:-1:-1;;;;;7514:21:0;;7506:68;;;;-1:-1:-1;;;7506:68:0;;23037:2:1;7506:68:0;;;23019:21:1;23076:2;23056:18;;;23049:30;23115:34;23095:18;;;23088:62;-1:-1:-1;;;23166:18:1;;;23159:32;23208:19;;7506:68:0;22835:398:1;7506:68:0;-1:-1:-1;;;;;7587:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;7639:32;;160:25:1;;;7639:32:0;;133:18:1;7639:32:0;;;;;;;7299:380;;;:::o;55713:4618::-;-1:-1:-1;;;;;55845:18:0;;55837:68;;;;-1:-1:-1;;;55837:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55924:16:0;;55916:64;;;;-1:-1:-1;;;55916:64:0;;;;;;;:::i;:::-;56004:6;56014:1;56004:11;56001:92;;56032:28;56048:4;56054:2;56058:1;56032:15;:28::i;56001:92::-;56117:13;;;;;;;56113:136;;-1:-1:-1;;;;;56154:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;56183:23:0;;;;;;:19;:23;;;;;;;;56154:52;56146:91;;;;-1:-1:-1;;;56146:91:0;;24250:2:1;56146:91:0;;;24232:21:1;24289:2;24269:18;;;24262:30;24328:28;24308:18;;;24301:56;24374:18;;56146:91:0;24048:350:1;56146:91:0;-1:-1:-1;;;;;56264:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;56293:23:0;;;;;;:19;:23;;;;;;;;56264:52;:64;;;-1:-1:-1;56320:8:0;;-1:-1:-1;;;56320:8:0;;;;56264:64;56261:340;;;56344:34;56360:2;56364:6;56372:5;56344:15;:34::i;:::-;56393:33;56409:4;56415:2;56419:6;56393:15;:33::i;:::-;56441:15;;-1:-1:-1;;;;;56441:15:0;:26;56476:4;56483:15;56476:4;56483:9;:15::i;:::-;56441:58;;-1:-1:-1;;;;;;56441:58:0;;;;;;;-1:-1:-1;;;;;13723:32:1;;;56441:58:0;;;13705:51:1;13772:18;;;13765:34;13678:18;;56441:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56514:15:0;;-1:-1:-1;;;;;56514:15:0;;-1:-1:-1;56514:26:0;;-1:-1:-1;56549:2:0;56554:13;56549:2;56554:9;:13::i;:::-;56514:54;;-1:-1:-1;;;;;;56514:54:0;;;;;;;-1:-1:-1;;;;;13723:32:1;;;56514:54:0;;;13705:51:1;13772:18;;;13765:34;13678:18;;56514:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56261:340;56624:14;;;;56621:1646;;;56788:20;;;;56784:718;;;56846:9;-1:-1:-1;;;;;56832:24:0;:2;-1:-1:-1;;;;;56832:24:0;;;:49;;;;-1:-1:-1;56874:6:0;;-1:-1:-1;;;;;56860:21:0;;;56874:6;;56860:21;;56832:49;56828:659;;;56938:9;56913:35;;;;:24;:35;;;;;;56955:12;;56913:39;;56951:1;56913:39;:::i;:::-;:54;:105;;;;-1:-1:-1;;;;;;56971:28:0;;;;;;:24;:28;;;;;;57006:12;;56971:32;;57002:1;56971:32;:::i;:::-;:47;56913:105;56905:171;;;;-1:-1:-1;;;56905:171:0;;24605:2:1;56905:171:0;;;24587:21:1;24644:2;24624:18;;;24617:30;24683:34;24663:18;;;24656:62;-1:-1:-1;;;24734:18:1;;;24727:51;24795:19;;56905:171:0;24403:417:1;56905:171:0;57124:9;57099:35;;;;:24;:35;;;;;;57137:12;57099:50;;;;-1:-1:-1;;;;;57172:28:0;;;;;;:43;57256:18;;57241:11;:33;57238:230;;57322:11;57310:24;;;;:11;:24;;;;;;;;:32;;;;;;;;;57345:12;-1:-1:-1;57302:68:0;;;;-1:-1:-1;;;57302:68:0;;25027:2:1;57302:68:0;;;25009:21:1;25066:1;25046:18;;;25039:29;-1:-1:-1;;;25084:18:1;;;25077:38;25132:18;;57302:68:0;24825:331:1;57302:68:0;57409:11;57397:24;;;;:11;:24;;;;;;;;:32;;;;;;;;57432:12;57397:47;;57238:230;-1:-1:-1;;;;;57546:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;57582:35:0;;;;;;:31;:35;;;;;;;;57581:36;57546:71;57542:714;;;57656:17;;57646:6;:27;;57638:90;;;;-1:-1:-1;;;57638:90:0;;25363:2:1;57638:90:0;;;25345:21:1;25402:2;25382:18;;;25375:30;25441:34;25421:18;;;25414:62;-1:-1:-1;;;25492:18:1;;;25485:48;25550:19;;57638:90:0;25161:414:1;57638:90:0;57781:9;;57764:13;57774:2;57764:9;:13::i;:::-;57755:22;;:6;:22;:::i;:::-;:35;;57747:75;;;;-1:-1:-1;;;57747:75:0;;25782:2:1;57747:75:0;;;25764:21:1;25821:2;25801:18;;;25794:30;25860:29;25840:18;;;25833:57;25907:18;;57747:75:0;25580:351:1;57747:75:0;57542:714;;;-1:-1:-1;;;;;57887:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;57921:37:0;;;;;;:31;:37;;;;;;;;57920:38;57887:71;57883:373;;;57997:17;;57987:6;:27;;57979:91;;;;-1:-1:-1;;;57979:91:0;;26138:2:1;57979:91:0;;;26120:21:1;26177:2;26157:18;;;26150:30;26216:34;26196:18;;;26189:62;-1:-1:-1;;;26267:18:1;;;26260:49;26326:19;;57979:91:0;25936:415:1;57883:373:0;-1:-1:-1;;;;;58109:35:0;;;;;;:31;:35;;;;;;;;58105:151;;58199:9;;58182:13;58192:2;58182:9;:13::i;:::-;58173:22;;:6;:22;:::i;:::-;:35;;58165:75;;;;-1:-1:-1;;;58165:75:0;;25782:2:1;58165:75:0;;;25764:21:1;25821:2;25801:18;;;25794:30;25860:29;25840:18;;;25833:57;25907:18;;58165:75:0;25580:351:1;58165:75:0;58284:15;;;;58279:807;;-1:-1:-1;;;;;58362:19:0;;58330:29;58362:19;;;:13;:19;;;;;;58402:25;;58398:677;;58466:22;58524:21;;58510:10;;58492:15;:28;;;;:::i;:::-;58491:54;;;;:::i;:::-;58466:79;;58587:14;;58570;:31;58566:494;;;58626:22;58869:3;58820:21;58778:14;;58761;:31;;;;:::i;:::-;:80;;;;:::i;:::-;:111;;;;:::i;:::-;58651:244;;:21;:244;:::i;:::-;58626:269;;58954:14;58944:6;58926:15;58936:4;58926:9;:15::i;:::-;:24;;;;:::i;:::-;:42;;58918:51;;;;;;58603:386;58566:494;;;59018:15;:22;;-1:-1:-1;;59018:22:0;59036:4;59018:22;;;58566:494;58429:646;58398:677;58301:785;58279:807;-1:-1:-1;;;;;59116:29:0;;;;;;:25;:29;;;;;;;;:58;;;;-1:-1:-1;59163:11:0;;;;;;;59116:58;:121;;;;;59219:18;;59191:24;59209:4;59191:9;:24::i;:::-;:46;;59116:121;59098:249;;;59264:8;:15;;-1:-1:-1;;;;59264:15:0;-1:-1:-1;;;59264:15:0;;;59294:10;:8;:10::i;:::-;59319:8;:16;;-1:-1:-1;;;;59319:16:0;;;59098:249;-1:-1:-1;;;;;59383:29:0;;;;;;:25;:29;;;;;;;;:53;;;;;59435:1;59416:16;;:20;59383:53;59379:763;;;59452:12;59467:33;59487:4;59493:6;59467:19;:33::i;:::-;59452:48;-1:-1:-1;59518:8:0;;59515:431;;59646:16;;59626:17;;59619:24;;:4;:24;:::i;:::-;:43;;;;:::i;:::-;59599:16;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;59732:16:0;;59710:19;;59703:26;;:4;:26;:::i;:::-;:45;;;;:::i;:::-;59681:18;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;59820:16:0;;59797:20;;59790:27;;:4;:27;:::i;:::-;:46;;;;:::i;:::-;59767:19;;:69;;;;;;;:::i;:::-;;;;-1:-1:-1;59855:42:0;;-1:-1:-1;59871:4:0;59885;59892;59855:15;:42::i;:::-;59916:14;59926:4;59916:14;;:::i;:::-;;;59515:431;59437:536;59379:763;;;-1:-1:-1;;;;;59983:31:0;;;;;;:25;:31;;;;;;;;59979:163;;;60030:33;60046:2;60050:6;60058:4;60030:15;:33::i;:::-;59979:163;;;60096:34;60112:2;60116:6;60124:5;60096:15;:34::i;6380:614::-;-1:-1:-1;;;;;6520:20:0;;6512:70;;;;-1:-1:-1;;;6512:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6601:23:0;;6593:71;;;;-1:-1:-1;;;6593:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6701:17:0;;6677:21;6701:17;;;;;;;;;;;6737:23;;;;6729:74;;;;-1:-1:-1;;;6729:74:0;;26558:2:1;6729:74:0;;;26540:21:1;26597:2;26577:18;;;26570:30;26636:34;26616:18;;;26609:62;-1:-1:-1;;;26687:18:1;;;26680:36;26733:19;;6729:74:0;26356:402:1;6729:74:0;-1:-1:-1;;;;;6839:17:0;;;:9;:17;;;;;;;;;;;6859:22;;;6839:42;;6903:20;;;;;;;;:30;;6875:6;;6839:9;6903:30;;6875:6;;6903:30;:::i;:::-;;;;;;;;6968:9;-1:-1:-1;;;;;6951:35:0;6960:6;-1:-1:-1;;;;;6951:35:0;;6979:6;6951:35;;;;160:25:1;;148:2;133:18;;14:177;60667:1390:0;60706:12;60731:23;60757:24;60775:4;60757:9;:24::i;:::-;60731:50;;60792:25;60861:18;;60839:19;;60820:16;;:38;;;;:::i;:::-;:59;;;;:::i;:::-;60792:87;-1:-1:-1;60903:20:0;;;:46;;-1:-1:-1;60927:22:0;;60903:46;60900:60;;;60952:7;;;60667:1390::o;60900:60::-;60993:18;;:23;;61014:2;60993:23;:::i;:::-;60975:15;:41;60972:113;;;61050:18;;:23;;61071:2;61050:23;:::i;:::-;61032:41;;60972:113;61100:18;;:22;61097:379;;61138:23;61203:17;61182:18;;61164:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;61266:6;;61138:82;;-1:-1:-1;61235:55:0;;61259:4;;-1:-1:-1;;;;;61266:6:0;61138:82;61235:15;:55::i;:::-;61317:6;;;;;;;;;-1:-1:-1;;;;;61317:6:0;-1:-1:-1;;;;;61309:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61305:57;;61346:14;;;;;;;61305:57;61376:34;61395:15;61376:34;;:::i;:::-;;;61446:18;;61425:39;;;;;:::i;:::-;;;61123:353;61097:379;61488:33;61505:15;61488:16;:33::i;:::-;61637:19;;61563:21;;61542:18;;61659:17;;61624:32;;61563:21;61624:32;:::i;:::-;:52;;;;:::i;:::-;61708:1;61689:16;:20;;;61720:19;:23;;;61754:18;:22;61597:79;-1:-1:-1;61792:20:0;;61789:116;;61842:17;;:51;;-1:-1:-1;;;;;61842:17:0;;;;61872:16;;61842:51;;;;61872:16;61842:17;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61828:65:0;;-1:-1:-1;;61789:116:0;61920:21;:25;61917:133;;61983:15;;61975:63;;-1:-1:-1;;;;;61983:15:0;;;;62012:21;;61975:63;;;;62012:21;61983:15;61975:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;60667:1390:0:o;41378:211::-;41522:58;;;-1:-1:-1;;;;;13723:32:1;;41522:58:0;;;13705:51:1;13772:18;;;;13765:34;;;41522:58:0;;;;;;;;;;13678:18:1;;;;41522:58:0;;;;;;;;-1:-1:-1;;;;;41522:58:0;-1:-1:-1;;;41522:58:0;;;41495:86;;41515:5;;41495:19;:86::i;52652:338::-;-1:-1:-1;;;;;52735:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;52735:39:0;;;;;;;52787:38;52735:31;:39;52787:25;:38::i;:::-;52849:5;52846:79;;;52871:15;;:42;;-1:-1:-1;;;52871:42:0;;-1:-1:-1;;;;;1035:32:1;;;52871:42:0;;;1017:51:1;52871:15:0;;;;:36;;990:18:1;;52871:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52846:79;52942:40;;;;;;-1:-1:-1;;;;;52942:40:0;;;;;;;;52652:338;;:::o;63101:379::-;-1:-1:-1;;;;;63225:31:0;;63200:22;63225:31;;;:23;:31;;;;;;;63292:17;63249:6;63292:9;:17::i;:::-;63267:42;-1:-1:-1;63443:28:0;63460:11;63267:42;63443:28;:::i;:::-;63406:31;63423:14;63406;:31;:::i;:::-;63355:47;63378:11;63391:10;63355:22;:47::i;:::-;:83;;;;:::i;:::-;63354:118;;;;:::i;:::-;-1:-1:-1;;;;;63320:31:0;;;;;;;:23;:31;;;;;:152;;;;-1:-1:-1;;;;63101:379:0:o;60343:312::-;60433:16;;;60447:1;60433:16;;;;;;;;60409:21;;60433:16;;;;;;;;;;-1:-1:-1;60433:16:0;60409:40;;60478:4;60460;60465:1;60460:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;60460:23:0;;;-1:-1:-1;;;;;60460:23:0;;;;;60504:9;-1:-1:-1;;;;;60504:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60494:4;60499:1;60494:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60494:26:0;;;:7;;;;;;;;;:26;60533:114;;-1:-1:-1;;;60533:114:0;;:9;:60;;;;;;:114;;60594:11;;60607:1;;60610:4;;60624;;60631:15;;60533:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60398:257;60343:312;:::o;41597:333::-;41678:23;41704:69;41732:4;41704:69;;;;;;;;;;;;;;;;;41712:5;-1:-1:-1;;;;;41704:27:0;;;:69;;;;;:::i;:::-;41788:17;;41678:95;;-1:-1:-1;41788:21:0;41784:139;;41845:10;41834:30;;;;;;;;;;;;:::i;:::-;41826:85;;;;-1:-1:-1;;;41826:85:0;;28361:2:1;41826:85:0;;;28343:21:1;28400:2;28380:18;;;28373:30;28439:34;28419:18;;;28412:62;-1:-1:-1;;;28490:18:1;;;28483:40;28540:19;;41826:85:0;28159:406:1;35881:229:0;36018:12;36050:52;36072:6;36080:4;36086:1;36089:12;36018;37289;37303:23;37330:6;-1:-1:-1;;;;;37330:11:0;37349:5;37356:4;37330:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37288:73;;;;37379:69;37406:6;37414:7;37423:10;37435:12;37379:26;:69::i;:::-;37372:76;37001:455;-1:-1:-1;;;;;;;37001:455:0:o;39574:644::-;39759:12;39788:7;39784:427;;;39816:10;:17;39837:1;39816:22;39812:290;;-1:-1:-1;;;;;35322:19:0;;;40026:60;;;;-1:-1:-1;;;40026:60:0;;29471:2:1;40026:60:0;;;29453:21:1;29510:2;29490:18;;;29483:30;29549:31;29529:18;;;29522:59;29598:18;;40026:60:0;29269:353:1;40026:60:0;-1:-1:-1;40123:10:0;40116:17;;39784:427;40166:33;40174:10;40186:12;40921:17;;:21;40917:388;;41153:10;41147:17;41210:15;41197:10;41193:2;41189:19;41182:44;40917:388;41280:12;41273:20;;-1:-1:-1;;;41273:20:0;;;;;;;;:::i;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;1079:131::-;-1:-1:-1;;;;;1154:31:1;;1144:42;;1134:70;;1200:1;1197;1190:12;1215:315;1283:6;1291;1344:2;1332:9;1323:7;1319:23;1315:32;1312:52;;;1360:1;1357;1350:12;1312:52;1399:9;1386:23;1418:31;1443:5;1418:31;:::i;:::-;1468:5;1520:2;1505:18;;;;1492:32;;-1:-1:-1;;;1215:315:1:o;1727:180::-;1786:6;1839:2;1827:9;1818:7;1814:23;1810:32;1807:52;;;1855:1;1852;1845:12;1807:52;-1:-1:-1;1878:23:1;;1727:180;-1:-1:-1;1727:180:1:o;1912:247::-;1971:6;2024:2;2012:9;2003:7;1999:23;1995:32;1992:52;;;2040:1;2037;2030:12;1992:52;2079:9;2066:23;2098:31;2123:5;2098:31;:::i;2164:456::-;2241:6;2249;2257;2310:2;2298:9;2289:7;2285:23;2281:32;2278:52;;;2326:1;2323;2316:12;2278:52;2365:9;2352:23;2384:31;2409:5;2384:31;:::i;:::-;2434:5;-1:-1:-1;2491:2:1;2476:18;;2463:32;2504:33;2463:32;2504:33;:::i;:::-;2164:456;;2556:7;;-1:-1:-1;;;2610:2:1;2595:18;;;;2582:32;;2164:456::o;3054:367::-;3117:8;3127:6;3181:3;3174:4;3166:6;3162:17;3158:27;3148:55;;3199:1;3196;3189:12;3148:55;-1:-1:-1;3222:20:1;;3265:18;3254:30;;3251:50;;;3297:1;3294;3287:12;3251:50;3334:4;3326:6;3322:17;3310:29;;3394:3;3387:4;3377:6;3374:1;3370:14;3362:6;3358:27;3354:38;3351:47;3348:67;;;3411:1;3408;3401:12;3348:67;3054:367;;;;;:::o;3426:1088::-;3584:6;3592;3600;3608;3616;3624;3677:2;3665:9;3656:7;3652:23;3648:32;3645:52;;;3693:1;3690;3683:12;3645:52;3733:9;3720:23;3762:18;3803:2;3795:6;3792:14;3789:34;;;3819:1;3816;3809:12;3789:34;3858:70;3920:7;3911:6;3900:9;3896:22;3858:70;:::i;:::-;3947:8;;-1:-1:-1;3832:96:1;-1:-1:-1;4035:2:1;4020:18;;4007:32;;-1:-1:-1;4051:16:1;;;4048:36;;;4080:1;4077;4070:12;4048:36;4119:72;4183:7;4172:8;4161:9;4157:24;4119:72;:::i;:::-;4210:8;;-1:-1:-1;4093:98:1;-1:-1:-1;4298:2:1;4283:18;;4270:32;;-1:-1:-1;4314:16:1;;;4311:36;;;4343:1;4340;4333:12;4311:36;;4382:72;4446:7;4435:8;4424:9;4420:24;4382:72;:::i;:::-;3426:1088;;;;-1:-1:-1;3426:1088:1;;-1:-1:-1;3426:1088:1;;4473:8;;3426:1088;-1:-1:-1;;;3426:1088:1:o;4727:118::-;4813:5;4806:13;4799:21;4792:5;4789:32;4779:60;;4835:1;4832;4825:12;4850:382;4915:6;4923;4976:2;4964:9;4955:7;4951:23;4947:32;4944:52;;;4992:1;4989;4982:12;4944:52;5031:9;5018:23;5050:31;5075:5;5050:31;:::i;:::-;5100:5;-1:-1:-1;5157:2:1;5142:18;;5129:32;5170:30;5129:32;5170:30;:::i;:::-;5219:7;5209:17;;;4850:382;;;;;:::o;5237:388::-;5305:6;5313;5366:2;5354:9;5345:7;5341:23;5337:32;5334:52;;;5382:1;5379;5372:12;5334:52;5421:9;5408:23;5440:31;5465:5;5440:31;:::i;:::-;5490:5;-1:-1:-1;5547:2:1;5532:18;;5519:32;5560:33;5519:32;5560:33;:::i;5630:450::-;5704:6;5712;5720;5773:2;5761:9;5752:7;5748:23;5744:32;5741:52;;;5789:1;5786;5779:12;5741:52;5828:9;5815:23;5847:31;5872:5;5847:31;:::i;:::-;5897:5;-1:-1:-1;5949:2:1;5934:18;;5921:32;;-1:-1:-1;6005:2:1;5990:18;;5977:32;6018:30;5977:32;6018:30;:::i;:::-;6067:7;6057:17;;;5630:450;;;;;:::o;6085:241::-;6141:6;6194:2;6182:9;6173:7;6169:23;6165:32;6162:52;;;6210:1;6207;6200:12;6162:52;6249:9;6236:23;6268:28;6290:5;6268:28;:::i;6331:773::-;6453:6;6461;6469;6477;6530:2;6518:9;6509:7;6505:23;6501:32;6498:52;;;6546:1;6543;6536:12;6498:52;6586:9;6573:23;6615:18;6656:2;6648:6;6645:14;6642:34;;;6672:1;6669;6662:12;6642:34;6711:70;6773:7;6764:6;6753:9;6749:22;6711:70;:::i;:::-;6800:8;;-1:-1:-1;6685:96:1;-1:-1:-1;6888:2:1;6873:18;;6860:32;;-1:-1:-1;6904:16:1;;;6901:36;;;6933:1;6930;6923:12;6901:36;;6972:72;7036:7;7025:8;7014:9;7010:24;6972:72;:::i;:::-;6331:773;;;;-1:-1:-1;7063:8:1;-1:-1:-1;;;;6331:773:1:o;7109:309::-;7174:6;7182;7235:2;7223:9;7214:7;7210:23;7206:32;7203:52;;;7251:1;7248;7241:12;7203:52;7287:9;7274:23;7264:33;;7347:2;7336:9;7332:18;7319:32;7360:28;7382:5;7360:28;:::i;8129:566::-;8221:6;8229;8237;8290:2;8278:9;8269:7;8265:23;8261:32;8258:52;;;8306:1;8303;8296:12;8258:52;8346:9;8333:23;8379:18;8371:6;8368:30;8365:50;;;8411:1;8408;8401:12;8365:50;8450:70;8512:7;8503:6;8492:9;8488:22;8450:70;:::i;:::-;8539:8;;-1:-1:-1;8424:96:1;-1:-1:-1;;8624:2:1;8609:18;;8596:32;8637:28;8596:32;8637:28;:::i;8700:316::-;8777:6;8785;8793;8846:2;8834:9;8825:7;8821:23;8817:32;8814:52;;;8862:1;8859;8852:12;8814:52;-1:-1:-1;;8885:23:1;;;8955:2;8940:18;;8927:32;;-1:-1:-1;9006:2:1;8991:18;;;8978:32;;8700:316;-1:-1:-1;8700:316:1:o;9021:248::-;9089:6;9097;9150:2;9138:9;9129:7;9125:23;9121:32;9118:52;;;9166:1;9163;9156:12;9118:52;-1:-1:-1;;9189:23:1;;;9259:2;9244:18;;;9231:32;;-1:-1:-1;9021:248:1:o;9274:356::-;9476:2;9458:21;;;9495:18;;;9488:30;9554:34;9549:2;9534:18;;9527:62;9621:2;9606:18;;9274:356::o;10195:380::-;10274:1;10270:12;;;;10317;;;10338:61;;10392:4;10384:6;10380:17;10370:27;;10338:61;10445:2;10437:6;10434:14;10414:18;10411:38;10408:161;;10491:10;10486:3;10482:20;10479:1;10472:31;10526:4;10523:1;10516:15;10554:4;10551:1;10544:15;10408:161;;10195:380;;;:::o;10580:127::-;10641:10;10636:3;10632:20;10629:1;10622:31;10672:4;10669:1;10662:15;10696:4;10693:1;10686:15;10712:168;10785:9;;;10816;;10833:15;;;10827:22;;10813:37;10803:71;;10854:18;;:::i;10885:217::-;10925:1;10951;10941:132;;10995:10;10990:3;10986:20;10983:1;10976:31;11030:4;11027:1;11020:15;11058:4;11055:1;11048:15;10941:132;-1:-1:-1;11087:9:1;;10885:217::o;11929:184::-;11999:6;12052:2;12040:9;12031:7;12027:23;12023:32;12020:52;;;12068:1;12065;12058:12;12020:52;-1:-1:-1;12091:16:1;;11929:184;-1:-1:-1;11929:184:1:o;12471:125::-;12536:9;;;12557:10;;;12554:36;;;12570:18;;:::i;13383:127::-;13444:10;13439:3;13435:20;13432:1;13425:31;13475:4;13472:1;13465:15;13499:4;13496:1;13489:15;13810:135;13849:3;13870:17;;;13867:43;;13890:18;;:::i;:::-;-1:-1:-1;13937:1:1;13926:13;;13810:135::o;14138:251::-;14208:6;14261:2;14249:9;14240:7;14236:23;14232:32;14229:52;;;14277:1;14274;14267:12;14229:52;14309:9;14303:16;14328:31;14353:5;14328:31;:::i;14699:245::-;14766:6;14819:2;14807:9;14798:7;14794:23;14790:32;14787:52;;;14835:1;14832;14825:12;14787:52;14867:9;14861:16;14886:28;14908:5;14886:28;:::i;15382:306::-;15470:6;15478;15486;15539:2;15527:9;15518:7;15514:23;15510:32;15507:52;;;15555:1;15552;15545:12;15507:52;15584:9;15578:16;15568:26;;15634:2;15623:9;15619:18;15613:25;15603:35;;15678:2;15667:9;15663:18;15657:25;15647:35;;15382:306;;;;;:::o;18801:681::-;18932:6;18940;18948;18956;18964;18972;18980;18988;19041:3;19029:9;19020:7;19016:23;19012:33;19009:53;;;19058:1;19055;19048:12;19009:53;19090:9;19084:16;19109:31;19134:5;19109:31;:::i;:::-;19159:5;19149:15;;;19204:2;19193:9;19189:18;19183:25;19173:35;;19248:2;19237:9;19233:18;19227:25;19217:35;;19292:2;19281:9;19277:18;19271:25;19261:35;;19336:3;19325:9;19321:19;19315:26;19305:36;;19381:3;19370:9;19366:19;19360:26;19350:36;;19426:3;19415:9;19411:19;19405:26;19395:36;;19471:3;19460:9;19456:19;19450:26;19440:36;;18801:681;;;;;;;;;;;:::o;19487:128::-;19554:9;;;19575:11;;;19572:37;;;19589:18;;:::i;20023:794::-;20245:2;20257:21;;;20230:18;;20313:22;;;20197:4;20392:6;20366:2;20351:18;;20197:4;20426:304;20440:6;20437:1;20434:13;20426:304;;;20515:6;20502:20;20535:31;20560:5;20535:31;:::i;:::-;-1:-1:-1;;;;;20591:31:1;20579:44;;20646:4;20705:15;;;;20670:12;;;;20619:1;20455:9;20426:304;;;20430:3;20747;20739:11;;;;20802:6;20795:14;20788:22;20781:4;20770:9;20766:20;20759:52;20023:794;;;;;;:::o;23238:401::-;23440:2;23422:21;;;23479:2;23459:18;;;23452:30;23518:34;23513:2;23498:18;;23491:62;-1:-1:-1;;;23584:2:1;23569:18;;23562:35;23629:3;23614:19;;23238:401::o;23644:399::-;23846:2;23828:21;;;23885:2;23865:18;;;23858:30;23924:34;23919:2;23904:18;;23897:62;-1:-1:-1;;;23990:2:1;23975:18;;23968:33;24033:3;24018:19;;23644:399::o;27174:980::-;27436:4;27484:3;27473:9;27469:19;27515:6;27504:9;27497:25;27541:2;27579:6;27574:2;27563:9;27559:18;27552:34;27622:3;27617:2;27606:9;27602:18;27595:31;27646:6;27681;27675:13;27712:6;27704;27697:22;27750:3;27739:9;27735:19;27728:26;;27789:2;27781:6;27777:15;27763:29;;27810:1;27820:195;27834:6;27831:1;27828:13;27820:195;;;27899:13;;-1:-1:-1;;;;;27895:39:1;27883:52;;27990:15;;;;27955:12;;;;27931:1;27849:9;27820:195;;;-1:-1:-1;;;;;;;28071:32:1;;;;28066:2;28051:18;;28044:60;-1:-1:-1;;;28135:3:1;28120:19;28113:35;28032:3;27174:980;-1:-1:-1;;;27174:980:1:o;28977:287::-;29106:3;29144:6;29138:13;29160:66;29219:6;29214:3;29207:4;29199:6;29195:17;29160:66;:::i;:::-;29242:16;;;;;28977:287;-1:-1:-1;;28977:287:1:o

Swarm Source

ipfs://12371724598703c4bb2623ac8cf755576b0dff8823562c17c18dbfae1d55ae80
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.