ETH Price: $2,487.88 (-2.47%)

Token

ERC20 ***
 

Overview

Max Total Supply

10,000,000 ERC20 ***

Holders

16

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
0.000000001 ERC20 ***

Value
$0.00
0x95fda0f172735b833a33e3009ebbe44459ad9a7e
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:
ElonMuskFineXTrump69Doge

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;
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;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

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

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

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

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

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        /*
            _tokengeneration is an internal function in ERC20.sol that is only called here to generate the total supply first time,
            and CANNOT be called ever again
        */
    function _tokengeneration(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: new tokens to the zero address");

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

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

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

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

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

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

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

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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

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

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

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

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

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

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


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

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

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

interface IPair {
    function sync() external;
}

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

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

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

/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
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);
  
  function distributeDividends() external payable;
  
  /// @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);


  /// @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 ERC20, DividendPayingTokenInterface, 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;

  IRouter public router;
  address public rewardToken;

  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 new tokens/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;

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol)  ERC20(_name, _symbol) {
      IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
      router = _router;
      rewardToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
  }

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

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

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

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

    /// @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);
            if(rewardToken != router.WETH()){
                (bool success) = swapBnbForCustomToken(user, _withdrawableDividend);
                if(!success) {
                    (bool secondSuccess,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                    if(!secondSuccess) {
                        withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                        return 0;
                    }       
                }
            }
            else{
                (bool success,) = user.call{value: _withdrawableDividend, gas: 3000}("");
                if(!success) {
                    withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                    return 0;
                }
            }
            return _withdrawableDividend;
        }
        return 0;
    }
    
    function setRewardToken(address newToken) external onlyOwner{
        rewardToken = newToken;
    }
  
    function swapBnbForCustomToken(address user, uint256 amt) internal returns (bool) {
          address[] memory path = new address[](2);
          path[0] = router.WETH();
          path[1] = rewardToken;

          try router.swapExactETHForTokens{value: amt}(0, path, user, block.timestamp + 2){
            return true;
        } catch {
            return false;
        }
    }

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

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner) public view override returns(uint256) {
      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) public 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(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

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

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

    /// 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 _tokengeneration(address account, uint256 value) internal override {
      super._tokengeneration(account, value);

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

library Address {
    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");
    }
}

contract ElonMuskFineXTrump69Doge is ERC20, Ownable {
    using Address for address payable;
    IRouter public  router;
    address private  pair;
    bool private swapping;
    bool private  swapEnabled = true;
    bool public tradingEnabled = false;
    uint256 private  startTradingBlock;
    USDT_DividendTracker public dividendTracker;
    
    address public constant deadWallet = 0x000000000000000000000000000000000000dEaD;
    address public marketingWallet = 0xD3384c9Dc238Ea3716614cBDf9c17D1b02D2dE4B;
    uint256 private swapTokensAtAmount = 2e5 * 10**9;
    
    string private currentRewardToken;

    struct Taxes {
        uint256 rewards;
        uint256 marketing;
        uint256 liquidity;
    }

    Taxes public buyTaxes = Taxes(1, 29, 0);
    Taxes public sellTaxes = Taxes(1, 29, 0);

    uint256 public gasForProcessing = 300000;
    uint256 private antiBotBlocks = 2;
    uint256 private launchtax = 99;
    
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;

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

    constructor() ERC20("ElonMuskFineXTrump69Doge", "USDT") {
        dividendTracker = new  USDT_DividendTracker();
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        _setAutomatedMarketMakerPair(_pair, true);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(deadWallet, true);
        dividendTracker.excludeFromDividends(address(_router), true);

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

        _tokengeneration(owner(), 10000000 * (10**9));
    }

    receive() external payable {}

    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 rescueERC20Tokens(address tokenAddress) external onlyOwner {
        require(tokenAddress != address(this), "Owner can't claim contract's balance of its own tokens");
        IERC20(tokenAddress).transfer(marketingWallet,IERC20(tokenAddress).balanceOf(address(this)));
    }

    function rescueETH() external {
        uint256 ETHbalance = address(this).balance;
        payable(marketingWallet).sendValue(ETHbalance);
    }

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

        emit ExcludeFromFees(account, excluded);
    }

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

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

    function setdevelopmentWallet(address newWallet) external onlyOwner {
        require(newWallet != address(this), "Fee Address cannot be Contract Address");
        require(newWallet != address(0),"Fee Address cannot be zero address");
        marketingWallet = newWallet;
       excludeFromFees(newWallet, true);
    }

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        require(amount >= 1e2, "amount must be greater than or equal to 0.001%");
        swapTokensAtAmount = amount * 10**9;
    }

    function setBuyTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        buyTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSellTaxes(uint256 _rewards, uint256 marketing, uint256 _liquidity) external onlyOwner{
        sellTaxes = Taxes(_rewards, marketing, _liquidity);
        require((_rewards + marketing +  _liquidity ) <= 40, "Must keep fees at 40% or less");
    }

    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }    

    function enableTradingEnabled() external onlyOwner {
        require(!tradingEnabled, "Trading is already enabled");
        tradingEnabled = true;
        startTradingBlock = block.number;
    }

    function setBotBlocks(uint256 numberOfBlocks) external onlyOwner{
        require(!tradingEnabled, "Can't change when trading has started");
        require(numberOfBlocks < 3,"Deadline should be less than 3 Blocks");
        antiBotBlocks = numberOfBlocks;
    }

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        dividendTracker.setMinBalanceForDividends(amount);
    }

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

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

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    /// @notice Update the gasForProcessing needed to auto-distribute rewards
    /// @param newValue The new amount of gas needed
    /// @dev The amount should not be greater than 500k to avoid expensive transactions
    function setGasForProcessing(uint256 newValue) external onlyOwner {
        require( newValue >= 200000 && newValue <= 500000,
           "GasForProcessing must be between 200,000 and 500,000"
        );
        require(newValue != gasForProcessing,
            "Cannot update gasForProcessing to same value"
        );
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    /// @dev Update the dividendTracker claimWait
    function setClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

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

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

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

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

    function getCurrentRewardToken() external view returns (string memory) {
        return dividendTracker.getCurrentRewardToken();
    }

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

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

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

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

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

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

        if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
                require(tradingEnabled, "Trading no active");
        }
       
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;
        uint256 swapTax = sellTaxes.rewards +
            sellTaxes.marketing +
            sellTaxes.liquidity ;

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

            if (swapTax > 0) {
                swapAndLiquify(swapTokensAtAmount, swapTax);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
            if (takeFee) {
            bool useLaunchFee = block.number <= startTradingBlock + antiBotBlocks;
            uint256 swapAmt;
            
            if (automatedMarketMakerPairs[to] && !useLaunchFee) {
                swapAmt = (amount * swapTax) / 100;
            
            } else if (automatedMarketMakerPairs[from] && !useLaunchFee) {
                swapAmt =
                    (amount *
                        (buyTaxes.rewards +
                            buyTaxes.marketing +
                            buyTaxes.liquidity )) / 100;
            
            } else if (useLaunchFee) {
                swapAmt = (amount * launchtax) / 100; 
            }
            
            amount = amount - (swapAmt);
            super._transfer(from, address(this), swapAmt);
        }
        
        super._transfer(from, to, amount);
        
        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}

        if (!swapping) {
            uint256 gas = gasForProcessing;

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

    function swapAndLiquify(uint256 tokens, uint256 swapTax) private {
        uint256 denominator = swapTax * 2;
        uint256 tokensToAddLiquidityWith = (tokens * sellTaxes.liquidity) / denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;
        uint256 initialBalance = address(this).balance;

        swapTokensForBNB(toSwap);

        uint256 deltaBalance = address(this).balance - initialBalance;
        uint256 unitBalance = deltaBalance / (denominator - sellTaxes.liquidity);
        uint256 bnbToAddLiquidityWith = unitBalance * sellTaxes.liquidity;
        if (bnbToAddLiquidityWith > 0) {
            addLiquidity(tokensToAddLiquidityWith, bnbToAddLiquidityWith);
        }
        uint256 marketingWalletAmt = unitBalance * 2 * sellTaxes.marketing;
        if (marketingWalletAmt > 0) {
            payable(marketingWallet).sendValue(marketingWalletAmt);
        }
        uint256 dividends = unitBalance * 2 * sellTaxes.rewards;
        if (dividends > 0) {
            (bool success, ) = address(dividendTracker).call{ value: dividends }("");
            if (success) emit SendDividends(tokens, dividends);
        }
    }

    function swapTokensForBNB(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            deadWallet,
            block.timestamp
        );
    }
}

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

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

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

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

    constructor()
        DividendPayingToken("USDT_Dividen_Tracker", "USDT_Dividend_Tracker")
    {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 1e3 * (10**decimals());
    }

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

    function setMinBalanceForDividends(uint256 amount) external onlyOwner {
        minimumTokenBalanceForDividends = amount * 10**decimals();
    }

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

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

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

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

    function getCurrentRewardToken() external view returns (string memory) {
        return IERC20Metadata(rewardToken).name();
    }

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

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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

                iterationsUntilProcessed = index + (int256(processesUntilEndOfArray));
            }
        }

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

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime + (claimWait) : 0;

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

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

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

        processAccount(payable(account), true);
    }

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

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

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

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

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

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

            iterations++;

            uint256 newGasLeft = gasleft();

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

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

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

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

        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxes","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract USDT_DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTradingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentRewardToken","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"setBotBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"setClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setdevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6007805461ffff60a81b1916600160a81b179055600a80546001600160a01b03191673d3384c9dc238ea3716614cbdf9c17d1b02d2de4b17905565b5e620f48000600b5560016080819052601d60a0819052600060c0819052600d839055600e829055600f81905561014060405260e0839052610100829052610120819052601092909255601155601255620493e060135560026014556063601555348015620000a857600080fd5b506040518060400160405280601881526020017f456c6f6e4d75736b46696e65585472756d703639446f67650000000000000000815250604051806040016040528060048152602001631554d11560e21b81525081600390816200010d919062000ade565b5060046200011c828262000ade565b5050506000620001316200060860201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506040516200018d9062000a2c565b604051809103906000f080158015620001aa573d6000803e3d6000fd5b50600960006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000251919062000baa565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c5919062000baa565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000313573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000339919062000baa565b600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620003788160016200060c565b60095460405162241fbd60e51b81526001600160a01b03909116600482018190526001602483015290630483f7a090604401600060405180830381600087803b158015620003c557600080fd5b505af1158015620003da573d6000803e3d6000fd5b505060095460405162241fbd60e51b8152306004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200042a57600080fd5b505af11580156200043f573d6000803e3d6000fd5b50506009546001600160a01b03169150630483f7a09050620004696005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b158015620004b257600080fd5b505af1158015620004c7573d6000803e3d6000fd5b505060095460405162241fbd60e51b815261dead6004820152600160248201526001600160a01b039091169250630483f7a09150604401600060405180830381600087803b1580156200051957600080fd5b505af11580156200052e573d6000803e3d6000fd5b505060095460405162241fbd60e51b81526001600160a01b038681166004830152600160248301529091169250630483f7a09150604401600060405180830381600087803b1580156200058057600080fd5b505af115801562000595573d6000803e3d6000fd5b50505050620005b5620005ad6200077a60201b60201c565b600162000789565b600a54620005ce906001600160a01b0316600162000789565b620005db30600162000789565b62000600620005f26005546001600160a01b031690565b662386f26fc10000620008c9565b505062000bf7565b3390565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503620006a85760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b0382166000908152601760205260409020805460ff191682158015919091179091556200073e5760095460405162241fbd60e51b81526001600160a01b0384811660048301526001602483015290911690630483f7a090604401600060405180830381600087803b1580156200072457600080fd5b505af115801562000739573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b03163314620007e55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200069f565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036200086a5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b60648201526084016200069f565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166200092f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b60648201526084016200069f565b6002546200093e9082620009c0565b6002556001600160a01b038216600090815260208190526040902054620009669082620009c0565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b600080620009cf838562000bd5565b90508381101562000a235760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200069f565b90505b92915050565b612c318062003bdb83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000a6557607f821691505b60208210810362000a8657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009bb57600081815260208120601f850160051c8101602086101562000ab55750805b601f850160051c820191505b8181101562000ad65782815560010162000ac1565b505050505050565b81516001600160401b0381111562000afa5762000afa62000a3a565b62000b128162000b0b845462000a50565b8462000a8c565b602080601f83116001811462000b4a576000841562000b315750858301515b600019600386901b1c1916600185901b17855562000ad6565b600085815260208120601f198616915b8281101562000b7b5788860151825594840194600190910190840162000b5a565b508582101562000b9a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000bbd57600080fd5b81516001600160a01b038116811462000a2357600080fd5b8082018082111562000a2657634e487b7160e01b600052601160045260246000fd5b612fd48062000c076000396000f3fe6080604052600436106102cd5760003560e01c806375f0a87411610175578063ad56c13c116100dc578063dd62ed3e11610095578063f27fd2541161006f578063f27fd2541461090a578063f2fde38b1461092a578063f66895a31461094a578063f887ea401461096957600080fd5b8063dd62ed3e1461088f578063e01af92c146108d5578063e7841ec0146108f557600080fd5b8063ad56c13c1461077a578063afa4f3b2146107df578063b62496f5146107ff578063c02466681461082f578063c3e0f5cf1461084f578063c492f0461461086f57600080fd5b80639c1b8af51161012e5780639c1b8af5146106cf5780639d7ceafb146106e5578063a26579ad14610705578063a457c2d71461071a578063a8b9d2401461073a578063a9059cbb1461075a57600080fd5b806375f0a8741461061757806385141a7714610637578063854c84dc1461064d578063864701a5146106625780638da5cb5b1461069c57806395d89b41146106ba57600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd841461058c578063700bb191146105ac57806370a08231146105cc578063715018a61461060257600080fd5b80634fbee1931461051e5780635960e46d1461055757806364b0f6531461057757600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634830aa17146104c85780634ada218b146104e85780634e71d92d1461050957600080fd5b80630f4bc27c116102865780630f4bc27c146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f43660046128e8565b610989565b005b34801561030757600080fd5b50610310610a27565b60405161031d9190612945565b60405180910390f35b34801561033257600080fd5b506102f9610ab9565b34801561034757600080fd5b506102f9610356366004612978565b610b56565b34801561036757600080fd5b5061037b6103763660046129a4565b610c11565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a63660046129d0565b610c28565b3480156103b757600080fd5b506102f96103c63660046129d0565b610cb4565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612978565b610da9565b34801561041657600080fd5b506102f9610e07565b34801561042b57600080fd5b5061037b61043a3660046129e9565b610e22565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e8b565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c33660046129a4565b610efe565b3480156104d457600080fd5b506102f96104e3366004612a2a565b610f34565b3480156104f457600080fd5b5060075461037b90600160b01b900460ff1681565b34801561051557600080fd5b506102f961104c565b34801561052a57600080fd5b5061037b610539366004612a2a565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561056357600080fd5b506102f96105723660046129d0565b6110c1565b34801561058357600080fd5b506103dc611203565b34801561059857600080fd5b506103dc6105a7366004612a2a565b61124d565b3480156105b857600080fd5b506102f96105c73660046129d0565b6112bd565b3480156105d857600080fd5b506103dc6105e7366004612a2a565b6001600160a01b031660009081526020819052604090205490565b34801561060e57600080fd5b506102f961138f565b34801561062357600080fd5b50600a5461045f906001600160a01b031681565b34801561064357600080fd5b5061045f61dead81565b34801561065957600080fd5b50610310611403565b34801561066e57600080fd5b50600d54600e54600f5461068192919083565b6040805193845260208401929092529082015260600161031d565b3480156106a857600080fd5b506005546001600160a01b031661045f565b3480156106c657600080fd5b50610310611475565b3480156106db57600080fd5b506103dc60135481565b3480156106f157600080fd5b506102f96107003660046129d0565b611484565b34801561071157600080fd5b506103dc6114df565b34801561072657600080fd5b5061037b6107353660046129a4565b611529565b34801561074657600080fd5b506103dc610755366004612a2a565b611578565b34801561076657600080fd5b5061037b6107753660046129a4565b6115ab565b34801561078657600080fd5b5061079a610795366004612a2a565b6115b8565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107eb57600080fd5b506102f96107fa3660046129d0565b611653565b34801561080b57600080fd5b5061037b61081a366004612a2a565b60176020526000908152604090205460ff1681565b34801561083b57600080fd5b506102f961084a3660046128e8565b6116f9565b34801561085b57600080fd5b506102f961086a366004612a2a565b611805565b34801561087b57600080fd5b506102f961088a366004612a47565b611990565b34801561089b57600080fd5b506103dc6108aa366004612acd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108e157600080fd5b506102f96108f0366004612afb565b611a6c565b34801561090157600080fd5b506103dc611ab4565b34801561091657600080fd5b5061079a6109253660046129d0565b611afe565b34801561093657600080fd5b506102f9610945366004612a2a565b611b40565b34801561095657600080fd5b5060105460115460125461068192919083565b34801561097557600080fd5b5060065461045f906001600160a01b031681565b6005546001600160a01b031633146109bc5760405162461bcd60e51b81526004016109b390612b18565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610a0b57600080fd5b505af1158015610a1f573d6000803e3d6000fd5b505050505050565b606060038054610a3690612b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6290612b4d565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ae35760405162461bcd60e51b81526004016109b390612b18565b600754600160b01b900460ff1615610b3d5760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c656400000000000060448201526064016109b3565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b805760405162461bcd60e51b81526004016109b390612b18565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610bb48486612b9d565b610bbe9190612b9d565b1115610c0c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c65737300000060448201526064016109b3565b505050565b6000610c1e338484611c2b565b5060015b92915050565b6005546001600160a01b03163314610c525760405162461bcd60e51b81526004016109b390612b18565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c9957600080fd5b505af1158015610cad573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cde5760405162461bcd60e51b81526004016109b390612b18565b600754600160b01b900460ff1615610d465760405162461bcd60e51b815260206004820152602560248201527f43616e2774206368616e6765207768656e2074726164696e6720686173207374604482015264185c9d195960da1b60648201526084016109b3565b60038110610da45760405162461bcd60e51b815260206004820152602560248201527f446561646c696e652073686f756c64206265206c657373207468616e203320426044820152646c6f636b7360d81b60648201526084016109b3565b601455565b6005546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109b390612b18565b604080516060810182528481526020810184905201819052600d839055600e829055600f819055602881610bb48486612b9d565b600a544790610e1f906001600160a01b031682611d50565b50565b6000610e2f848484611e69565b610e818433610e7c85604051806060016040528060288152602001612f52602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906123b7565b611c2b565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef99190612bb0565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c1e918590610e7c90866123f1565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b81526004016109b390612b18565b306001600160a01b03821603610fc55760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b60648201526084016109b3565b6001600160a01b0381166110265760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b60648201526084016109b3565b600a80546001600160a01b0319166001600160a01b038316179055610e1f8160016116f9565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561109d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190612bc9565b6005546001600160a01b031633146110eb5760405162461bcd60e51b81526004016109b390612b18565b62030d40811015801561110157506207a1208111155b61116a5760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b60648201526084016109b3565b60135481036111d05760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016109b3565b60135460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601355565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c229190612bb0565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190612be6565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146113b95760405162461bcd60e51b81526004016109b390612b18565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa15801561144d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ef99190810190612c2a565b606060048054610a3690612b4d565b6005546001600160a01b031633146114ae5760405162461bcd60e51b81526004016109b390612b18565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c7f565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b6000610c1e3384610e7c85604051806060016040528060258152602001612f7a602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906123b7565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161127c565b6000610c1e338484611e69565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116389190612cd7565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461167d5760405162461bcd60e51b81526004016109b390612b18565b60648110156116e55760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b60648201526084016109b3565b6116f381633b9aca00612d41565b600b5550565b6005546001600160a01b031633146117235760405162461bcd60e51b81526004016109b390612b18565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036117a65760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b60648201526084016109b3565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461182f5760405162461bcd60e51b81526004016109b390612b18565b306001600160a01b038216036118a65760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016109b3565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa1580156118f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191d9190612bb0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612bc9565b5050565b6005546001600160a01b031633146119ba5760405162461bcd60e51b81526004016109b390612b18565b60005b82811015611a2b5781601660008686858181106119dc576119dc612d58565b90506020020160208101906119f19190612a2a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2381612d6e565b9150506119bd565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a5f93929190612d87565b60405180910390a1505050565b6005546001600160a01b03163314611a965760405162461bcd60e51b81526004016109b390612b18565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016115f6565b6005546001600160a01b03163314611b6a5760405162461bcd60e51b81526004016109b390612b18565b6001600160a01b038116611bcf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611c8d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109b3565b6001600160a01b038216611cee5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109b3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611da05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ded576040519150601f19603f3d011682016040523d82523d6000602084013e611df2565b606091505b5050905080610c0c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b3565b6001600160a01b038316611e8f5760405162461bcd60e51b81526004016109b390612de0565b6001600160a01b038216611eb55760405162461bcd60e51b81526004016109b390612e25565b6001600160a01b03831660009081526016602052604090205460ff16158015611ef757506001600160a01b03821660009081526016602052604090205460ff16155b15611f4957600754600160b01b900460ff16611f495760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b60448201526064016109b3565b80600003611f5d57610c0c83836000612457565b30600090815260208190526040812054600b5460125460115460105493949285101593611f8a9190612b9d565b611f949190612b9d565b9050818015611fad5750600754600160a01b900460ff16155b8015611fc25750600754600160a81b900460ff165b8015611fe757506001600160a01b03861660009081526017602052604090205460ff16155b801561200c57506001600160a01b03861660009081526016602052604090205460ff16155b801561203157506001600160a01b03851660009081526016602052604090205460ff16155b15612069576007805460ff60a01b1916600160a01b179055801561205b5761205b600b5482612560565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526016602052604090205460ff600160a01b9092048216159116806120b757506001600160a01b03861660009081526016602052604090205460ff165b156120c0575060005b80156121bb5760006014546008546120d89190612b9d565b6001600160a01b03881660009081526017602052604081205443929092111592509060ff168015612107575081155b156121295760646121188589612d41565b6121229190612e68565b90506121a1565b6001600160a01b03891660009081526017602052604090205460ff16801561214f575081155b1561217e57600f54600e54600d546064929161216a91612b9d565b6121749190612b9d565b6121189089612d41565b81156121a1576064601554886121949190612d41565b61219e9190612e68565b90505b6121ab8188612e8a565b96506121b8893083612457565b50505b6121c6878787612457565b6009546001600160a01b031663e30443bc886121f7816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561223d57600080fd5b505af192505050801561224e575060015b506009546001600160a01b031663e30443bc87612280816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156122c657600080fd5b505af19250505080156122d7575060015b50600754600160a01b900460ff166123ae576013546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612356575060408051601f3d908101601f1916820190925261235391810190612be6565b60015b156123ac5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156123db5760405162461bcd60e51b81526004016109b39190612945565b5060006123e88486612e8a565b95945050505050565b6000806123fe8385612b9d565b9050838110156124505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109b3565b9392505050565b6001600160a01b03831661247d5760405162461bcd60e51b81526004016109b390612de0565b6001600160a01b0382166124a35760405162461bcd60e51b81526004016109b390612e25565b6124e081604051806060016040528060268152602001612f2c602691396001600160a01b03861660009081526020819052604090205491906123b7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461250f90826123f1565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d43565b600061256d826002612d41565b9050600081601060020154856125839190612d41565b61258d9190612e68565b9050600061259b8286612e8a565b9050476125a7826126f6565b60006125b38247612e8a565b6012549091506000906125c69087612e8a565b6125d09083612e68565b6012549091506000906125e39083612d41565b905080156125f5576125f5868261281a565b601154600090612606846002612d41565b6126109190612d41565b9050801561262e57600a5461262e906001600160a01b031682611d50565b60105460009061263f856002612d41565b6126499190612d41565b905080156126e9576009546040516000916001600160a01b03169083908381818185875af1925050503d806000811461269e576040519150601f19603f3d011682016040523d82523d6000602084013e6126a3565b606091505b5050905080156126e757604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061272b5761272b612d58565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190612e9d565b816001815181106127bb576127bb612d58565b6001600160a01b0392831660209182029290920101526006546127e19130911684611c2b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109f1908590600090869030904290600401612eba565b6006546128329030906001600160a01b031684611c2b565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156128a0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cad9190612be6565b6001600160a01b0381168114610e1f57600080fd5b8015158114610e1f57600080fd5b600080604083850312156128fb57600080fd5b8235612906816128c5565b91506020830135612916816128da565b809150509250929050565b60005b8381101561293c578181015183820152602001612924565b50506000910152565b6020815260008251806020840152612964816040850160208701612921565b601f01601f19169190910160400192915050565b60008060006060848603121561298d57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156129b757600080fd5b82356129c2816128c5565b946020939093013593505050565b6000602082840312156129e257600080fd5b5035919050565b6000806000606084860312156129fe57600080fd5b8335612a09816128c5565b92506020840135612a19816128c5565b929592945050506040919091013590565b600060208284031215612a3c57600080fd5b8135612450816128c5565b600080600060408486031215612a5c57600080fd5b833567ffffffffffffffff80821115612a7457600080fd5b818601915086601f830112612a8857600080fd5b813581811115612a9757600080fd5b8760208260051b8501011115612aac57600080fd5b60209283019550935050840135612ac2816128da565b809150509250925092565b60008060408385031215612ae057600080fd5b8235612aeb816128c5565b91506020830135612916816128c5565b600060208284031215612b0d57600080fd5b8135612450816128da565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6157607f821691505b602082108103612b8157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c2257610c22612b87565b600060208284031215612bc257600080fd5b5051919050565b600060208284031215612bdb57600080fd5b8151612450816128da565b600080600060608486031215612bfb57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612c3c57600080fd5b815167ffffffffffffffff80821115612c5457600080fd5b818401915084601f830112612c6857600080fd5b815181811115612c7a57612c7a612c14565b604051601f8201601f19908116603f01168101908382118183101715612ca257612ca2612c14565b81604052828152876020848701011115612cbb57600080fd5b612ccc836020830160208801612921565b979650505050505050565b600080600080600080600080610100898b031215612cf457600080fd5b8851612cff816128c5565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b8082028115828204841417610c2257610c22612b87565b634e487b7160e01b600052603260045260246000fd5b600060018201612d8057612d80612b87565b5060010190565b6040808252810183905260008460608301825b86811015612dca578235612dad816128c5565b6001600160a01b0316825260209283019290910190600101612d9a565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082612e8557634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c2257610c22612b87565b600060208284031215612eaf57600080fd5b8151612450816128c5565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f0a5784516001600160a01b031683529383019391830191600101612ee5565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a2a613a00667b7f7d401213d5dd4d078816a5c4865467ba47ba943de5138c60b64736f6c6343000813003360806040523480156200001157600080fd5b506040518060400160405280601481526020017f555344545f4469766964656e5f547261636b65720000000000000000000000008152506040518060400160405280601581526020017f555344545f4469766964656e645f547261636b657200000000000000000000008152508181816003908162000091919062000229565b506004620000a0828262000229565b5050506000620000b56200018060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050600680546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d179091556007805490911673dac17f958d2ee523a2206206994597c13d831ec717905550610e106013556200015c600990565b6200016990600a6200040a565b62000177906103e862000422565b6014556200043c565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001af57607f821691505b602082108103620001d057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022457600081815260208120601f850160051c81016020861015620001ff5750805b601f850160051c820191505b8181101562000220578281556001016200020b565b5050505b505050565b81516001600160401b0381111562000245576200024562000184565b6200025d816200025684546200019a565b84620001d6565b602080601f8311600181146200029557600084156200027c5750858301515b600019600386901b1c1916600185901b17855562000220565b600085815260208120601f198616915b82811015620002c657888601518255948401946001909101908401620002a5565b5085821015620002e55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200034c578160001904821115620003305762000330620002f5565b808516156200033e57918102915b93841c939080029062000310565b509250929050565b600082620003655750600162000404565b81620003745750600062000404565b81600181146200038d57600281146200039857620003b8565b600191505062000404565b60ff841115620003ac57620003ac620002f5565b50506001821b62000404565b5060208310610133831016604e8410600b8410161715620003dd575081810a62000404565b620003e983836200030b565b8060001904821115620004005762000400620002f5565b0290505b92915050565b60006200041b60ff84168362000354565b9392505050565b8082028115828204841417620004045762000404620002f5565b6127e5806200044c6000396000f3fe6080604052600436106102345760003560e01c80638aee81271161012e578063be10b614116100ab578063f2fde38b1161006f578063f2fde38b146106ed578063f7c618c11461070d578063f887ea401461072d578063fbcbc0f11461074d578063ffb2c4791461076d57600080fd5b8063be10b6141461063c578063dd62ed3e14610652578063e30443bc14610698578063e7841ec0146106b8578063e98030c7146106cd57600080fd5b8063a457c2d7116100f2578063a457c2d714610586578063a8b9d240146105a6578063a9059cbb146105c6578063aafd847a146105e6578063bc4c4b371461061c57600080fd5b80638aee8127146104df5780638da5cb5b146104ff57806391b89fba1461053157806395d89b41146105515780639d7ceafb1461056657600080fd5b80633009a609116101bc5780636f2789ec116101805780636f2789ec1461045357806370a0823114610469578063715018a61461049f578063854c84dc146104b457806385a6b3ae146104c957600080fd5b80633009a6091461036c578063313ce56714610382578063395093511461039e5780634e7b827f146103be5780635183d6fd146103ee57600080fd5b806309bbedde1161020357806309bbedde146102cb57806318160ddd146102ea578063226cfa3d146102ff57806323b872dd1461032c57806327ce01471461034c57600080fd5b806303c83302146102485780630483f7a01461025057806306fdde0314610270578063095ea7b31461029b57600080fd5b36610243576102416107a8565b005b600080fd5b6102416107a8565b34801561025c57600080fd5b5061024161026b366004612169565b61083b565b34801561027c57600080fd5b50610285610a5d565b60405161029291906121c2565b60405180910390f35b3480156102a757600080fd5b506102bb6102b63660046121f5565b610aef565b6040519015158152602001610292565b3480156102d757600080fd5b50600c545b604051908152602001610292565b3480156102f657600080fd5b506002546102dc565b34801561030b57600080fd5b506102dc61031a366004612221565b60126020526000908152604090205481565b34801561033857600080fd5b506102bb61034736600461223e565b610b06565b34801561035857600080fd5b506102dc610367366004612221565b610b6f565b34801561037857600080fd5b506102dc60105481565b34801561038e57600080fd5b5060405160098152602001610292565b3480156103aa57600080fd5b506102bb6103b93660046121f5565b610bcb565b3480156103ca57600080fd5b506102bb6103d9366004612221565b60116020526000908152604090205460ff1681565b3480156103fa57600080fd5b5061040e61040936600461227f565b610c01565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610292565b34801561045f57600080fd5b506102dc60135481565b34801561047557600080fd5b506102dc610484366004612221565b6001600160a01b031660009081526020819052604090205490565b3480156104ab57600080fd5b50610241610d55565b3480156104c057600080fd5b50610285610dc9565b3480156104d557600080fd5b506102dc600b5481565b3480156104eb57600080fd5b506102416104fa366004612221565b610e40565b34801561050b57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610292565b34801561053d57600080fd5b506102dc61054c366004612221565b610e8c565b34801561055d57600080fd5b50610285610e97565b34801561057257600080fd5b5061024161058136600461227f565b610ea6565b34801561059257600080fd5b506102bb6105a13660046121f5565b610eec565b3480156105b257600080fd5b506102dc6105c1366004612221565b610f3b565b3480156105d257600080fd5b506102bb6105e13660046121f5565b610f67565b3480156105f257600080fd5b506102dc610601366004612221565b6001600160a01b03166000908152600a602052604090205490565b34801561062857600080fd5b506102bb610637366004612169565b610f74565b34801561064857600080fd5b506102dc60145481565b34801561065e57600080fd5b506102dc61066d366004612298565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156106a457600080fd5b506102416106b33660046121f5565b611022565b3480156106c457600080fd5b506010546102dc565b3480156106d957600080fd5b506102416106e836600461227f565b61118c565b3480156106f957600080fd5b50610241610708366004612221565b6112fa565b34801561071957600080fd5b50600754610519906001600160a01b031681565b34801561073957600080fd5b50600654610519906001600160a01b031681565b34801561075957600080fd5b5061040e610768366004612221565b6113e5565b34801561077957600080fd5b5061078d61078836600461227f565b61154d565b60408051938452602084019290925290820152606001610292565b60006107b360025490565b116107bd57600080fd5b3415610839576107f06107cf60025490565b6107dd34600160801b61166a565b6107e791906122e7565b600854906116f3565b60085560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600b5461083590346116f3565b600b555b565b6005546001600160a01b0316331461086e5760405162461bcd60e51b815260040161086590612309565b60405180910390fd5b6001600160a01b03821660009081526011602052604090205481151560ff90911615150361089b57600080fd5b6001600160a01b0382166000908152601160205260409020805460ff191682151590811790915560010361094b576108d4826000611752565b60405163131836e760e21b8152600c60048201526001600160a01b038316602482015273a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb3990634c60db9c9060440160006040518083038186803b15801561092e57600080fd5b505af4158015610942573d6000803e3d6000fd5b50505050610a14565b6109738261096e846001600160a01b031660009081526020819052604090205490565b611752565b73a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb3963bc2b405c600c846109af816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152604482015260640160006040518083038186803b1580156109fb57600080fd5b505af4158015610a0f573d6000803e3d6000fd5b505050505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610a51911515815260200190565b60405180910390a25050565b606060038054610a6c9061233e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a989061233e565b8015610ae55780601f10610aba57610100808354040283529160200191610ae5565b820191906000526020600020905b815481529060010190602001808311610ac857829003601f168201915b5050505050905090565b6000610afc3384846117b7565b5060015b92915050565b6000610b138484846118db565b610b658433610b6085604051806060016040528060288152602001612763602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611937565b6117b7565b5060019392505050565b6001600160a01b03811660009081526009602090815260408083205491839052822054600854600160801b92610bc192610bbc92610bb691610bb1919061166a565b611971565b90611981565b6119bf565b610b0091906122e7565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610afc918590610b6090866116f3565b600080600080600080600080600c73a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb3963deb3d89690916040518263ffffffff1660e01b8152600401610c4991815260200190565b602060405180830381865af4158015610c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8a9190612378565b8910610caf575060009650600019955085945086935083925082915081905080610d4a565b6040516368d54f3f60e11b8152600c6004820152602481018a905260009073a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb399063d1aa9e7e90604401602060405180830381865af4158015610d09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2d9190612391565b9050610d38816113e5565b98509850985098509850985098509850505b919395975091939597565b6005546001600160a01b03163314610d7f5760405162461bcd60e51b815260040161086590612309565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b600754604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde039160048083019260009291908290030181865afa158015610e13573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e3b91908101906123f5565b905090565b6005546001600160a01b03163314610e6a5760405162461bcd60e51b815260040161086590612309565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b0082610f3b565b606060048054610a6c9061233e565b6005546001600160a01b03163314610ed05760405162461bcd60e51b815260040161086590612309565b610edc6009600a61256d565b610ee6908261257c565b60145550565b6000610afc3384610b608560405180606001604052806025815260200161278b602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611937565b6001600160a01b0381166000908152600a6020526040812054610b0090610f6184610b6f565b906119d2565b6000610afc3384846118db565b6005546000906001600160a01b03163314610fa15760405162461bcd60e51b815260040161086590612309565b6000610fac84611a14565b90508015611018576001600160a01b038416600081815260126020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092906110069085815260200190565b60405180910390a36001915050610b00565b5060009392505050565b6005546001600160a01b0316331461104c5760405162461bcd60e51b815260040161086590612309565b6001600160a01b03821660009081526011602052604090205460ff166111885760145481106110fd5761107f8282611752565b604051632f0ad01760e21b8152600c60048201526001600160a01b03831660248201526044810182905273a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb399063bc2b405c9060640160006040518083038186803b1580156110e057600080fd5b505af41580156110f4573d6000803e3d6000fd5b5050505061117b565b611108826000611752565b60405163131836e760e21b8152600c60048201526001600160a01b038316602482015273a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb3990634c60db9c9060440160006040518083038186803b15801561116257600080fd5b505af4158015611176573d6000803e3d6000fd5b505050505b611186826001610f74565b505b5050565b6005546001600160a01b031633146111b65760405162461bcd60e51b815260040161086590612309565b610e1081101580156111cb5750620151808111155b6112505760405162461bcd60e51b815260206004820152604a60248201527f555344545f4469766964656e645f547261636b65723a20636c61696d5761697460448201527f206d757374206265207570646174656420746f206265747765656e203120616e6064820152696420323420686f75727360b01b608482015260a401610865565b60135481036112c75760405162461bcd60e51b815260206004820152603c60248201527f555344545f4469766964656e645f547261636b65723a2043616e6e6f7420757060448201527f6461746520636c61696d5761697420746f2073616d652076616c7565000000006064820152608401610865565b60135460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601355565b6005546001600160a01b031633146113245760405162461bcd60e51b815260040161086590612309565b6001600160a01b0381166113895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610865565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6040516317e142d160e01b8152600c60048201526001600160a01b0382166024820152819060009081908190819081908190819073a3686b5fa3c5f6eb2da4a29a677d61a6ed62eb39906317e142d190604401602060405180830381865af4158015611455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114799190612378565b96506000199550600087126114db576010548711156114a7576010546114a0908890611caa565b95506114db565b601054600c54600091106114bc5760006114cb565b601054600c546114cb916119d2565b90506114d78189612593565b9650505b6114e488610f3b565b94506114ef88610b6f565b6001600160a01b038916600090815260126020526040902054909450925082611519576000611526565b60135461152690846125bb565b9150428211611536576000611540565b61154082426119d2565b9050919395975091939597565b600c546000908190819080820361156f57505060105460009250829150611663565b6010546000805a90506000805b898410801561158a57508582105b156116525784611599816125ce565b600c54909650861090506115ac57600094505b6000600c60000186815481106115c4576115c46125e7565b60009182526020808320909101546001600160a01b031680835260129091526040909120549091506115f590611ce7565b1561161857611605816001610f74565b156116185781611614816125ce565b9250505b82611622816125ce565b93505060005a9050808511156116495761163c85826119d2565b61164690876125bb565b95505b935061157c9050565b601085905590975095509193505050505b9193909250565b60008260000361167c57506000610b00565b6000611688838561257c565b90508261169585836122e7565b146116ec5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610865565b9392505050565b60008061170083856125bb565b9050838110156116ec5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610865565b6001600160a01b0382166000908152602081905260409020548082111561179157600061177f83836119d2565b905061178b8482611d0e565b50611186565b808210156111865760006117a582846119d2565b90506117b18482611d72565b50505050565b6001600160a01b0383166118195760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610865565b6001600160a01b03821661187a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610865565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602b60248201527f555344545f4469766964656e645f547261636b65723a204e6f207472616e736660448201526a195c9cc8185b1b1bddd95960aa1b6064820152608401610865565b6000818484111561195b5760405162461bcd60e51b815260040161086591906121c2565b50600061196884866125fd565b95945050505050565b60008181811215610b0057600080fd5b60008061198e8385612593565b9050600083121580156119a15750838112155b806119b657506000831280156119b657508381125b6116ec57600080fd5b6000808212156119ce57600080fd5b5090565b60006116ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611937565b600080611a2083610f3b565b90508015611ca1576001600160a01b0383166000908152600a6020526040902054611a4b90826116f3565b6001600160a01b0384166000818152600a6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d90611a9a9084815260200190565b60405180910390a2600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b199190612391565b6007546001600160a01b03908116911614611bf2576000611b3a8483611db6565b905080611bec576000846001600160a01b031683610bb890604051600060405180830381858888f193505050503d8060008114611b93576040519150601f19603f3d011682016040523d82523d6000602084013e611b98565b606091505b5050905080611bea576001600160a01b0385166000908152600a6020526040902054611bc490846119d2565b6001600160a01b039095166000908152600a602052604081209590955550929392505050565b505b50610b00565b6000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d8060008114611c44576040519150601f19603f3d011682016040523d82523d6000602084013e611c49565b606091505b5050905080611c9a576001600160a01b0384166000908152600a6020526040902054611c7590836119d2565b6001600160a01b039094166000908152600a6020526040812094909455509192915050565b5092915050565b50600092915050565b600080611cb78385612610565b905060008312158015611cca5750838113155b806119b657506000831280156119b657508381136116ec57600080fd5b600042821115611cf957506000919050565b601354611d0642846119d2565b101592915050565b611d188282611f33565b611d52611d33610bb18360085461166a90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611caa565b6001600160a01b0390921660009081526009602052604090209190915550565b611d7c828261202c565b611d52611d97610bb18360085461166a90919063ffffffff16565b6001600160a01b03841660009081526009602052604090205490611981565b604080516002808252606082018352600092839291906020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e489190612391565b81600081518110611e5b57611e5b6125e7565b6001600160a01b039283166020918202929092010152600754825191169082906001908110611e8c57611e8c6125e7565b6001600160a01b03928316602091820292909201015260065416637ff36ab58460008488611ebb4260026125bb565b6040518663ffffffff1660e01b8152600401611eda9493929190612630565b60006040518083038185885af193505050508015611f1a57506040513d6000823e601f3d908101601f19168201604052611f17919081019061269a565b60015b611f28576000915050610b00565b506001915050610b00565b6001600160a01b038216611f975760405162461bcd60e51b815260206004820152602560248201527f45524332303a206e657720746f6b656e7320746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610865565b611fa360008383611186565b600254611fb090826116f3565b6002556001600160a01b038216600090815260208190526040902054611fd690826116f3565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b03821661208c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610865565b61209882600083611186565b6120d581604051806060016040528060228152602001612741602291396001600160a01b0385166000908152602081905260409020549190611937565b6001600160a01b0383166000908152602081905260409020556002546120fb90826119d2565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612020565b6001600160a01b038116811461215157600080fd5b50565b8035801515811461216457600080fd5b919050565b6000806040838503121561217c57600080fd5b82356121878161213c565b915061219560208401612154565b90509250929050565b60005b838110156121b95781810151838201526020016121a1565b50506000910152565b60208152600082518060208401526121e181604085016020870161219e565b601f01601f19169190910160400192915050565b6000806040838503121561220857600080fd5b82356122138161213c565b946020939093013593505050565b60006020828403121561223357600080fd5b81356116ec8161213c565b60008060006060848603121561225357600080fd5b833561225e8161213c565b9250602084013561226e8161213c565b929592945050506040919091013590565b60006020828403121561229157600080fd5b5035919050565b600080604083850312156122ab57600080fd5b82356122b68161213c565b915060208301356122c68161213c565b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b60008261230457634e487b7160e01b600052601260045260246000fd5b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061235257607f821691505b60208210810361237257634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561238a57600080fd5b5051919050565b6000602082840312156123a357600080fd5b81516116ec8161213c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156123ed576123ed6123ae565b604052919050565b60006020828403121561240757600080fd5b815167ffffffffffffffff8082111561241f57600080fd5b818401915084601f83011261243357600080fd5b815181811115612445576124456123ae565b612458601f8201601f19166020016123c4565b915080825285602082850101111561246f57600080fd5b61248081602084016020860161219e565b50949350505050565b600181815b808511156124c45781600019048211156124aa576124aa6122d1565b808516156124b757918102915b93841c939080029061248e565b509250929050565b6000826124db57506001610b00565b816124e857506000610b00565b81600181146124fe576002811461250857612524565b6001915050610b00565b60ff841115612519576125196122d1565b50506001821b610b00565b5060208310610133831016604e8410600b8410161715612547575081810a610b00565b6125518383612489565b8060001904821115612565576125656122d1565b029392505050565b60006116ec60ff8416836124cc565b8082028115828204841417610b0057610b006122d1565b80820182811260008312801582168215821617156125b3576125b36122d1565b505092915050565b80820180821115610b0057610b006122d1565b6000600182016125e0576125e06122d1565b5060010190565b634e487b7160e01b600052603260045260246000fd5b81810381811115610b0057610b006122d1565b8181036000831280158383131683831282161715611c9a57611c9a6122d1565b600060808201868352602060808185015281875180845260a086019150828901935060005b8181101561267a5784516001600160a01b031683529383019391830191600101612655565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083850312156126ad57600080fd5b825167ffffffffffffffff808211156126c557600080fd5b818501915085601f8301126126d957600080fd5b8151818111156126eb576126eb6123ae565b8060051b91506126fc8483016123c4565b818152918301840191848101908884111561271657600080fd5b938501935b838510156127345784518252938501939085019061271b565b9897505050505050505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122051b28a4c13c7255c8ea54ca334f72461e27e557ba878d517f4dc7abab70287f864736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806375f0a87411610175578063ad56c13c116100dc578063dd62ed3e11610095578063f27fd2541161006f578063f27fd2541461090a578063f2fde38b1461092a578063f66895a31461094a578063f887ea401461096957600080fd5b8063dd62ed3e1461088f578063e01af92c146108d5578063e7841ec0146108f557600080fd5b8063ad56c13c1461077a578063afa4f3b2146107df578063b62496f5146107ff578063c02466681461082f578063c3e0f5cf1461084f578063c492f0461461086f57600080fd5b80639c1b8af51161012e5780639c1b8af5146106cf5780639d7ceafb146106e5578063a26579ad14610705578063a457c2d71461071a578063a8b9d2401461073a578063a9059cbb1461075a57600080fd5b806375f0a8741461061757806385141a7714610637578063854c84dc1461064d578063864701a5146106625780638da5cb5b1461069c57806395d89b41146106ba57600080fd5b806330bb4cff116102345780634fbee193116101ed5780636843cd84116101c75780636843cd841461058c578063700bb191146105ac57806370a08231146105cc578063715018a61461060257600080fd5b80634fbee1931461051e5780635960e46d1461055757806364b0f6531461057757600080fd5b806330bb4cff14610477578063313ce5671461048c57806339509351146104a85780634830aa17146104c85780634ada218b146104e85780634e71d92d1461050957600080fd5b80630f4bc27c116102865780630f4bc27c146103ab57806318160ddd146103cb5780631870517a146103ea57806320800a001461040a57806323b872dd1461041f5780632c1f52161461043f57600080fd5b80630483f7a0146102d957806306fdde03146102fb5780630861837514610326578063087332141461033b578063095ea7b31461035b5780630bc229441461038b57600080fd5b366102d457005b600080fd5b3480156102e557600080fd5b506102f96102f43660046128e8565b610989565b005b34801561030757600080fd5b50610310610a27565b60405161031d9190612945565b60405180910390f35b34801561033257600080fd5b506102f9610ab9565b34801561034757600080fd5b506102f9610356366004612978565b610b56565b34801561036757600080fd5b5061037b6103763660046129a4565b610c11565b604051901515815260200161031d565b34801561039757600080fd5b506102f96103a63660046129d0565b610c28565b3480156103b757600080fd5b506102f96103c63660046129d0565b610cb4565b3480156103d757600080fd5b506002545b60405190815260200161031d565b3480156103f657600080fd5b506102f9610405366004612978565b610da9565b34801561041657600080fd5b506102f9610e07565b34801561042b57600080fd5b5061037b61043a3660046129e9565b610e22565b34801561044b57600080fd5b5060095461045f906001600160a01b031681565b6040516001600160a01b03909116815260200161031d565b34801561048357600080fd5b506103dc610e8b565b34801561049857600080fd5b506040516009815260200161031d565b3480156104b457600080fd5b5061037b6104c33660046129a4565b610efe565b3480156104d457600080fd5b506102f96104e3366004612a2a565b610f34565b3480156104f457600080fd5b5060075461037b90600160b01b900460ff1681565b34801561051557600080fd5b506102f961104c565b34801561052a57600080fd5b5061037b610539366004612a2a565b6001600160a01b031660009081526016602052604090205460ff1690565b34801561056357600080fd5b506102f96105723660046129d0565b6110c1565b34801561058357600080fd5b506103dc611203565b34801561059857600080fd5b506103dc6105a7366004612a2a565b61124d565b3480156105b857600080fd5b506102f96105c73660046129d0565b6112bd565b3480156105d857600080fd5b506103dc6105e7366004612a2a565b6001600160a01b031660009081526020819052604090205490565b34801561060e57600080fd5b506102f961138f565b34801561062357600080fd5b50600a5461045f906001600160a01b031681565b34801561064357600080fd5b5061045f61dead81565b34801561065957600080fd5b50610310611403565b34801561066e57600080fd5b50600d54600e54600f5461068192919083565b6040805193845260208401929092529082015260600161031d565b3480156106a857600080fd5b506005546001600160a01b031661045f565b3480156106c657600080fd5b50610310611475565b3480156106db57600080fd5b506103dc60135481565b3480156106f157600080fd5b506102f96107003660046129d0565b611484565b34801561071157600080fd5b506103dc6114df565b34801561072657600080fd5b5061037b6107353660046129a4565b611529565b34801561074657600080fd5b506103dc610755366004612a2a565b611578565b34801561076657600080fd5b5061037b6107753660046129a4565b6115ab565b34801561078657600080fd5b5061079a610795366004612a2a565b6115b8565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161031d565b3480156107eb57600080fd5b506102f96107fa3660046129d0565b611653565b34801561080b57600080fd5b5061037b61081a366004612a2a565b60176020526000908152604090205460ff1681565b34801561083b57600080fd5b506102f961084a3660046128e8565b6116f9565b34801561085b57600080fd5b506102f961086a366004612a2a565b611805565b34801561087b57600080fd5b506102f961088a366004612a47565b611990565b34801561089b57600080fd5b506103dc6108aa366004612acd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108e157600080fd5b506102f96108f0366004612afb565b611a6c565b34801561090157600080fd5b506103dc611ab4565b34801561091657600080fd5b5061079a6109253660046129d0565b611afe565b34801561093657600080fd5b506102f9610945366004612a2a565b611b40565b34801561095657600080fd5b5060105460115460125461068192919083565b34801561097557600080fd5b5060065461045f906001600160a01b031681565b6005546001600160a01b031633146109bc5760405162461bcd60e51b81526004016109b390612b18565b60405180910390fd5b60095460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610a0b57600080fd5b505af1158015610a1f573d6000803e3d6000fd5b505050505050565b606060038054610a3690612b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6290612b4d565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6005546001600160a01b03163314610ae35760405162461bcd60e51b81526004016109b390612b18565b600754600160b01b900460ff1615610b3d5760405162461bcd60e51b815260206004820152601a60248201527f54726164696e6720697320616c726561647920656e61626c656400000000000060448201526064016109b3565b6007805460ff60b01b1916600160b01b17905543600855565b6005546001600160a01b03163314610b805760405162461bcd60e51b81526004016109b390612b18565b604080516060810182528481526020810184905201819052601083905560118290556012819055602881610bb48486612b9d565b610bbe9190612b9d565b1115610c0c5760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420343025206f72206c65737300000060448201526064016109b3565b505050565b6000610c1e338484611c2b565b5060015b92915050565b6005546001600160a01b03163314610c525760405162461bcd60e51b81526004016109b390612b18565b60095460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c7906024015b600060405180830381600087803b158015610c9957600080fd5b505af1158015610cad573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610cde5760405162461bcd60e51b81526004016109b390612b18565b600754600160b01b900460ff1615610d465760405162461bcd60e51b815260206004820152602560248201527f43616e2774206368616e6765207768656e2074726164696e6720686173207374604482015264185c9d195960da1b60648201526084016109b3565b60038110610da45760405162461bcd60e51b815260206004820152602560248201527f446561646c696e652073686f756c64206265206c657373207468616e203320426044820152646c6f636b7360d81b60648201526084016109b3565b601455565b6005546001600160a01b03163314610dd35760405162461bcd60e51b81526004016109b390612b18565b604080516060810182528481526020810184905201819052600d839055600e829055600f819055602881610bb48486612b9d565b600a544790610e1f906001600160a01b031682611d50565b50565b6000610e2f848484611e69565b610e818433610e7c85604051806060016040528060288152602001612f52602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906123b7565b611c2b565b5060019392505050565b600954604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef99190612bb0565b905090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c1e918590610e7c90866123f1565b6005546001600160a01b03163314610f5e5760405162461bcd60e51b81526004016109b390612b18565b306001600160a01b03821603610fc55760405162461bcd60e51b815260206004820152602660248201527f46656520416464726573732063616e6e6f7420626520436f6e7472616374204160448201526564647265737360d01b60648201526084016109b3565b6001600160a01b0381166110265760405162461bcd60e51b815260206004820152602260248201527f46656520416464726573732063616e6e6f74206265207a65726f206164647265604482015261737360f01b60648201526084016109b3565b600a80546001600160a01b0319166001600160a01b038316179055610e1f8160016116f9565b60095460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561109d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1f9190612bc9565b6005546001600160a01b031633146110eb5760405162461bcd60e51b81526004016109b390612b18565b62030d40811015801561110157506207a1208111155b61116a5760405162461bcd60e51b815260206004820152603460248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b60648201526084016109b3565b60135481036111d05760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b60648201526084016109b3565b60135460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601355565b600954604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b6009546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c229190612bb0565b6009546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113349190612be6565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146113b95760405162461bcd60e51b81526004016109b390612b18565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60095460408051632153213760e21b815290516060926001600160a01b03169163854c84dc9160048083019260009291908290030181865afa15801561144d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ef99190810190612c2a565b606060048054610a3690612b4d565b6005546001600160a01b031633146114ae5760405162461bcd60e51b81526004016109b390612b18565b600954604051639d7ceafb60e01b8152600481018390526001600160a01b0390911690639d7ceafb90602401610c7f565b60095460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b6000610c1e3384610e7c85604051806060016040528060258152602001612f7a602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906123b7565b6009546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161127c565b6000610c1e338484611e69565b60095460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116389190612cd7565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b0316331461167d5760405162461bcd60e51b81526004016109b390612b18565b60648110156116e55760405162461bcd60e51b815260206004820152602e60248201527f616d6f756e74206d7573742062652067726561746572207468616e206f72206560448201526d7175616c20746f20302e3030312560901b60648201526084016109b3565b6116f381633b9aca00612d41565b600b5550565b6005546001600160a01b031633146117235760405162461bcd60e51b81526004016109b390612b18565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036117a65760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e7420697320616c7265616479207468652076616c7565206f6620604482015269276578636c756465642760b01b60648201526084016109b3565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461182f5760405162461bcd60e51b81526004016109b390612b18565b306001600160a01b038216036118a65760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016109b3565b600a546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa1580156118f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191d9190612bb0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190612bc9565b5050565b6005546001600160a01b031633146119ba5760405162461bcd60e51b81526004016109b390612b18565b60005b82811015611a2b5781601660008686858181106119dc576119dc612d58565b90506020020160208101906119f19190612a2a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2381612d6e565b9150506119bd565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051611a5f93929190612d87565b60405180910390a1505050565b6005546001600160a01b03163314611a965760405162461bcd60e51b81526004016109b390612b18565b60078054911515600160a81b0260ff60a81b19909216919091179055565b6009546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610ed5573d6000803e3d6000fd5b600954604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016115f6565b6005546001600160a01b03163314611b6a5760405162461bcd60e51b81526004016109b390612b18565b6001600160a01b038116611bcf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109b3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611c8d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109b3565b6001600160a01b038216611cee5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109b3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b80471015611da05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016109b3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ded576040519150601f19603f3d011682016040523d82523d6000602084013e611df2565b606091505b5050905080610c0c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016109b3565b6001600160a01b038316611e8f5760405162461bcd60e51b81526004016109b390612de0565b6001600160a01b038216611eb55760405162461bcd60e51b81526004016109b390612e25565b6001600160a01b03831660009081526016602052604090205460ff16158015611ef757506001600160a01b03821660009081526016602052604090205460ff16155b15611f4957600754600160b01b900460ff16611f495760405162461bcd60e51b815260206004820152601160248201527054726164696e67206e6f2061637469766560781b60448201526064016109b3565b80600003611f5d57610c0c83836000612457565b30600090815260208190526040812054600b5460125460115460105493949285101593611f8a9190612b9d565b611f949190612b9d565b9050818015611fad5750600754600160a01b900460ff16155b8015611fc25750600754600160a81b900460ff165b8015611fe757506001600160a01b03861660009081526017602052604090205460ff16155b801561200c57506001600160a01b03861660009081526016602052604090205460ff16155b801561203157506001600160a01b03851660009081526016602052604090205460ff16155b15612069576007805460ff60a01b1916600160a01b179055801561205b5761205b600b5482612560565b6007805460ff60a01b191690555b6007546001600160a01b03871660009081526016602052604090205460ff600160a01b9092048216159116806120b757506001600160a01b03861660009081526016602052604090205460ff165b156120c0575060005b80156121bb5760006014546008546120d89190612b9d565b6001600160a01b03881660009081526017602052604081205443929092111592509060ff168015612107575081155b156121295760646121188589612d41565b6121229190612e68565b90506121a1565b6001600160a01b03891660009081526017602052604090205460ff16801561214f575081155b1561217e57600f54600e54600d546064929161216a91612b9d565b6121749190612b9d565b6121189089612d41565b81156121a1576064601554886121949190612d41565b61219e9190612e68565b90505b6121ab8188612e8a565b96506121b8893083612457565b50505b6121c6878787612457565b6009546001600160a01b031663e30443bc886121f7816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561223d57600080fd5b505af192505050801561224e575060015b506009546001600160a01b031663e30443bc87612280816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156122c657600080fd5b505af19250505080156122d7575060015b50600754600160a01b900460ff166123ae576013546009546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612356575060408051601f3d908101601f1916820190925261235391810190612be6565b60015b156123ac5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b50505050505050565b600081848411156123db5760405162461bcd60e51b81526004016109b39190612945565b5060006123e88486612e8a565b95945050505050565b6000806123fe8385612b9d565b9050838110156124505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016109b3565b9392505050565b6001600160a01b03831661247d5760405162461bcd60e51b81526004016109b390612de0565b6001600160a01b0382166124a35760405162461bcd60e51b81526004016109b390612e25565b6124e081604051806060016040528060268152602001612f2c602691396001600160a01b03861660009081526020819052604090205491906123b7565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461250f90826123f1565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611d43565b600061256d826002612d41565b9050600081601060020154856125839190612d41565b61258d9190612e68565b9050600061259b8286612e8a565b9050476125a7826126f6565b60006125b38247612e8a565b6012549091506000906125c69087612e8a565b6125d09083612e68565b6012549091506000906125e39083612d41565b905080156125f5576125f5868261281a565b601154600090612606846002612d41565b6126109190612d41565b9050801561262e57600a5461262e906001600160a01b031682611d50565b60105460009061263f856002612d41565b6126499190612d41565b905080156126e9576009546040516000916001600160a01b03169083908381818185875af1925050503d806000811461269e576040519150601f19603f3d011682016040523d82523d6000602084013e6126a3565b606091505b5050905080156126e757604080518d8152602081018490527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b5050505050505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061272b5761272b612d58565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612784573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a89190612e9d565b816001815181106127bb576127bb612d58565b6001600160a01b0392831660209182029290920101526006546127e19130911684611c2b565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906109f1908590600090869030904290600401612eba565b6006546128329030906001600160a01b031684611c2b565b60065460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af11580156128a0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610cad9190612be6565b6001600160a01b0381168114610e1f57600080fd5b8015158114610e1f57600080fd5b600080604083850312156128fb57600080fd5b8235612906816128c5565b91506020830135612916816128da565b809150509250929050565b60005b8381101561293c578181015183820152602001612924565b50506000910152565b6020815260008251806020840152612964816040850160208701612921565b601f01601f19169190910160400192915050565b60008060006060848603121561298d57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156129b757600080fd5b82356129c2816128c5565b946020939093013593505050565b6000602082840312156129e257600080fd5b5035919050565b6000806000606084860312156129fe57600080fd5b8335612a09816128c5565b92506020840135612a19816128c5565b929592945050506040919091013590565b600060208284031215612a3c57600080fd5b8135612450816128c5565b600080600060408486031215612a5c57600080fd5b833567ffffffffffffffff80821115612a7457600080fd5b818601915086601f830112612a8857600080fd5b813581811115612a9757600080fd5b8760208260051b8501011115612aac57600080fd5b60209283019550935050840135612ac2816128da565b809150509250925092565b60008060408385031215612ae057600080fd5b8235612aeb816128c5565b91506020830135612916816128c5565b600060208284031215612b0d57600080fd5b8135612450816128da565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b6157607f821691505b602082108103612b8157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c2257610c22612b87565b600060208284031215612bc257600080fd5b5051919050565b600060208284031215612bdb57600080fd5b8151612450816128da565b600080600060608486031215612bfb57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612c3c57600080fd5b815167ffffffffffffffff80821115612c5457600080fd5b818401915084601f830112612c6857600080fd5b815181811115612c7a57612c7a612c14565b604051601f8201601f19908116603f01168101908382118183101715612ca257612ca2612c14565b81604052828152876020848701011115612cbb57600080fd5b612ccc836020830160208801612921565b979650505050505050565b600080600080600080600080610100898b031215612cf457600080fd5b8851612cff816128c5565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b8082028115828204841417610c2257610c22612b87565b634e487b7160e01b600052603260045260246000fd5b600060018201612d8057612d80612b87565b5060010190565b6040808252810183905260008460608301825b86811015612dca578235612dad816128c5565b6001600160a01b0316825260209283019290910190600101612d9a565b5080925050508215156020830152949350505050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b600082612e8557634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610c2257610c22612b87565b600060208284031215612eaf57600080fd5b8151612450816128c5565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612f0a5784516001600160a01b031683529383019391830191600101612ee5565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a2a613a00667b7f7d401213d5dd4d078816a5c4865467ba47ba943de5138c60b64736f6c63430008130033

Libraries Used

IterableMapping : 0xa3686b5fa3c5f6eb2da4a29a677d61a6ed62eb39Unverified

Deployed Bytecode Sourcemap

34954:14507:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39314:149;;;;;;;;;;-1:-1:-1;39314:149:0;;;;;:::i;:::-;;:::i;:::-;;4550:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40663:199;;;;;;;;;;;;;:::i;40282:262::-;;;;;;;;;;-1:-1:-1;40282:262:0;;;;;:::i;:::-;;:::i;6716:169::-;;;;;;;;;;-1:-1:-1;6716:169:0;;;;;:::i;:::-;;:::i;:::-;;;2122:14:1;;2115:22;2097:41;;2085:2;2070:18;6716:169:0;1957:187:1;42437:121:0;;;;;;;;;;-1:-1:-1;42437:121:0;;;;;:::i;:::-;;:::i;40870:267::-;;;;;;;;;;-1:-1:-1;40870:267:0;;;;;:::i;:::-;;:::i;5669:108::-;;;;;;;;;;-1:-1:-1;5757:12:0;;5669:108;;;2480:25:1;;;2468:2;2453:18;5669:108:0;2334:177:1;40014:260:0;;;;;;;;;;-1:-1:-1;40014:260:0;;;;;:::i;:::-;;:::i;38437:148::-;;;;;;;;;;;;;:::i;7367:355::-;;;;;;;;;;-1:-1:-1;7367:355:0;;;;;:::i;:::-;;:::i;35259:43::-;;;;;;;;;;-1:-1:-1;35259:43:0;;;;-1:-1:-1;;;;;35259:43:0;;;;;;-1:-1:-1;;;;;3178:32:1;;;3160:51;;3148:2;3133:18;35259:43:0;2977:240:1;42683:141:0;;;;;;;;;;;;;:::i;5512:92::-;;;;;;;;;;-1:-1:-1;5512:92:0;;5595:1;3364:36:1;;3352:2;3337:18;5512:92:0;3222:184:1;8131:218:0;;;;;;;;;;-1:-1:-1;8131:218:0;;;;;:::i;:::-;;:::i;39471:324::-;;;;;;;;;;-1:-1:-1;39471:324:0;;;;;:::i;:::-;;:::i;35177:34::-;;;;;;;;;;-1:-1:-1;35177:34:0;;;;-1:-1:-1;;;35177:34:0;;;;;;38032:103;;;;;;;;;;;;;:::i;42832:126::-;;;;;;;;;;-1:-1:-1;42832:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;42922:28:0;42898:4;42922:28;;;:19;:28;;;;;;;;;42832:126;41941:437;;;;;;;;;;-1:-1:-1;41941:437:0;;;;;:::i;:::-;;:::i;44283:142::-;;;;;;;;;;;;;:::i;43270:139::-;;;;;;;;;;-1:-1:-1;43270:139:0;;;;;:::i;:::-;;:::i;37650:374::-;;;;;;;;;;-1:-1:-1;37650:374:0;;;;;:::i;:::-;;:::i;5840:127::-;;;;;;;;;;-1:-1:-1;5840:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;5941:18:0;5914:7;5941:18;;;;;;;;;;;;5840:127;20510:148;;;;;;;;;;;;;:::i;35401:75::-;;;;;;;;;;-1:-1:-1;35401:75:0;;;;-1:-1:-1;;;;;35401:75:0;;;35315:79;;;;;;;;;;;;35352:42;35315:79;;43126:136;;;;;;;;;;;;;:::i;35697:39::-;;;;;;;;;;-1:-1:-1;35697:39:0;;;;;;;;;;;;;;;;4073:25:1;;;4129:2;4114:18;;4107:34;;;;4157:18;;;4150:34;4061:2;4046:18;35697:39:0;3871:319:1;19868:79:0;;;;;;;;;;-1:-1:-1;19933:6:0;;-1:-1:-1;;;;;19933:6:0;19868:79;;4769:104;;;;;;;;;;;;;:::i;35792:40::-;;;;;;;;;;;;;;;;41145:138;;;;;;;;;;-1:-1:-1;41145:138:0;;;;;:::i;:::-;;:::i;42566:109::-;;;;;;;;;;;;;:::i;8852:269::-;;;;;;;;;;-1:-1:-1;8852:269:0;;;;;:::i;:::-;;:::i;42966:152::-;;;;;;;;;;-1:-1:-1;42966:152:0;;;;;:::i;:::-;;:::i;6180:175::-;;;;;;;;;;-1:-1:-1;6180:175:0;;;;;:::i;:::-;;:::i;43417:351::-;;;;;;;;;;-1:-1:-1;43417:351:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4552:32:1;;;4534:51;;4616:2;4601:18;;4594:34;;;;4644:18;;;4637:34;;;;4702:2;4687:18;;4680:34;;;;4745:3;4730:19;;4723:35;4572:3;4774:19;;4767:35;4833:3;4818:19;;4811:35;4877:3;4862:19;;4855:35;4521:3;4506:19;43417:351:0;4195:701:1;39803:203:0;;;;;;;;;;-1:-1:-1;39803:203:0;;;;;:::i;:::-;;:::i;35981:57::-;;;;;;;;;;-1:-1:-1;35981:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;38593:327;;;;;;;;;;-1:-1:-1;38593:327:0;;;;;:::i;:::-;;:::i;38143:286::-;;;;;;;;;;-1:-1:-1;38143:286:0;;;;;:::i;:::-;;:::i;38928:326::-;;;;;;;;;;-1:-1:-1;38928:326:0;;;;;:::i;:::-;;:::i;6418:151::-;;;;;;;;;;-1:-1:-1;6418:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;6534:18:0;;;6507:7;6534:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6418:151;40552:99;;;;;;;;;;-1:-1:-1;40552:99:0;;;;;:::i;:::-;;:::i;44145:130::-;;;;;;;;;;;;;:::i;43776:361::-;;;;;;;;;;-1:-1:-1;43776:361:0;;;;;:::i;:::-;;:::i;20813:244::-;;;;;;;;;;-1:-1:-1;20813:244:0;;;;;:::i;:::-;;:::i;35743:40::-;;;;;;;;;;-1:-1:-1;35743:40:0;;;;;;;;;;;;35053:22;;;;;;;;;;-1:-1:-1;35053:22:0;;;;-1:-1:-1;;;;;35053:22:0;;;39314:149;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;;;;;;;;;39403:15:::1;::::0;:52:::1;::::0;-1:-1:-1;;;39403:52:0;;-1:-1:-1;;;;;7066:32:1;;;39403:52:0::1;::::0;::::1;7048:51:1::0;7142:14;;7135:22;7115:18;;;7108:50;39403:15:0;;::::1;::::0;:36:::1;::::0;7021:18:1;;39403:52:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39314:149:::0;;:::o;4550:100::-;4604:13;4637:5;4630:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4550:100;:::o;40663:199::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;40734:14:::1;::::0;-1:-1:-1;;;40734:14:0;::::1;;;40733:15;40725:54;;;::::0;-1:-1:-1;;;40725:54:0;;7756:2:1;40725:54:0::1;::::0;::::1;7738:21:1::0;7795:2;7775:18;;;7768:30;7834:28;7814:18;;;7807:56;7880:18;;40725:54:0::1;7554:350:1::0;40725:54:0::1;40790:14;:21:::0;;-1:-1:-1;;;;40790:21:0::1;-1:-1:-1::0;;;40790:21:0::1;::::0;;40842:12:::1;40822:17;:32:::0;40663:199::o;40282:262::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;40402:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;40390:9:::1;:50:::0;;;;;;;;;;;40500:2:::1;40429:10:::0;40460:20:::1;40418:9:::0;40408:8;40460:20:::1;:::i;:::-;:34;;;;:::i;:::-;40459:43;;40451:85;;;::::0;-1:-1:-1;;;40451:85:0;;8373:2:1;40451:85:0::1;::::0;::::1;8355:21:1::0;8412:2;8392:18;;;8385:30;8451:31;8431:18;;;8424:59;8500:18;;40451:85:0::1;8171:353:1::0;40451:85:0::1;40282:262:::0;;;:::o;6716:169::-;6799:4;6816:39;174:10;6839:7;6848:6;6816:8;:39::i;:::-;-1:-1:-1;6873:4:0;6716:169;;;;;:::o;42437:121::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;42508:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;42508:42:0;;::::1;::::0;::::1;2480:25:1::0;;;-1:-1:-1;;;;;42508:15:0;;::::1;::::0;:31:::1;::::0;2453:18:1;;42508:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42437:121:::0;:::o;40870:267::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;40954:14:::1;::::0;-1:-1:-1;;;40954:14:0;::::1;;;40953:15;40945:65;;;::::0;-1:-1:-1;;;40945:65:0;;8731:2:1;40945:65:0::1;::::0;::::1;8713:21:1::0;8770:2;8750:18;;;8743:30;8809:34;8789:18;;;8782:62;-1:-1:-1;;;8860:18:1;;;8853:35;8905:19;;40945:65:0::1;8529:401:1::0;40945:65:0::1;41046:1;41029:14;:18;41021:67;;;::::0;-1:-1:-1;;;41021:67:0;;9137:2:1;41021:67:0::1;::::0;::::1;9119:21:1::0;9176:2;9156:18;;;9149:30;9215:34;9195:18;;;9188:62;-1:-1:-1;;;9266:18:1;;;9259:35;9311:19;;41021:67:0::1;8935:401:1::0;41021:67:0::1;41099:13;:30:::0;40870:267::o;40014:260::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;40132:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;40121:8:::1;:49:::0;;;;;;;;;;;40230:2:::1;40159:10:::0;40190:20:::1;40148:9:::0;40138:8;40190:20:::1;:::i;38437:148::-:0;38539:15;;38499:21;;38531:46;;-1:-1:-1;;;;;38539:15:0;38499:21;38531:34;:46::i;:::-;38467:118;38437:148::o;7367:355::-;7507:4;7524:36;7534:6;7542:9;7553:6;7524:9;:36::i;:::-;7571:121;7580:6;174:10;7602:89;7640:6;7602:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7602:19:0;;;;;;:11;:19;;;;;;;;174:10;7602:33;;;;;;;;;;:37;:89::i;:::-;7571:8;:121::i;:::-;-1:-1:-1;7710:4:0;7367:355;;;;;:::o;42683:141::-;42773:15;;:43;;;-1:-1:-1;;;42773:43:0;;;;42746:7;;-1:-1:-1;;;;;42773:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42766:50;;42683:141;:::o;8131:218::-;174:10;8219:4;8268:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8268:34:0;;;;;;;;;;8219:4;;8236:83;;8259:7;;8268:50;;8307:10;8268:38;:50::i;39471:324::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;39579:4:::1;-1:-1:-1::0;;;;;39558:26:0;::::1;::::0;39550:77:::1;;;::::0;-1:-1:-1;;;39550:77:0;;9732:2:1;39550:77:0::1;::::0;::::1;9714:21:1::0;9771:2;9751:18;;;9744:30;9810:34;9790:18;;;9783:62;-1:-1:-1;;;9861:18:1;;;9854:36;9907:19;;39550:77:0::1;9530:402:1::0;39550:77:0::1;-1:-1:-1::0;;;;;39646:23:0;::::1;39638:69;;;::::0;-1:-1:-1;;;39638:69:0;;10139:2:1;39638:69:0::1;::::0;::::1;10121:21:1::0;10178:2;10158:18;;;10151:30;10217:34;10197:18;;;10190:62;-1:-1:-1;;;10268:18:1;;;10261:32;10310:19;;39638:69:0::1;9937:398:1::0;39638:69:0::1;39718:15;:27:::0;;-1:-1:-1;;;;;;39718:27:0::1;-1:-1:-1::0;;;;;39718:27:0;::::1;;::::0;;39755:32:::1;39718:27:::0;-1:-1:-1;39755:15:0::1;:32::i;38032:103::-:0;38069:15;;:58;;-1:-1:-1;;;38069:58:0;;38108:10;38069:58;;;7048:51:1;38069:15:0;7115:18:1;;;7108:50;-1:-1:-1;;;;;38069:15:0;;;;:30;;7021:18:1;;38069:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41941:437::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;42039:6:::1;42027:8;:18;;:40;;;;;42061:6;42049:8;:18;;42027:40;42018:128;;;::::0;-1:-1:-1;;;42018:128:0;;11097:2:1;42018:128:0::1;::::0;::::1;11079:21:1::0;11136:2;11116:18;;;11109:30;11175:34;11155:18;;;11148:62;-1:-1:-1;;;11226:18:1;;;11219:50;11286:19;;42018:128:0::1;10895:416:1::0;42018:128:0::1;42177:16;;42165:8;:28:::0;42157:108:::1;;;::::0;-1:-1:-1;;;42157:108:0;;11518:2:1;42157:108:0::1;::::0;::::1;11500:21:1::0;11557:2;11537:18;;;11530:30;11596:34;11576:18;;;11569:62;-1:-1:-1;;;11647:18:1;;;11640:42;11699:19;;42157:108:0::1;11316:408:1::0;42157:108:0::1;42315:16;::::0;42281:51:::1;::::0;42305:8;;42281:51:::1;::::0;;;::::1;42343:16;:27:::0;41941:437::o;44283:142::-;44376:15;;:41;;;-1:-1:-1;;;44376:41:0;;;;44349:7;;-1:-1:-1;;;;;44376:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;43270:139;43367:15;;:34;;-1:-1:-1;;;43367:34:0;;-1:-1:-1;;;;;3178:32:1;;;43367:34:0;;;3160:51:1;43340:7:0;;43367:15;;:25;;3133:18:1;;43367:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37650:374::-;37782:15;;:42;;-1:-1:-1;;;;;;37782:42:0;;;;;2480:25:1;;;37716:18:0;;;;;;-1:-1:-1;;;;;37782:15:0;;:37;;2453:18:1;;37782:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37840:176;;;12271:25:1;;;12327:2;12312:18;;12305:34;;;12355:18;;;12348:34;;;12413:2;12398:18;;12391:34;;;37715:109:0;;-1:-1:-1;37715:109:0;;-1:-1:-1;37715:109:0;-1:-1:-1;37996:9:0;;37958:5;;37840:176;;12258:3:1;12243:19;37840:176:0;;;;;;;37704:320;;;37650:374;:::o;20510:148::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;20601:6:::1;::::0;20580:40:::1;::::0;20617:1:::1;::::0;-1:-1:-1;;;;;20601:6:0::1;::::0;20580:40:::1;::::0;20617:1;;20580:40:::1;20631:6;:19:::0;;-1:-1:-1;;;;;;20631:19:0::1;::::0;;20510:148::o;43126:136::-;43215:15;;:39;;;-1:-1:-1;;;43215:39:0;;;;43182:13;;-1:-1:-1;;;;;43215:15:0;;:37;;:39;;;;;:15;;:39;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43215:39:0;;;;;;;;;;;;:::i;4769:104::-;4825:13;4858:7;4851:14;;;;;:::i;41145:138::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;41226:15:::1;::::0;:49:::1;::::0;-1:-1:-1;;;41226:49:0;;::::1;::::0;::::1;2480:25:1::0;;;-1:-1:-1;;;;;41226:15:0;;::::1;::::0;:41:::1;::::0;2453:18:1;;41226:49:0::1;2334:177:1::0;42566:109:0;42640:15;;:27;;;-1:-1:-1;;;42640:27:0;;;;42613:7;;-1:-1:-1;;;;;42640:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;8852:269;8945:4;8962:129;174:10;8985:7;8994:96;9033:15;8994:96;;;;;;;;;;;;;;;;;174:10;8994:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8994:34:0;;;;;;;;;;;;:38;:96::i;42966:152::-;43063:15;;:47;;-1:-1:-1;;;43063:47:0;;-1:-1:-1;;;;;3178:32:1;;;43063:47:0;;;3160:51:1;43036:7:0;;43063:15;;:38;;3133:18:1;;43063:47:0;2977:240:1;6180:175:0;6266:4;6283:42;174:10;6307:9;6318:6;6283:9;:42::i;43417:351::-;43725:15;;:35;;-1:-1:-1;;;43725:35:0;;-1:-1:-1;;;;;3178:32:1;;;43725:35:0;;;3160:51:1;43531:7:0;;;;;;;;;;;;;;;;43725:15;;;:26;;3133:18:1;;43725:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43718:42;;;;;;;;;;;;;;;;43417:351;;;;;;;;;:::o;39803:203::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;39898:3:::1;39888:6;:13;;39880:72;;;::::0;-1:-1:-1;;;39880:72:0;;14358:2:1;39880:72:0::1;::::0;::::1;14340:21:1::0;14397:2;14377:18;;;14370:30;14436:34;14416:18;;;14409:62;-1:-1:-1;;;14487:18:1;;;14480:44;14541:19;;39880:72:0::1;14156:410:1::0;39880:72:0::1;39984:14;:6:::0;39993:5:::1;39984:14;:::i;:::-;39963:18;:35:::0;-1:-1:-1;39803:203:0:o;38593:327::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38700:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;38678:132:::1;;;::::0;-1:-1:-1;;;38678:132:0;;14946:2:1;38678:132:0::1;::::0;::::1;14928:21:1::0;14985:2;14965:18;;;14958:30;15024:34;15004:18;;;14997:62;-1:-1:-1;;;15075:18:1;;;15068:40;15125:19;;38678:132:0::1;14744:406:1::0;38678:132:0::1;-1:-1:-1::0;;;;;38821:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;38821:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38878:34;;2097:41:1;;;38878:34:0::1;::::0;2070:18:1;38878:34:0::1;;;;;;;38593:327:::0;;:::o;38143:286::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;38254:4:::1;-1:-1:-1::0;;;;;38230:29:0;::::1;::::0;38222:96:::1;;;::::0;-1:-1:-1;;;38222:96:0;;15357:2:1;38222:96:0::1;::::0;::::1;15339:21:1::0;15396:2;15376:18;;;15369:30;15435:34;15415:18;;;15408:62;-1:-1:-1;;;15486:18:1;;;15479:52;15548:19;;38222:96:0::1;15155:418:1::0;38222:96:0::1;38359:15;::::0;38375:45:::1;::::0;-1:-1:-1;;;38375:45:0;;38414:4:::1;38375:45;::::0;::::1;3160:51:1::0;-1:-1:-1;;;;;38329:29:0;;::::1;::::0;::::1;::::0;38359:15;::::1;::::0;38329:29;;38375:30:::1;::::0;3133:18:1;;38375:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38329:92;::::0;-1:-1:-1;;;;;;38329:92:0::1;::::0;;;;;;-1:-1:-1;;;;;15770:32:1;;;38329:92:0::1;::::0;::::1;15752:51:1::0;15819:18;;;15812:34;15725:18;;38329:92:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38143:286:::0;:::o;38928:326::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;39069:9:::1;39064:116;39084:19:::0;;::::1;39064:116;;;39160:8;39125:19;:32;39145:8;;39154:1;39145:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39125:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;39125:32:0;:43;;-1:-1:-1;;39125:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;39105:3;::::1;::::0;::::1;:::i;:::-;;;;39064:116;;;;39195:51;39227:8;;39237;39195:51;;;;;;;;:::i;:::-;;;;;;;;38928:326:::0;;;:::o;40552:99::-;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;40621:11:::1;:22:::0;;;::::1;;-1:-1:-1::0;;;40621:22:0::1;-1:-1:-1::0;;;;40621:22:0;;::::1;::::0;;;::::1;::::0;;40552:99::o;44145:130::-;44228:15;;:39;;;-1:-1:-1;;;44228:39:0;;;;44201:7;;-1:-1:-1;;;;;44228:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;43776:361;44089:15;;:40;;-1:-1:-1;;;44089:40:0;;;;;2480:25:1;;;43895:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44089:15:0;;;;:33;;2453:18:1;;44089:40:0;2334:177:1;20813:244:0;20080:6;;-1:-1:-1;;;;;20080:6:0;174:10;20080:22;20072:67;;;;-1:-1:-1;;;20072:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20902:22:0;::::1;20894:73;;;::::0;-1:-1:-1;;;20894:73:0;;17130:2:1;20894:73:0::1;::::0;::::1;17112:21:1::0;17169:2;17149:18;;;17142:30;17208:34;17188:18;;;17181:62;-1:-1:-1;;;17259:18:1;;;17252:36;17305:19;;20894:73:0::1;16928:402:1::0;20894:73:0::1;21004:6;::::0;20983:38:::1;::::0;-1:-1:-1;;;;;20983:38:0;;::::1;::::0;21004:6:::1;::::0;20983:38:::1;::::0;21004:6:::1;::::0;20983:38:::1;21032:6;:17:::0;;-1:-1:-1;;;;;;21032:17:0::1;-1:-1:-1::0;;;;;21032:17:0;;;::::1;::::0;;;::::1;::::0;;20813:244::o;11978:380::-;-1:-1:-1;;;;;12114:19:0;;12106:68;;;;-1:-1:-1;;;12106:68:0;;17537:2:1;12106:68:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;-1:-1:-1;;;17666:18:1;;;17659:34;17710:19;;12106:68:0;17335:400:1;12106:68:0;-1:-1:-1;;;;;12193:21:0;;12185:68;;;;-1:-1:-1;;;12185:68:0;;17942:2:1;12185:68:0;;;17924:21:1;17981:2;17961:18;;;17954:30;18020:34;18000:18;;;17993:62;-1:-1:-1;;;18071:18:1;;;18064:32;18113:19;;12185:68:0;17740:398:1;12185:68:0;-1:-1:-1;;;;;12266:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12318:32;;2480:25:1;;;12318:32:0;;2453:18:1;12318:32:0;;;;;;;;11978:380;;;:::o;34628:319::-;34743:6;34718:21;:31;;34710:73;;;;-1:-1:-1;;;34710:73:0;;18345:2:1;34710:73:0;;;18327:21:1;18384:2;18364:18;;;18357:30;18423:31;18403:18;;;18396:59;18472:18;;34710:73:0;18143:353:1;34710:73:0;34797:12;34815:9;-1:-1:-1;;;;;34815:14:0;34838:6;34815:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34796:54;;;34869:7;34861:78;;;;-1:-1:-1;;;34861:78:0;;18913:2:1;34861:78:0;;;18895:21:1;18952:2;18932:18;;;18925:30;18991:34;18971:18;;;18964:62;19062:28;19042:18;;;19035:56;19108:19;;34861:78:0;18711:422:1;44433:2949:0;-1:-1:-1;;;;;44565:18:0;;44557:68;;;;-1:-1:-1;;;44557:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44644:16:0;;44636:64;;;;-1:-1:-1;;;44636:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44718:25:0;;;;;;:19;:25;;;;;;;;44717:26;:54;;;;-1:-1:-1;;;;;;44748:23:0;;;;;;:19;:23;;;;;;;;44747:24;44717:54;44713:135;;;44800:14;;-1:-1:-1;;;44800:14:0;;;;44792:44;;;;-1:-1:-1;;;44792:44:0;;20150:2:1;44792:44:0;;;20132:21:1;20189:2;20169:18;;;20162:30;-1:-1:-1;;;20208:18:1;;;20201:47;20265:18;;44792:44:0;19948:341:1;44792:44:0;44871:6;44881:1;44871:11;44867:93;;44899:28;44915:4;44921:2;44925:1;44899:15;:28::i;44867:93::-;45021:4;44972:28;5941:18;;;;;;;;;;;45077;;45192:19;;45157;;45192:9;45124:17;5941:18;;45053:42;;;;;45124:52;;45157:19;45124:52;:::i;:::-;:87;;;;:::i;:::-;45106:105;;45243:7;:33;;;;-1:-1:-1;45268:8:0;;-1:-1:-1;;;45268:8:0;;;;45267:9;45243:33;:61;;;;-1:-1:-1;45293:11:0;;-1:-1:-1;;;45293:11:0;;;;45243:61;:110;;;;-1:-1:-1;;;;;;45322:31:0;;;;;;:25;:31;;;;;;;;45321:32;45243:110;:153;;;;-1:-1:-1;;;;;;45371:25:0;;;;;;:19;:25;;;;;;;;45370:26;45243:153;:194;;;;-1:-1:-1;;;;;;45414:23:0;;;;;;:19;:23;;;;;;;;45413:24;45243:194;45225:410;;;45464:8;:15;;-1:-1:-1;;;;45464:15:0;-1:-1:-1;;;45464:15:0;;;45500:11;;45496:95;;45532:43;45547:18;;45567:7;45532:14;:43::i;:::-;45607:8;:16;;-1:-1:-1;;;;45607:16:0;;;45225:410;45663:8;;-1:-1:-1;;;;;45688:25:0;;45647:12;45688:25;;;:19;:25;;;;;;45663:8;-1:-1:-1;;;45663:8:0;;;;;45662:9;;45688:25;;:52;;-1:-1:-1;;;;;;45717:23:0;;;;;;:19;:23;;;;;;;;45688:52;45684:100;;;-1:-1:-1;45767:5:0;45684:100;45802:7;45798:815;;;45826:17;45882:13;;45862:17;;:33;;;;:::i;:::-;-1:-1:-1;;;;;45958:29:0;;45910:15;45958:29;;;:25;:29;;;;;;45846:12;:49;;;;;;-1:-1:-1;45910:15:0;45958:29;;:46;;;;;45992:12;45991:13;45958:46;45954:532;;;46056:3;46036:16;46045:7;46036:6;:16;:::i;:::-;46035:24;;;;:::i;:::-;46025:34;;45954:532;;;-1:-1:-1;;;;;46099:31:0;;;;;;:25;:31;;;;;;;;:48;;;;;46135:12;46134:13;46099:48;46095:391;;;46333:18;;46283;;46333:8;46235:16;46357:3;;46333:18;46235:66;;;:::i;:::-;:116;;;;:::i;:::-;46200:153;;:6;:153;:::i;46095:391::-;46400:12;46396:90;;;46466:3;46453:9;;46444:6;:18;;;;:::i;:::-;46443:26;;;;:::i;:::-;46433:36;;46396:90;46523:18;46533:7;46523:6;:18;:::i;:::-;46514:27;;46556:45;46572:4;46586;46593:7;46556:15;:45::i;:::-;45811:802;;45798:815;46633:33;46649:4;46655:2;46659:6;46633:15;:33::i;:::-;46691:15;;-1:-1:-1;;;;;46691:15:0;:26;46718:4;46724:15;46718:4;-1:-1:-1;;;;;5941:18:0;5914:7;5941:18;;;;;;;;;;;;5840:127;46724:15;46691:49;;-1:-1:-1;;;;;;46691:49:0;;;;;;;-1:-1:-1;;;;;15770:32:1;;;46691:49:0;;;15752:51:1;15819:18;;;15812:34;15725:18;;46691:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46687:65;46766:15;;-1:-1:-1;;;;;46766:15:0;:26;46793:2;46797:13;46793:2;-1:-1:-1;;;;;5941:18:0;5914:7;5941:18;;;;;;;;;;;;5840:127;46797:13;46766:45;;-1:-1:-1;;;;;;46766:45:0;;;;;;;-1:-1:-1;;;;;15770:32:1;;;46766:45:0;;;15752:51:1;15819:18;;;15812:34;15725:18;;46766:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46762:61;46840:8;;-1:-1:-1;;;46840:8:0;;;;46835:540;;46879:16;;46916:15;;:28;;-1:-1:-1;;;;;;46916:28:0;;;;;2480:25:1;;;-1:-1:-1;;;;;46916:15:0;;;;:23;;2453:18:1;;46916:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;46916:28:0;;;;;;;;-1:-1:-1;;46916:28:0;;;;;;;;;;;;:::i;:::-;;;46912:452;;;47108:231;;;12271:25:1;;;12327:2;12312:18;;12305:34;;;12355:18;;;12348:34;;;12413:2;12398:18;;12391:34;;;47311:9:0;;47258:4;;47108:231;;12258:3:1;12243:19;47108:231:0;;;;;;;46945:410;;;46912:452;46850:525;46835:540;44546:2836;;;;44433:2949;;;:::o;13664:192::-;13750:7;13786:12;13778:6;;;;13770:29;;;;-1:-1:-1;;;13770:29:0;;;;;;;;:::i;:::-;-1:-1:-1;13810:9:0;13822:5;13826:1;13822;:5;:::i;:::-;13810:17;13664:192;-1:-1:-1;;;;;13664:192:0:o;12761:181::-;12819:7;;12851:5;12855:1;12851;:5;:::i;:::-;12839:17;;12880:1;12875;:6;;12867:46;;;;-1:-1:-1;;;12867:46:0;;20851:2:1;12867:46:0;;;20833:21:1;20890:2;20870:18;;;20863:30;20929:29;20909:18;;;20902:57;20976:18;;12867:46:0;20649:351:1;12867:46:0;12933:1;12761:181;-1:-1:-1;;;12761:181:0:o;9611:573::-;-1:-1:-1;;;;;9751:20:0;;9743:70;;;;-1:-1:-1;;;9743:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9832:23:0;;9824:71;;;;-1:-1:-1;;;9824:71:0;;;;;;;:::i;:::-;9988;10010:6;9988:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9988:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;9968:17:0;;;:9;:17;;;;;;;;;;;:91;;;;10093:20;;;;;;;:32;;10118:6;10093:24;:32::i;:::-;-1:-1:-1;;;;;10070:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;10141:35;2480:25:1;;;10070:20:0;;10141:35;;;;;;2453:18:1;10141:35:0;2334:177:1;47390:1179:0;47466:19;47488:11;:7;47498:1;47488:11;:::i;:::-;47466:33;;47510:32;47578:11;47555:9;:19;;;47546:6;:28;;;;:::i;:::-;47545:44;;;;:::i;:::-;47510:79;-1:-1:-1;47600:14:0;47617:33;47510:79;47617:6;:33;:::i;:::-;47600:50;-1:-1:-1;47686:21:0;47720:24;47600:50;47720:16;:24::i;:::-;47757:20;47780:38;47804:14;47780:21;:38;:::i;:::-;47881:19;;47757:61;;-1:-1:-1;47829:19:0;;47867:33;;:11;:33;:::i;:::-;47851:50;;:12;:50;:::i;:::-;47958:19;;47829:72;;-1:-1:-1;47912:29:0;;47944:33;;47829:72;47944:33;:::i;:::-;47912:65;-1:-1:-1;47992:25:0;;47988:119;;48034:61;48047:24;48073:21;48034:12;:61::i;:::-;48164:19;;48117:26;;48146:15;:11;48160:1;48146:15;:::i;:::-;:37;;;;:::i;:::-;48117:66;-1:-1:-1;48198:22:0;;48194:109;;48245:15;;48237:54;;-1:-1:-1;;;;;48245:15:0;48272:18;48237:34;:54::i;:::-;48351:9;:17;48313;;48333:15;:11;48347:1;48333:15;:::i;:::-;:35;;;;:::i;:::-;48313:55;-1:-1:-1;48383:13:0;;48379:183;;48440:15;;48432:53;;48414:12;;-1:-1:-1;;;;;48440:15:0;;48470:9;;48414:12;48432:53;48414:12;48432:53;48470:9;48440:15;48432:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48413:72;;;48504:7;48500:50;;;48518:32;;;21179:25:1;;;21235:2;21220:18;;21213:34;;;48518:32:0;;21152:18:1;48518:32:0;;;;;;;48500:50;48398:164;48379:183;47455:1114;;;;;;;;;47390:1179;;:::o;48577:472::-;48667:16;;;48681:1;48667:16;;;;;;;;48643:21;;48667:16;;;;;;;;;;-1:-1:-1;48667:16:0;48643:40;;48712:4;48694;48699:1;48694:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48694:23:0;;;:7;;;;;;;;;;:23;;;;48738:6;;:13;;;-1:-1:-1;;;48738:13:0;;;;:6;;;;;:11;;:13;;;;;48694:7;;48738:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48728:4;48733:1;48728:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48728:23:0;;;:7;;;;;;;;;:23;48794:6;;48762:53;;48779:4;;48794:6;48803:11;48762:8;:53::i;:::-;48826:6;;:215;;-1:-1:-1;;;48826:215:0;;-1:-1:-1;;;;;48826:6:0;;;;:57;;:215;;48898:11;;48826:6;;48968:4;;48995;;49015:15;;48826:215;;;:::i;49057:401::-;49170:6;;49138:53;;49155:4;;-1:-1:-1;;;;;49170:6:0;49179:11;49138:8;:53::i;:::-;49202:6;;:248;;-1:-1:-1;;;49202:248:0;;49267:4;49202:248;;;22840:34:1;22890:18;;;22883:34;;;49202:6:0;22933:18:1;;;22926:34;;;22976:18;;;22969:34;35352:42:0;23019:19:1;;;23012:44;49424:15:0;23072:19:1;;;23065:35;-1:-1:-1;;;;;49202:6:0;;;;:22;;49233:9;;22774:19:1;;49202:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:1;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:250::-;745:1;755:113;769:6;766:1;763:13;755:113;;;845:11;;;839:18;826:11;;;819:39;791:2;784:10;755:113;;;-1:-1:-1;;902:1:1;884:16;;877:27;660:250::o;915:396::-;1064:2;1053:9;1046:21;1027:4;1096:6;1090:13;1139:6;1134:2;1123:9;1119:18;1112:34;1155:79;1227:6;1222:2;1211:9;1207:18;1202:2;1194:6;1190:15;1155:79;:::i;:::-;1295:2;1274:15;-1:-1:-1;;1270:29:1;1255:45;;;;1302:2;1251:54;;915:396;-1:-1:-1;;915:396:1:o;1316:316::-;1393:6;1401;1409;1462:2;1450:9;1441:7;1437:23;1433:32;1430:52;;;1478:1;1475;1468:12;1430:52;-1:-1:-1;;1501:23:1;;;1571:2;1556:18;;1543:32;;-1:-1:-1;1622:2:1;1607:18;;;1594:32;;1316:316;-1:-1:-1;1316:316:1:o;1637:315::-;1705:6;1713;1766:2;1754:9;1745:7;1741:23;1737:32;1734:52;;;1782:1;1779;1772:12;1734:52;1821:9;1808:23;1840:31;1865:5;1840:31;:::i;:::-;1890:5;1942:2;1927:18;;;;1914:32;;-1:-1:-1;;;1637:315:1:o;2149:180::-;2208:6;2261:2;2249:9;2240:7;2236:23;2232:32;2229:52;;;2277:1;2274;2267:12;2229:52;-1:-1:-1;2300:23:1;;2149:180;-1:-1:-1;2149:180:1:o;2516:456::-;2593:6;2601;2609;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;2717:9;2704:23;2736:31;2761:5;2736:31;:::i;:::-;2786:5;-1:-1:-1;2843:2:1;2828:18;;2815:32;2856:33;2815:32;2856:33;:::i;:::-;2516:456;;2908:7;;-1:-1:-1;;;2962:2:1;2947:18;;;;2934:32;;2516:456::o;3411:247::-;3470:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:52;;;3539:1;3536;3529:12;3491:52;3578:9;3565:23;3597:31;3622:5;3597:31;:::i;4901:750::-;4993:6;5001;5009;5062:2;5050:9;5041:7;5037:23;5033:32;5030:52;;;5078:1;5075;5068:12;5030:52;5118:9;5105:23;5147:18;5188:2;5180:6;5177:14;5174:34;;;5204:1;5201;5194:12;5174:34;5242:6;5231:9;5227:22;5217:32;;5287:7;5280:4;5276:2;5272:13;5268:27;5258:55;;5309:1;5306;5299:12;5258:55;5349:2;5336:16;5375:2;5367:6;5364:14;5361:34;;;5391:1;5388;5381:12;5361:34;5446:7;5439:4;5429:6;5426:1;5422:14;5418:2;5414:23;5410:34;5407:47;5404:67;;;5467:1;5464;5457:12;5404:67;5498:4;5490:13;;;;-1:-1:-1;5522:6:1;-1:-1:-1;;5563:20:1;;5550:34;5593:28;5550:34;5593:28;:::i;:::-;5640:5;5630:15;;;4901:750;;;;;:::o;5656:388::-;5724:6;5732;5785:2;5773:9;5764:7;5760:23;5756:32;5753:52;;;5801:1;5798;5791:12;5753:52;5840:9;5827:23;5859:31;5884:5;5859:31;:::i;:::-;5909:5;-1:-1:-1;5966:2:1;5951:18;;5938:32;5979:33;5938:32;5979:33;:::i;6049:241::-;6105:6;6158:2;6146:9;6137:7;6133:23;6129:32;6126:52;;;6174:1;6171;6164:12;6126:52;6213:9;6200:23;6232:28;6254:5;6232:28;:::i;6519:356::-;6721:2;6703:21;;;6740:18;;;6733:30;6799:34;6794:2;6779:18;;6772:62;6866:2;6851:18;;6519:356::o;7169:380::-;7248:1;7244:12;;;;7291;;;7312:61;;7366:4;7358:6;7354:17;7344:27;;7312:61;7419:2;7411:6;7408:14;7388:18;7385:38;7382:161;;7465:10;7460:3;7456:20;7453:1;7446:31;7500:4;7497:1;7490:15;7528:4;7525:1;7518:15;7382:161;;7169:380;;;:::o;7909:127::-;7970:10;7965:3;7961:20;7958:1;7951:31;8001:4;7998:1;7991:15;8025:4;8022:1;8015:15;8041:125;8106:9;;;8127:10;;;8124:36;;;8140:18;;:::i;9341:184::-;9411:6;9464:2;9452:9;9443:7;9439:23;9435:32;9432:52;;;9480:1;9477;9470:12;9432:52;-1:-1:-1;9503:16:1;;9341:184;-1:-1:-1;9341:184:1:o;10645:245::-;10712:6;10765:2;10753:9;10744:7;10740:23;10736:32;10733:52;;;10781:1;10778;10771:12;10733:52;10813:9;10807:16;10832:28;10854:5;10832:28;:::i;11729:306::-;11817:6;11825;11833;11886:2;11874:9;11865:7;11861:23;11857:32;11854:52;;;11902:1;11899;11892:12;11854:52;11931:9;11925:16;11915:26;;11981:2;11970:9;11966:18;11960:25;11950:35;;12025:2;12014:9;12010:18;12004:25;11994:35;;11729:306;;;;;:::o;12436:127::-;12497:10;12492:3;12488:20;12485:1;12478:31;12528:4;12525:1;12518:15;12552:4;12549:1;12542:15;12568:897;12648:6;12701:2;12689:9;12680:7;12676:23;12672:32;12669:52;;;12717:1;12714;12707:12;12669:52;12750:9;12744:16;12779:18;12820:2;12812:6;12809:14;12806:34;;;12836:1;12833;12826:12;12806:34;12874:6;12863:9;12859:22;12849:32;;12919:7;12912:4;12908:2;12904:13;12900:27;12890:55;;12941:1;12938;12931:12;12890:55;12970:2;12964:9;12992:2;12988;12985:10;12982:36;;;12998:18;;:::i;:::-;13073:2;13067:9;13041:2;13127:13;;-1:-1:-1;;13123:22:1;;;13147:2;13119:31;13115:40;13103:53;;;13171:18;;;13191:22;;;13168:46;13165:72;;;13217:18;;:::i;:::-;13257:10;13253:2;13246:22;13292:2;13284:6;13277:18;13332:7;13327:2;13322;13318;13314:11;13310:20;13307:33;13304:53;;;13353:1;13350;13343:12;13304:53;13366:68;13431:2;13426;13418:6;13414:15;13409:2;13405;13401:11;13366:68;:::i;:::-;13453:6;12568:897;-1:-1:-1;;;;;;;12568:897:1:o;13470:681::-;13601:6;13609;13617;13625;13633;13641;13649;13657;13710:3;13698:9;13689:7;13685:23;13681:33;13678:53;;;13727:1;13724;13717:12;13678:53;13759:9;13753:16;13778:31;13803:5;13778:31;:::i;:::-;13828:5;13818:15;;;13873:2;13862:9;13858:18;13852:25;13842:35;;13917:2;13906:9;13902:18;13896:25;13886:35;;13961:2;13950:9;13946:18;13940:25;13930:35;;14005:3;13994:9;13990:19;13984:26;13974:36;;14050:3;14039:9;14035:19;14029:26;14019:36;;14095:3;14084:9;14080:19;14074:26;14064:36;;14140:3;14129:9;14125:19;14119:26;14109:36;;13470:681;;;;;;;;;;;:::o;14571:168::-;14644:9;;;14675;;14692:15;;;14686:22;;14672:37;14662:71;;14713:18;;:::i;15857:127::-;15918:10;15913:3;15909:20;15906:1;15899:31;15949:4;15946:1;15939:15;15973:4;15970:1;15963:15;15989:135;16028:3;16049:17;;;16046:43;;16069:18;;:::i;:::-;-1:-1:-1;16116:1:1;16105:13;;15989:135::o;16129:794::-;16351:2;16363:21;;;16336:18;;16419:22;;;16303:4;16498:6;16472:2;16457:18;;16303:4;16532:304;16546:6;16543:1;16540:13;16532:304;;;16621:6;16608:20;16641:31;16666:5;16641:31;:::i;:::-;-1:-1:-1;;;;;16697:31:1;16685:44;;16752:4;16811:15;;;;16776:12;;;;16725:1;16561:9;16532:304;;;16536:3;16853;16845:11;;;;16908:6;16901:14;16894:22;16887:4;16876:9;16872:20;16865:52;16129:794;;;;;;:::o;19138:401::-;19340:2;19322:21;;;19379:2;19359:18;;;19352:30;19418:34;19413:2;19398:18;;19391:62;-1:-1:-1;;;19484:2:1;19469:18;;19462:35;19529:3;19514:19;;19138:401::o;19544:399::-;19746:2;19728:21;;;19785:2;19765:18;;;19758:30;19824:34;19819:2;19804:18;;19797:62;-1:-1:-1;;;19890:2:1;19875:18;;19868:33;19933:3;19918:19;;19544:399::o;20294:217::-;20334:1;20360;20350:132;;20404:10;20399:3;20395:20;20392:1;20385:31;20439:4;20436:1;20429:15;20467:4;20464:1;20457:15;20350:132;-1:-1:-1;20496:9:1;;20294:217::o;20516:128::-;20583:9;;;20604:11;;;20601:37;;;20618:18;;:::i;21258:251::-;21328:6;21381:2;21369:9;21360:7;21356:23;21352:32;21349:52;;;21397:1;21394;21387:12;21349:52;21429:9;21423:16;21448:31;21473:5;21448:31;:::i;21514:980::-;21776:4;21824:3;21813:9;21809:19;21855:6;21844:9;21837:25;21881:2;21919:6;21914:2;21903:9;21899:18;21892:34;21962:3;21957:2;21946:9;21942:18;21935:31;21986:6;22021;22015:13;22052:6;22044;22037:22;22090:3;22079:9;22075:19;22068:26;;22129:2;22121:6;22117:15;22103:29;;22150:1;22160:195;22174:6;22171:1;22168:13;22160:195;;;22239:13;;-1:-1:-1;;;;;22235:39:1;22223:52;;22330:15;;;;22295:12;;;;22271:1;22189:9;22160:195;;;-1:-1:-1;;;;;;;22411:32:1;;;;22406:2;22391:18;;22384:60;-1:-1:-1;;;22475:3:1;22460:19;22453:35;22372:3;21514:980;-1:-1:-1;;;21514:980:1:o

Swarm Source

ipfs://51b28a4c13c7255c8ea54ca334f72461e27e557ba878d517f4dc7abab70287f8
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.