ETH Price: $3,316.10 (-3.40%)

Token

BayBlade (Bayblade)
 

Overview

Max Total Supply

1,000,000,000,000,000 Bayblade

Holders

27

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
760,000,000,000 Bayblade

Value
$0.00
0x9f31a75f3a9c8399529fcd420c79196277eebcba
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:
BayBlade

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-01
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;


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

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

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

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

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

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

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

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

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

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

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

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

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

/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface DividendPayingTokenOptionalInterface {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

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

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

/// @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);

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

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

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

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

/**
 * @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);
    }
}

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

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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_) public {
        _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 18;
    }

    /**
     * @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);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

    /**
     * @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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

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

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



// pragma solidity >=0.6.2;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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 () public {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
///  to token holders as dividends and allows token holders to withdraw their dividends.
///  Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

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

  uint256 internal magnifiedDividendPerShare;

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

  uint256 public totalDividendsDistributed;

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

  }

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

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

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

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

      return _withdrawableDividend;
    }

    return 0;
  }


  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) 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);
  }

  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(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 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}




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

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool private swapping;

    BaybladeDividendTracker public dividendTracker;

    address public liquidityWallet;

    uint256 public maxSellTransactionAmount = 5000000000000 * (10**18);
    uint256 public swapTokensAtAmount = 2000000000000 * (10**18);

    uint256 public immutable ETHRewardsFee;
    uint256 public immutable liquidityFee;
    uint256 public immutable totalFees;
    address payable public devWallet = 0x43AFe97160ce3043fF69e1B728e26F1F8eb391CA;

    // sells have fees of 12 and 6 (10 * 1.2 and 5 * 1.2)
    uint256 public immutable sellFeeIncreaseFactor = 120; 

    // use by default 300,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 300000;


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

    // addresses that can make transfers before presale is over
    mapping (address => bool) private canTransferBeforeTradingIsEnabled;


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

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

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

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


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

    event LiquidityWalletUpdated(address indexed newLiquidityWallet, address indexed oldLiquidityWallet);

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


    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived
    );

    event SendDividends(
    	uint256 tokensSwapped,
    	uint256 amount
    );

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

    constructor() public ERC20("BayBlade", "Bayblade") {
        uint256 _ETHRewardsFee = 4;
        uint256 _liquidityFee = 20;

        ETHRewardsFee = _ETHRewardsFee;
        liquidityFee = _liquidityFee;
        totalFees = _ETHRewardsFee.add(_liquidityFee);


    	dividendTracker = new BaybladeDividendTracker();

    	liquidityWallet = owner();

    	
    	IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);


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

        // exclude from paying fees or having max transaction amount
        excludeFromFees(liquidityWallet, true);
        excludeFromFees(address(this), true);

        // enable owner and fixed-sale wallet to send tokens before presales are over
        canTransferBeforeTradingIsEnabled[owner()] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 1000000000000000 * (10**18));
    }

    receive() external payable {

  	}

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

        BaybladeDividendTracker newDividendTracker = BaybladeDividendTracker(payable(newAddress));

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

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

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(newAddress != address(uniswapV2Router), "The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }
    
    function sendETHToDevWallet(uint256 amount) private { 
        swapTokensForEth(amount); 
        devWallet.transfer(address(this).balance); 
    }
    
    function setDevWallet(address payable newAddress) external onlyOwner {
        devWallet = newAddress;
    }
    
    function changeMaxSellLimit(uint256 newSellLimit) external onlyOwner {
        maxSellTransactionAmount = newSellLimit * (10**18);
    }

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

        emit ExcludeFromFees(account, excluded);
    }
    
    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }
    
    

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

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }


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

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

    function updateClaimWait(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 isExcludedFromDividends(address account) public view returns(bool) {
        return dividendTracker.excludedFromDividends(account);
    }

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

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

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

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

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

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

    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(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        

        if( 
        	!swapping &&
            automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair
        	from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromFees[to] && //no max for those excluded from fees
            !_isExcludedFromFees[liquidityWallet]
        ) {
            require(amount <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellTransactionAmount.");
        }

		uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

            uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            swapping = false;
        }


        bool takeFee = !swapping; 

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

        if(takeFee) {
        	uint256 fees = amount.mul(totalFees).div(100);

            // if sell, multiply by 1.2
            if(automatedMarketMakerPairs[to]) {
                fees = fees.mul(sellFeeIncreaseFactor).div(100);
            }

        	amount = amount.sub(fees);

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

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

        if(!swapping) {
	    	uint256 gas = gasForProcessing;

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

	    	}
        }
    }

    function swapAndLiquify(uint256 tokens) private {
        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

         
        sendETHToDevWallet(tokens);
        
        emit SwapAndLiquify(tokens, newBalance); 
    }

    function swapTokensForEth(uint256 tokenAmount) private {

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForEth(tokens);
        uint256 dividends = address(this).balance;
        (bool success,) = address(dividendTracker).call{value: dividends}("");

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

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

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;

    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public  minimumTokenBalanceForDividends;

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

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

    constructor() public DividendPayingToken("Bayblade_Dividend_Tracker", "Bayblade_Dividend_Tracker") {
    	claimWait = 3600;
        minimumTokenBalanceForDividends = 1000000000000 * (10**18); 
    }

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

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

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

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

    	emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3600 && newClaimWait <= 86400, "Bayblade_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "TIKI_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 getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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


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


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

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

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

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

    	processAccount(account, true);
    }

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

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

    	uint256 _lastProcessedIndex = lastProcessedIndex;

    	uint256 gasUsed = 0;

    	uint256 gasLeft = gasleft();

    	uint256 iterations = 0;
    	uint256 claims = 0;

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

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

    		address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

    		iterations++;

    		uint256 newGasLeft = gasleft();

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

    		gasLeft = newGasLeft;
    	}

    	lastProcessedIndex = _lastProcessedIndex;

    	return (iterations, claims, lastProcessedIndex);
    }

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

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

    	return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"ETHRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"changeMaxSellLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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 BaybladeDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeeIncreaseFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","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"}]

6101206040526c3f1bdf10116048a593400000006009556c193e5939a08ce9dbd480000000600a557343afe97160ce3043ff69e1b728e26f1f8eb391ca600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550607861010090815250620493e0600c553480156200009957600080fd5b506040518060400160405280600881526020017f426179426c6164650000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f426179626c61646500000000000000000000000000000000000000000000000081525081600390805190602001906200011e92919062000fc4565b5080600490805190602001906200013792919062000fc4565b50505060006200014c6200090460201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600490506000601490508160a081815250508060c081815250506200022181836200090c60201b62003c0d1790919060201c565b60e0818152505060405162000236906200104b565b604051809103906000f08015801562000253573d6000803e3d6000fd5b50600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002a46200099560201b60201c565b600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d905060008173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034657600080fd5b505afa1580156200035b573d6000803e3d6000fd5b505050506040513d60208110156200037257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003e657600080fd5b505afa158015620003fb573d6000803e3d6000fd5b505050506040513d60208110156200041257600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200048d57600080fd5b505af1158015620004a2573d6000803e3d6000fd5b505050506040513d6020811015620004b957600080fd5b8101908080519060200190929190505050905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505062000557816001620009bf60201b60201c565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015620006aa57600080fd5b505af1158015620006bf573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0620007116200099560201b60201c565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200075e57600080fd5b505af115801562000773573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156200080357600080fd5b505af115801562000818573d6000803e3d6000fd5b5050505062000851600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600162000bb860201b60201c565b6200086430600162000bb860201b60201c565b6001600e60006200087a6200099560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620008fa620008df6200099560201b60201c565b6d314dc6448d9338c15b0a0000000062000de160201b60201c565b5050505062001078565b600033905090565b6000808284019050838110156200098b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141562000a6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806200a12d6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550801562000b6e57600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801562000b5457600080fd5b505af115801562000b69573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b62000bc86200090460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000c8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141562000d36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806200a0f96034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b62000e996000838362000fbf60201b60201c565b62000eb5816002546200090c60201b62003c0d1790919060201c565b60028190555062000f13816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200090c60201b62003c0d1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200100757805160ff191683800117855562001038565b8280016001018555821562001038579182015b82811115620010375782518255916020019190600101906200101a565b5b50905062001047919062001059565b5090565b613869806200689083390190565b5b80821115620010745760008160009055506001016200105a565b5090565b60805160601c60a05160c05160e051610100516157bc620010d4600039806115855280614516525080611423528061430b528061447c5250806129ce528061432f5250806128b852508061197e5280612abc52506157bc6000f3fe6080604052600436106102cd5760003560e01c806388bdd9be11610175578063ad56c13c116100dc578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec014611130578063e98030c71461115b578063f27fd25414611196578063f2fde38b1461122c576102d4565b8063dd62ed3e1461102f578063e2f45605146110b4578063e37ba8f9146110df576102d4565b8063ad56c13c14610d85578063b62496f514610e31578063c024666814610e98578063c492f04614610ef5578063c705c56914610f87578063d469801614610fee576102d4565b80639a7a23d61161012e5780639a7a23d614610b8b5780639c1b8af514610be8578063a26579ad14610c13578063a457c2d714610c3e578063a8b9d24014610caf578063a9059cbb14610d14576102d4565b806388bdd9be146109d25780638c0344db14610a235780638da5cb5b14610a4e5780638ea5220f14610a8f57806395d89b4114610ad057806398118cb414610b60576102d4565b8063313ce5671161023457806364b0f653116101ed578063700bb191116101c7578063700bb191146108e057806370a082311461091b578063715018a614610980578063871c128d14610997576102d4565b806364b0f653146107ff57806365b8dbc01461082a5780636843cd841461087b576102d4565b8063313ce5671461065057806331e79db01461067e57806339509351146106cf57806349bd5a5e146107405780634e71d92d146107815780634fbee19314610798576102d4565b806318160ddd1161028657806318160ddd146104ac5780631f53ac02146104d757806322bd3f7f1461052857806323b872dd146105535780632c1f5216146105e457806330bb4cff14610625576102d4565b806302259e9e146102d9578063065af77a1461030457806306fdde031461033f578063095ea7b3146103cf57806313114a9d146104405780631694505e1461046b576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee61127d565b6040518082815260200191505060405180910390f35b34801561031057600080fd5b5061033d6004803603602081101561032757600080fd5b8101908080359060200190929190505050611283565b005b34801561034b57600080fd5b50610354611361565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610394578082015181840152602081019050610379565b50505050905090810190601f1680156103c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103db57600080fd5b50610428600480360360408110156103f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611403565b60405180821515815260200191505060405180910390f35b34801561044c57600080fd5b50610455611421565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b50610480611445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b857600080fd5b506104c161146b565b6040518082815260200191505060405180910390f35b3480156104e357600080fd5b50610526600480360360208110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611475565b005b34801561053457600080fd5b5061053d611583565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b506105cc6004803603606081101561057657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a7565b60405180821515815260200191505060405180910390f35b3480156105f057600080fd5b506105f9611680565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063157600080fd5b5061063a6116a6565b6040518082815260200191505060405180910390f35b34801561065c57600080fd5b50610665611750565b604051808260ff16815260200191505060405180910390f35b34801561068a57600080fd5b506106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611759565b005b3480156106db57600080fd5b50610728600480360360408110156106f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b60405180821515815260200191505060405180910390f35b34801561074c57600080fd5b5061075561197c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561078d57600080fd5b506107966119a0565b005b3480156107a457600080fd5b506107e7600480360360208110156107bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a74565b60405180821515815260200191505060405180910390f35b34801561080b57600080fd5b50610814611aca565b6040518082815260200191505060405180910390f35b34801561083657600080fd5b506108796004803603602081101561084d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b74565b005b34801561088757600080fd5b506108ca6004803603602081101561089e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da5565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506109196004803603602081101561090357600080fd5b8101908080359060200190929190505050611e72565b005b34801561092757600080fd5b5061096a6004803603602081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb1565b6040518082815260200191505060405180910390f35b34801561098c57600080fd5b50610995611ff9565b005b3480156109a357600080fd5b506109d0600480360360208110156109ba57600080fd5b8101908080359060200190929190505050612184565b005b3480156109de57600080fd5b50610a21600480360360208110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061234e565b005b348015610a2f57600080fd5b50610a386128b6565b6040518082815260200191505060405180910390f35b348015610a5a57600080fd5b50610a636128da565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9b57600080fd5b50610aa4612904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610adc57600080fd5b50610ae561292a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b25578082015181840152602081019050610b0a565b50505050905090810190601f168015610b525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b6c57600080fd5b50610b756129cc565b6040518082815260200191505060405180910390f35b348015610b9757600080fd5b50610be660048036036040811015610bae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f0565b005b348015610bf457600080fd5b50610bfd612b6d565b6040518082815260200191505060405180910390f35b348015610c1f57600080fd5b50610c28612b73565b6040518082815260200191505060405180910390f35b348015610c4a57600080fd5b50610c9760048036036040811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c1d565b60405180821515815260200191505060405180910390f35b348015610cbb57600080fd5b50610cfe60048036036020811015610cd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cea565b6040518082815260200191505060405180910390f35b348015610d2057600080fd5b50610d6d60048036036040811015610d3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612db7565b60405180821515815260200191505060405180910390f35b348015610d9157600080fd5b50610dd460048036036020811015610da857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dd5565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610e3d57600080fd5b50610e8060048036036020811015610e5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f08565b60405180821515815260200191505060405180910390f35b348015610ea457600080fd5b50610ef360048036036040811015610ebb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612f28565b005b348015610f0157600080fd5b50610f8560048036036040811015610f1857600080fd5b8101908080359060200190640100000000811115610f3557600080fd5b820183602082011115610f4757600080fd5b80359060200191846020830284011164010000000083111715610f6957600080fd5b9091929391929390803515159060200190929190505050613146565b005b348015610f9357600080fd5b50610fd660048036036020811015610faa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613320565b60405180821515815260200191505060405180910390f35b348015610ffa57600080fd5b506110036133ed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561103b57600080fd5b5061109e6004803603604081101561105257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613413565b6040518082815260200191505060405180910390f35b3480156110c057600080fd5b506110c961349a565b6040518082815260200191505060405180910390f35b3480156110eb57600080fd5b5061112e6004803603602081101561110257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134a0565b005b34801561113c57600080fd5b506111456136dc565b6040518082815260200191505060405180910390f35b34801561116757600080fd5b506111946004803603602081101561117e57600080fd5b8101908080359060200190929190505050613786565b005b3480156111a257600080fd5b506111cf600480360360208110156111b957600080fd5b81019080803590602001909291905050506138e0565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b34801561123857600080fd5b5061127b6004803603602081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139fd565b005b60095481565b61128b613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a7640000810260098190555050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b5050505050905090565b6000611417611410613c95565b8484613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b61147d613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006115b4848484613e94565b611675846115c0613c95565b6116708560405180606001604052806028815260200161560f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611626613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b600190509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b8101908080519060200190929190505050905090565b60006012905090565b611761613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156118ae57600080fd5b505af11580156118c2573d6000803e3d6000fd5b5050505050565b60006119726118d6613c95565b8461196d85600160006118e7613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001821515815260200192505050602060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b505050506040513d6020811015611a6057600080fd5b810190808051906020019092919050505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b8101908080519060200190929190505050905090565b611b7c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061554c6023913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e3057600080fd5b505afa158015611e44573d6000803e3d6000fd5b505050506040513d6020811015611e5a57600080fd5b81019080805190602001909291905050509050919050565b6000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b505050506040513d6060811015611f1657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612001613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61218c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62030d40811015801561226457506207a1208111155b6122b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061556f603e913960400191505060405180910390fd5b600c54811415612314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806156ff6036913960400191505060405180910390fd5b600c54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600c8190555050565b612356613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061575a602d913960400191505060405180910390fd5b60008190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806156ba6045913960600191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561263157600080fd5b505af1158015612645573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db06126ee6128da565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127dd57600080fd5b505af11580156127f1573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129c25780601f10612997576101008083540402835291602001916129c2565b820191906000526020600020905b8154815290600101906020018083116129a557829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6129f8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806155ad6041913960600191505060405180910390fd5b612b698282614908565b5050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6020811015612c0757600080fd5b8101908080519060200190929190505050905090565b6000612ce0612c2a613c95565b84612cdb856040518060600160405280602581526020016157356025913960016000612c54613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b81019080805190602001909291905050509050919050565b6000612dcb612dc4613c95565b8484613e94565b6001905092915050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506101006040518083038186803b158015612e6b57600080fd5b505afa158015612e7f573d6000803e3d6000fd5b505050506040513d610100811015612e9657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b600f6020528060005260406000206000915054906101000a900460ff1681565b612f30613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061543c6034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b61314e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b838390508110156132aa5781600d600086868581811061322f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050613213565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600081840152601f19601f82011690508083019250505094505050505060405180910390a1505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d60208110156133d557600080fd5b81019080805190602001909291905050509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b6134a8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806154706036913960400191505060405180910390fd5b61361c816001612f28565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b815260040160206040518083038186803b15801561374657600080fd5b505afa15801561375a573d6000803e3d6000fd5b505050506040513d602081101561377057600080fd5b8101908080519060200190929190505050905090565b61378e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156138c557600080fd5b505af11580156138d9573d6000803e3d6000fd5b5050505050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561396057600080fd5b505afa158015613974573d6000803e3d6000fd5b505050506040513d61010081101561398b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b613a05613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ac7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154a66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828401905083811015613c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156966024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154cc6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b6000811415613fba57613fb583836000614afc565b614843565b600660149054906101000a900460ff161580156140205750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b801561407a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156140d05750600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156141485750600d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141a9576009548111156141a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061565c603a913960400191505060405180910390fd5b5b60006141b430611fb1565b90506000600a5482101590508080156141da5750600660149054906101000a900460ff16155b80156142305750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561428a5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156142e45750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156143aa576001600660146101000a81548160ff021916908315150217905550600061436b7f000000000000000000000000000000000000000000000000000000000000000061435d7f000000000000000000000000000000000000000000000000000000000000000086614dbd90919063ffffffff16565b614e4390919063ffffffff16565b905061437681614e8d565b600061438130611fb1565b905061438c81614ef6565b6000600660146101000a81548160ff02191690831515021790555050505b6000600660149054906101000a900460ff16159050600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144605750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561446a57600090505b80156145775760006144b860646144aa7f000000000000000000000000000000000000000000000000000000000000000088614dbd90919063ffffffff16565b614e4390919063ffffffff16565b9050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145555761455260646145447f000000000000000000000000000000000000000000000000000000000000000084614dbd90919063ffffffff16565b614e4390919063ffffffff16565b90505b6145688186614fda90919063ffffffff16565b9450614575873083614afc565b505b614582868686614afc565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc876145ca89611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561461d57600080fd5b505af192505050801561462e575060015b61463757614638565b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661468088611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156146d357600080fd5b505af19250505080156146e4575060015b6146ed576146ee565b5b600660149054906101000a900460ff1661483f576000600c549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b15801561477e57600080fd5b505af19250505080156147c657506040513d606081101561479e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060015b6147cf5761483d565b3273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505b505b5050505b505050565b60008383111582906148f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148ba57808201518184015260208101905061489f565b50505050905090810190601f1680156148e75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156149b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806154ee6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015614ab257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015614a9957600080fd5b505af1158015614aad573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b614c13838383615024565b614c7e81604051806060016040528060268152602001615526602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415614dd05760009050614e3d565b6000828402905082848281614de157fe5b0414614e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806155ee6021913960400191505060405180910390fd5b809150505b92915050565b6000614e8583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615029565b905092915050565b60004790506000614ea78247614fda90919063ffffffff16565b9050614eb2836150ef565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868382604051808381526020018281526020019250505060405180910390a1505050565b614eff81615164565b60004790506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114614f86576040519150601f19603f3d011682016040523d82523d6000602084013e614f8b565b606091505b505090508015614fd5577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38383604051808381526020018281526020019250505060405180910390a15b505050565b600061501c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614848565b905092915050565b505050565b600080831182906150d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561509a57808201518184015260208101905061507f565b50505050905090810190601f1680156150c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816150e157fe5b049050809150509392505050565b6150f881615164565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015615160573d6000803e3d6000fd5b5050565b6060600267ffffffffffffffff8111801561517e57600080fd5b506040519080825280602002602001820160405280156151ad5781602001602082028036833780820191505090505b50905030816000815181106151be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561526057600080fd5b505afa158015615274573d6000803e3d6000fd5b505050506040513d602081101561528a57600080fd5b8101908080519060200190929190505050816001815181106152a857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061530f30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613c9d565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156153d35780820151818401526020810190506153b8565b505050509050019650505050505050600060405180830381600087803b1580156153fc57600080fd5b505af1158015615410573d6000803e3d6000fd5b50505050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427426179626c6164653a20546865206c69717569646974792077616c6c657420697320616c7265616479207468697320616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554686520726f7574657220616c72656164792068617320746861742061646472657373426179626c6164653a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303054686520556e697377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520424159424c41444520746f6b656e20636f6e7472616374426179626c6164653a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373a2646970667358221220215b8ef7afa6b6af2f51c9eb5e7d516a5a469a83ce01ed6af15146162d1eaf7a64736f6c634300060c003360806040523480156200001157600080fd5b506040518060400160405280601981526020017f426179626c6164655f4469766964656e645f547261636b6572000000000000008152506040518060400160405280601981526020017f426179626c6164655f4469766964656e645f547261636b657200000000000000815250818181600390805190602001906200009892919062000192565b508060049080519060200190620000b192919062000192565b50505050506000620000c86200018a60201b60201c565b905080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350610e106011819055506c0c9f2c9cd04674edea4000000060128190555062000238565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d557805160ff191683800117855562000206565b8280016001018555821562000206579182015b8281111562000205578251825591602001919060010190620001e8565b5b50905062000215919062000219565b5090565b5b80821115620002345760008160009055506001016200021a565b5090565b61362180620002486000396000f3fe6080604052600436106102085760003560e01c8063715018a611610118578063bc4c4b37116100a0578063e7841ec01161006f578063e7841ec014610c39578063e98030c714610c64578063f2fde38b14610c9f578063fbcbc0f114610cf0578063ffb2c47914610d9c57610217565b8063bc4c4b3714610abb578063be10b61414610b2e578063dd62ed3e14610b59578063e30443bc14610bde57610217565b806395d89b41116100e757806395d89b411461087f578063a457c2d71461090f578063a8b9d24014610980578063a9059cbb146109e5578063aafd847a14610a5657610217565b8063715018a61461079757806385a6b3ae146107ae5780638da5cb5b146107d957806391b89fba1461081a57610217565b80633009a6091161019b5780634e7b827f1161016a5780634e7b827f146105f35780635183d6fd1461065a5780636a474002146106f05780636f2789ec1461070757806370a082311461073257610217565b80633009a609146104d8578063313ce5671461050357806331e79db014610531578063395093511461058257610217565b806318160ddd116101d757806318160ddd14610352578063226cfa3d1461037d57806323b872dd146103e257806327ce01471461047357610217565b806303c833021461021c57806306fdde0314610226578063095ea7b3146102b657806309bbedde1461032757610217565b3661021757610215610df9565b005b600080fd5b610224610df9565b005b34801561023257600080fd5b5061023b610ed0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027b578082015181840152602081019050610260565b50505050905090810190601f1680156102a85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102c257600080fd5b5061030f600480360360408110156102d957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f72565b60405180821515815260200191505060405180910390f35b34801561033357600080fd5b5061033c610f90565b6040518082815260200191505060405180910390f35b34801561035e57600080fd5b50610367610fa0565b6040518082815260200191505060405180910390f35b34801561038957600080fd5b506103cc600480360360208110156103a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610faa565b6040518082815260200191505060405180910390f35b3480156103ee57600080fd5b5061045b6004803603606081101561040557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fc2565b60405180821515815260200191505060405180910390f35b34801561047f57600080fd5b506104c26004803603602081101561049657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061109b565b6040518082815260200191505060405180910390f35b3480156104e457600080fd5b506104ed61113c565b6040518082815260200191505060405180910390f35b34801561050f57600080fd5b50610518611142565b604051808260ff16815260200191505060405180910390f35b34801561053d57600080fd5b506105806004803603602081101561055457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061114b565b005b34801561058e57600080fd5b506105db600480360360408110156105a557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061139d565b60405180821515815260200191505060405180910390f35b3480156105ff57600080fd5b506106426004803603602081101561061657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611450565b60405180821515815260200191505060405180910390f35b34801561066657600080fd5b506106936004803603602081101561067d57600080fd5b8101908080359060200190929190505050611470565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b3480156106fc57600080fd5b5061070561160f565b005b34801561071357600080fd5b5061071c611668565b6040518082815260200191505060405180910390f35b34801561073e57600080fd5b506107816004803603602081101561075557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061166e565b6040518082815260200191505060405180910390f35b3480156107a357600080fd5b506107ac6116b6565b005b3480156107ba57600080fd5b506107c3611841565b6040518082815260200191505060405180910390f35b3480156107e557600080fd5b506107ee611847565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082657600080fd5b506108696004803603602081101561083d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611871565b6040518082815260200191505060405180910390f35b34801561088b57600080fd5b50610894611883565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108d45780820151818401526020810190506108b9565b50505050905090810190601f1680156109015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561091b57600080fd5b506109686004803603604081101561093257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611925565b60405180821515815260200191505060405180910390f35b34801561098c57600080fd5b506109cf600480360360208110156109a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119f2565b6040518082815260200191505060405180910390f35b3480156109f157600080fd5b50610a3e60048036036040811015610a0857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a55565b60405180821515815260200191505060405180910390f35b348015610a6257600080fd5b50610aa560048036036020811015610a7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a73565b6040518082815260200191505060405180910390f35b348015610ac757600080fd5b50610b1660048036036040811015610ade57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611abc565b60405180821515815260200191505060405180910390f35b348015610b3a57600080fd5b50610b43611c49565b6040518082815260200191505060405180910390f35b348015610b6557600080fd5b50610bc860048036036040811015610b7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c4f565b6040518082815260200191505060405180910390f35b348015610bea57600080fd5b50610c3760048036036040811015610c0157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cd6565b005b348015610c4557600080fd5b50610c4e611f44565b6040518082815260200191505060405180910390f35b348015610c7057600080fd5b50610c9d60048036036020811015610c8757600080fd5b8101908080359060200190929190505050611f4e565b005b348015610cab57600080fd5b50610cee60048036036020811015610cc257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612117565b005b348015610cfc57600080fd5b50610d3f60048036036020811015610d1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612327565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610da857600080fd5b50610dd560048036036020811015610dbf57600080fd5b8101908080359060200190929190505050612534565b60405180848152602001838152602001828152602001935050505060405180910390f35b6000610e03610fa0565b11610e0d57600080fd5b6000341115610ece57610e5e610e21610fa0565b610e45700100000000000000000000000000000000346126ad90919063ffffffff16565b81610e4c57fe5b0460055461273390919063ffffffff16565b6005819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511346040518082815260200191505060405180910390a2610ec73460085461273390919063ffffffff16565b6008819055505b565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b5050505050905090565b6000610f86610f7f6127bb565b84846127c3565b6001905092915050565b6000600a60000180549050905090565b6000600254905090565b60106020528060005260406000206000915090505481565b6000610fcf8484846129ba565b61109084610fdb6127bb565b61108b8560405180606001604052806028815260200161346360289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110416127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6127c3565b600190509392505050565b600070010000000000000000000000000000000061112d611128600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461111a6111156111048861166e565b6005546126ad90919063ffffffff16565b612ad6565b612af390919063ffffffff16565b612b35565b8161113457fe5b049050919050565b600e5481565b60006012905090565b6111536127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611215576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561126c57600080fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506112cf816000612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce634c60db9c9091836040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b15801561133f57600080fd5b505af4158015611353573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a250565b60006114466113aa6127bb565b8461144185600160006113bb6127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b6127c3565b6001905092915050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600080600080600080600080600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156114ce57600080fd5b505af41580156114e2573d6000803e3d6000fd5b505050506040513d60208110156114f857600080fd5b810190808051906020019092919050505089106115505760007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600080600080600097509750975097509750975097509750611604565b6000600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156115ac57600080fd5b505af41580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b810190808051906020019092919050505090506115f281612327565b98509850985098509850985098509850505b919395975091939597565b6000611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252606d81526020018061350c606d913960800191505060405180910390fd5b565b60115481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116be6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611780576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60085481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061187c826119f2565b9050919050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561191b5780601f106118f05761010080835404028352916020019161191b565b820191906000526020600020905b8154815290600101906020018083116118fe57829003601f168201915b5050505050905090565b60006119e86119326127bb565b846119e385604051806060016040528060258152602001613579602591396001600061195c6127bb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6127c3565b6001905092915050565b6000611a4e600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a408461109b565b612bb990919063ffffffff16565b9050919050565b6000611a69611a626127bb565b84846129ba565b6001905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611ac66127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000611b9384612c03565b90506000811115611c3d5742601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508215158473ffffffffffffffffffffffffffffffffffffffff167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf092836040518082815260200191505060405180910390a36001915050611c43565b60009150505b92915050565b60125481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611cde6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611df757611f40565b6012548110611e9f57611e0a8282612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce63bc2b405c909184846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060006040518083038186803b158015611e8257600080fd5b505af4158015611e96573d6000803e3d6000fd5b50505050611f33565b611eaa826000612b4c565b600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce634c60db9c9091846040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015611f1a57600080fd5b505af4158015611f2e573d6000803e3d6000fd5b505050505b611f3e826001611abc565b505b5050565b6000600e54905090565b611f566127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612018576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610e10811015801561202d5750620151808111155b612082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604e81526020018061359e604e913960600191505060405180910390fd5b6011548114156120dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806134ac603c913960400191505060405180910390fd5b601154817f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f60405160405180910390a38060118190555050565b61211f6127bb565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612267576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806133cb6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080889750600a731408dd20d80b68693e02059b8f3fc5d4b28b2dce6317e142d190918a6040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156123a657600080fd5b505af41580156123ba573d6000803e3d6000fd5b505050506040513d60208110156123d057600080fd5b810190808051906020019092919050505096507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff95506000871261248657600e548711156124345761242d600e5488612e2590919063ffffffff16565b9550612485565b6000600e54600a600001805490501161244e57600061246c565b61246b600e54600a60000180549050612bb990919063ffffffff16565b5b90506124818189612af390919063ffffffff16565b9650505b5b61248f886119f2565b945061249a8861109b565b9350601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600083116124ed576000612503565b6125026011548461273390919063ffffffff16565b5b9150428211612513576000612527565b6125264283612bb990919063ffffffff16565b5b9050919395975091939597565b600080600080600a600001805490509050600081141561256057600080600e54935093509350506126a6565b6000600e5490506000805a90506000805b898410801561257f57508582105b1561268d578480600101955050600a6000018054905085106125a057600094505b6000600a60000186815481106125b257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612627601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e67565b1561264657612637816001611abc565b156126455781806001019250505b5b828060010193505060005a905080851115612683576126806126718287612bb990919063ffffffff16565b8761273390919063ffffffff16565b95505b8094505050612571565b84600e819055508181600e549850985098505050505050505b9193909250565b6000808314156126c0576000905061272d565b60008284029050828482816126d157fe5b0414612728576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134426021913960400191505060405180910390fd5b809150505b92915050565b6000808284019050838110156127b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612849576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134e86024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806133f16022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000612a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613413602f913960400191505060405180910390fd5b505050565b6000838311158290612ac3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a88578082015181840152602081019050612a6d565b50505050905090810190601f168015612ab55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808290506000811215612aea57600080fd5b80915050919050565b600080828401905060008312158015612b0c5750838112155b80612b225750600083128015612b2157508381125b5b612b2b57600080fd5b8091505092915050565b600080821215612b4457600080fd5b819050919050565b6000612b578361166e565b905080821115612b88576000612b768284612bb990919063ffffffff16565b9050612b828482612e9a565b50612bb4565b80821015612bb3576000612ba58383612bb990919063ffffffff16565b9050612bb18482612f59565b505b5b505050565b6000612bfb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a16565b905092915050565b600080612c0f836119f2565b90506000811115612e1a57612c6c81600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040518082815260200191505060405180910390a260008373ffffffffffffffffffffffffffffffffffffffff1682610bb890604051806000019050600060405180830381858888f193505050503d8060008114612d62576040519150601f19603f3d011682016040523d82523d6000602084013e612d67565b606091505b5050905080612e1057612dc282600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bb990919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600092505050612e20565b8192505050612e20565b60009150505b919050565b600080828403905060008312158015612e3e5750838113155b80612e545750600083128015612e5357508381135b5b612e5d57600080fd5b8091505092915050565b600042821115612e7a5760009050612e95565b601154612e908342612bb990919063ffffffff16565b101590505b919050565b612ea48282613018565b612f12612ec4612ebf836005546126ad90919063ffffffff16565b612ad6565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e2590919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b612f6382826131df565b612fd1612f83612f7e836005546126ad90919063ffffffff16565b612ad6565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6130c7600083836133a3565b6130dc8160025461273390919063ffffffff16565b600281905550613133816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461273390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061348b6021913960400191505060405180910390fd5b613271826000836133a3565b6132dc816040518060600160405280602281526020016133a9602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a169092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061333381600254612bb990919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b50505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373426179626c6164655f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f776564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737354494b495f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c756545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373426179626c6164655f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20426179626c61646520636f6e74726163742e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f426179626c6164655f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273a264697066735822122030b24135a0bc4b83f0a35765fc44ed0e5be4110338035c24b90aeefa22e21bde64736f6c634300060c0033426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c75646564274175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c806388bdd9be11610175578063ad56c13c116100dc578063dd62ed3e11610095578063e7841ec01161006f578063e7841ec014611130578063e98030c71461115b578063f27fd25414611196578063f2fde38b1461122c576102d4565b8063dd62ed3e1461102f578063e2f45605146110b4578063e37ba8f9146110df576102d4565b8063ad56c13c14610d85578063b62496f514610e31578063c024666814610e98578063c492f04614610ef5578063c705c56914610f87578063d469801614610fee576102d4565b80639a7a23d61161012e5780639a7a23d614610b8b5780639c1b8af514610be8578063a26579ad14610c13578063a457c2d714610c3e578063a8b9d24014610caf578063a9059cbb14610d14576102d4565b806388bdd9be146109d25780638c0344db14610a235780638da5cb5b14610a4e5780638ea5220f14610a8f57806395d89b4114610ad057806398118cb414610b60576102d4565b8063313ce5671161023457806364b0f653116101ed578063700bb191116101c7578063700bb191146108e057806370a082311461091b578063715018a614610980578063871c128d14610997576102d4565b806364b0f653146107ff57806365b8dbc01461082a5780636843cd841461087b576102d4565b8063313ce5671461065057806331e79db01461067e57806339509351146106cf57806349bd5a5e146107405780634e71d92d146107815780634fbee19314610798576102d4565b806318160ddd1161028657806318160ddd146104ac5780631f53ac02146104d757806322bd3f7f1461052857806323b872dd146105535780632c1f5216146105e457806330bb4cff14610625576102d4565b806302259e9e146102d9578063065af77a1461030457806306fdde031461033f578063095ea7b3146103cf57806313114a9d146104405780631694505e1461046b576102d4565b366102d457005b600080fd5b3480156102e557600080fd5b506102ee61127d565b6040518082815260200191505060405180910390f35b34801561031057600080fd5b5061033d6004803603602081101561032757600080fd5b8101908080359060200190929190505050611283565b005b34801561034b57600080fd5b50610354611361565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610394578082015181840152602081019050610379565b50505050905090810190601f1680156103c15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103db57600080fd5b50610428600480360360408110156103f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611403565b60405180821515815260200191505060405180910390f35b34801561044c57600080fd5b50610455611421565b6040518082815260200191505060405180910390f35b34801561047757600080fd5b50610480611445565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104b857600080fd5b506104c161146b565b6040518082815260200191505060405180910390f35b3480156104e357600080fd5b50610526600480360360208110156104fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611475565b005b34801561053457600080fd5b5061053d611583565b6040518082815260200191505060405180910390f35b34801561055f57600080fd5b506105cc6004803603606081101561057657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a7565b60405180821515815260200191505060405180910390f35b3480156105f057600080fd5b506105f9611680565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561063157600080fd5b5061063a6116a6565b6040518082815260200191505060405180910390f35b34801561065c57600080fd5b50610665611750565b604051808260ff16815260200191505060405180910390f35b34801561068a57600080fd5b506106cd600480360360208110156106a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611759565b005b3480156106db57600080fd5b50610728600480360360408110156106f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118c9565b60405180821515815260200191505060405180910390f35b34801561074c57600080fd5b5061075561197c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561078d57600080fd5b506107966119a0565b005b3480156107a457600080fd5b506107e7600480360360208110156107bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a74565b60405180821515815260200191505060405180910390f35b34801561080b57600080fd5b50610814611aca565b6040518082815260200191505060405180910390f35b34801561083657600080fd5b506108796004803603602081101561084d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b74565b005b34801561088757600080fd5b506108ca6004803603602081101561089e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da5565b6040518082815260200191505060405180910390f35b3480156108ec57600080fd5b506109196004803603602081101561090357600080fd5b8101908080359060200190929190505050611e72565b005b34801561092757600080fd5b5061096a6004803603602081101561093e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fb1565b6040518082815260200191505060405180910390f35b34801561098c57600080fd5b50610995611ff9565b005b3480156109a357600080fd5b506109d0600480360360208110156109ba57600080fd5b8101908080359060200190929190505050612184565b005b3480156109de57600080fd5b50610a21600480360360208110156109f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061234e565b005b348015610a2f57600080fd5b50610a386128b6565b6040518082815260200191505060405180910390f35b348015610a5a57600080fd5b50610a636128da565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9b57600080fd5b50610aa4612904565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610adc57600080fd5b50610ae561292a565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b25578082015181840152602081019050610b0a565b50505050905090810190601f168015610b525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b6c57600080fd5b50610b756129cc565b6040518082815260200191505060405180910390f35b348015610b9757600080fd5b50610be660048036036040811015610bae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f0565b005b348015610bf457600080fd5b50610bfd612b6d565b6040518082815260200191505060405180910390f35b348015610c1f57600080fd5b50610c28612b73565b6040518082815260200191505060405180910390f35b348015610c4a57600080fd5b50610c9760048036036040811015610c6157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c1d565b60405180821515815260200191505060405180910390f35b348015610cbb57600080fd5b50610cfe60048036036020811015610cd257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cea565b6040518082815260200191505060405180910390f35b348015610d2057600080fd5b50610d6d60048036036040811015610d3757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612db7565b60405180821515815260200191505060405180910390f35b348015610d9157600080fd5b50610dd460048036036020811015610da857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612dd5565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b348015610e3d57600080fd5b50610e8060048036036020811015610e5457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f08565b60405180821515815260200191505060405180910390f35b348015610ea457600080fd5b50610ef360048036036040811015610ebb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612f28565b005b348015610f0157600080fd5b50610f8560048036036040811015610f1857600080fd5b8101908080359060200190640100000000811115610f3557600080fd5b820183602082011115610f4757600080fd5b80359060200191846020830284011164010000000083111715610f6957600080fd5b9091929391929390803515159060200190929190505050613146565b005b348015610f9357600080fd5b50610fd660048036036020811015610faa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613320565b60405180821515815260200191505060405180910390f35b348015610ffa57600080fd5b506110036133ed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561103b57600080fd5b5061109e6004803603604081101561105257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613413565b6040518082815260200191505060405180910390f35b3480156110c057600080fd5b506110c961349a565b6040518082815260200191505060405180910390f35b3480156110eb57600080fd5b5061112e6004803603602081101561110257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506134a0565b005b34801561113c57600080fd5b506111456136dc565b6040518082815260200191505060405180910390f35b34801561116757600080fd5b506111946004803603602081101561117e57600080fd5b8101908080359060200190929190505050613786565b005b3480156111a257600080fd5b506111cf600480360360208110156111b957600080fd5b81019080803590602001909291905050506138e0565b604051808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405180910390f35b34801561123857600080fd5b5061127b6004803603602081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506139fd565b005b60095481565b61128b613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461134d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b670de0b6b3a7640000810260098190555050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113f95780601f106113ce576101008083540402835291602001916113f9565b820191906000526020600020905b8154815290600101906020018083116113dc57829003601f168201915b5050505050905090565b6000611417611410613c95565b8484613c9d565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000001881565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b61147d613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461153f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000007881565b60006115b4848484613e94565b611675846115c0613c95565b6116708560405180606001604052806028815260200161560f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000611626613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b600190509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561171057600080fd5b505afa158015611724573d6000803e3d6000fd5b505050506040513d602081101561173a57600080fd5b8101908080519060200190929190505050905090565b60006012905090565b611761613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611823576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156118ae57600080fd5b505af11580156118c2573d6000803e3d6000fd5b5050505050565b60006119726118d6613c95565b8461196d85600160006118e7613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b613c9d565b6001905092915050565b7f0000000000000000000000000ffd3bfaf8897d24fc357e5d2faa08f47f82470c81565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc4c4b373360006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001821515815260200192505050602060405180830381600087803b158015611a3657600080fd5b505af1158015611a4a573d6000803e3d6000fd5b505050506040513d6020811015611a6057600080fd5b810190808051906020019092919050505050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166309bbedde6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b8101908080519060200190929190505050905090565b611b7c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061554c6023913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e60405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611e3057600080fd5b505afa158015611e44573d6000803e3d6000fd5b505050506040513d6020811015611e5a57600080fd5b81019080805190602001909291905050509050919050565b6000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479856040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b158015611eec57600080fd5b505af1158015611f00573d6000803e3d6000fd5b505050506040513d6060811015611f1657600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092503273ffffffffffffffffffffffffffffffffffffffff16600015157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a350505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612001613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61218c613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461224e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62030d40811015801561226457506207a1208111155b6122b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e81526020018061556f603e913960400191505060405180910390fd5b600c54811415612314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806156ff6036913960400191505060405180910390fd5b600c54817f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db760405160405180910390a380600c8190555050565b612356613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612418576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156124bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061575a602d913960400191505060405180910390fd5b60008190503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252157600080fd5b505afa158015612535573d6000803e3d6000fd5b505050506040513d602081101561254b57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146125c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260458152602001806156ba6045913960600191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166331e79db0826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561263157600080fd5b505af1158015612645573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db06126ee6128da565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff166331e79db0600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156127dd57600080fd5b505af11580156127f1573d6000803e3d6000fd5b50505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a860405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7f000000000000000000000000000000000000000000000000000000000000000481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156129c25780601f10612997576101008083540402835291602001916129c2565b820191906000526020600020905b8154815290600101906020018083116129a557829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000001481565b6129f8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612aba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b7f0000000000000000000000000ffd3bfaf8897d24fc357e5d2faa08f47f82470c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260418152602001806155ad6041913960600191505060405180910390fd5b612b698282614908565b5050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636f2789ec6040518163ffffffff1660e01b815260040160206040518083038186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6020811015612c0757600080fd5b8101908080519060200190929190505050905090565b6000612ce0612c2a613c95565b84612cdb856040518060600160405280602581526020016157356025913960016000612c54613c95565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b613c9d565b6001905092915050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d7557600080fd5b505afa158015612d89573d6000803e3d6000fd5b505050506040513d6020811015612d9f57600080fd5b81019080805190602001909291905050509050919050565b6000612dcb612dc4613c95565b8484613e94565b6001905092915050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f18a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506101006040518083038186803b158015612e6b57600080fd5b505afa158015612e7f573d6000803e3d6000fd5b505050506040513d610100811015612e9657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b600f6020528060005260406000206000915054906101000a900460ff1681565b612f30613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ff2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515141561309b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061543c6034913960400191505060405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405180821515815260200191505060405180910390a25050565b61314e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60005b838390508110156132aa5781600d600086868581811061322f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050613213565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600081840152601f19601f82011690508083019250505094505050505060405180910390a1505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634e7b827f836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d60208110156133d557600080fd5b81019080805190602001909291905050509050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b6134a8613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461356a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806154706036913960400191505060405180910390fd5b61361c816001612f28565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e60405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e7841ec06040518163ffffffff1660e01b815260040160206040518083038186803b15801561374657600080fd5b505afa15801561375a573d6000803e3d6000fd5b505050506040513d602081101561377057600080fd5b8101908080519060200190929190505050905090565b61378e613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613850576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e98030c7826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156138c557600080fd5b505af11580156138d9573d6000803e3d6000fd5b5050505050565b600080600080600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561396057600080fd5b505afa158015613974573d6000803e3d6000fd5b505050506040513d61010081101561398b57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505097509750975097509750975097509750919395975091939597565b613a05613c95565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613ac7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b4d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154a66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080828401905083811015613c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613d23576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806156966024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613da9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154cc6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613fa0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b6000811415613fba57613fb583836000614afc565b614843565b600660149054906101000a900460ff161580156140205750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b801561407a5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b80156140d05750600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156141485750600d6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156141a9576009548111156141a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061565c603a913960400191505060405180910390fd5b5b60006141b430611fb1565b90506000600a5482101590508080156141da5750600660149054906101000a900460ff16155b80156142305750600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561428a5750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156142e45750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156143aa576001600660146101000a81548160ff021916908315150217905550600061436b7f000000000000000000000000000000000000000000000000000000000000001861435d7f000000000000000000000000000000000000000000000000000000000000001486614dbd90919063ffffffff16565b614e4390919063ffffffff16565b905061437681614e8d565b600061438130611fb1565b905061438c81614ef6565b6000600660146101000a81548160ff02191690831515021790555050505b6000600660149054906101000a900460ff16159050600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806144605750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561446a57600090505b80156145775760006144b860646144aa7f000000000000000000000000000000000000000000000000000000000000001888614dbd90919063ffffffff16565b614e4390919063ffffffff16565b9050600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156145555761455260646145447f000000000000000000000000000000000000000000000000000000000000007884614dbd90919063ffffffff16565b614e4390919063ffffffff16565b90505b6145688186614fda90919063ffffffff16565b9450614575873083614afc565b505b614582868686614afc565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc876145ca89611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561461d57600080fd5b505af192505050801561462e575060015b61463757614638565b5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8661468088611fb1565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156146d357600080fd5b505af19250505080156146e4575060015b6146ed576146ee565b5b600660149054906101000a900460ff1661483f576000600c549050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffb2c479826040518263ffffffff1660e01b815260040180828152602001915050606060405180830381600087803b15801561477e57600080fd5b505af19250505080156147c657506040513d606081101561479e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919050505060015b6147cf5761483d565b3273ffffffffffffffffffffffffffffffffffffffff16600115157fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98858585896040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505b505b5050505b505050565b60008383111582906148f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156148ba57808201518184015260208101905061489f565b50505050905090810190601f1680156148e75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b801515600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156149b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806154ee6038913960400191505060405180910390fd5b80600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015614ab257600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015614a9957600080fd5b505af1158015614aad573d6000803e3d6000fd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415614b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806156376025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614c08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154196023913960400191505060405180910390fd5b614c13838383615024565b614c7e81604051806060016040528060268152602001615526602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546148489092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613c0d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600080831415614dd05760009050614e3d565b6000828402905082848281614de157fe5b0414614e38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806155ee6021913960400191505060405180910390fd5b809150505b92915050565b6000614e8583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615029565b905092915050565b60004790506000614ea78247614fda90919063ffffffff16565b9050614eb2836150ef565b7f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f83814868382604051808381526020018281526020019250505060405180910390a1505050565b614eff81615164565b60004790506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114614f86576040519150601f19603f3d011682016040523d82523d6000602084013e614f8b565b606091505b505090508015614fd5577f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38383604051808381526020018281526020019250505060405180910390a15b505050565b600061501c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614848565b905092915050565b505050565b600080831182906150d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561509a57808201518184015260208101905061507f565b50505050905090810190601f1680156150c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816150e157fe5b049050809150509392505050565b6150f881615164565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015615160573d6000803e3d6000fd5b5050565b6060600267ffffffffffffffff8111801561517e57600080fd5b506040519080825280602002602001820160405280156151ad5781602001602082028036833780820191505090505b50905030816000815181106151be57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561526057600080fd5b505afa158015615274573d6000803e3d6000fd5b505050506040513d602081101561528a57600080fd5b8101908080519060200190929190505050816001815181106152a857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061530f30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613c9d565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156153d35780820151818401526020810190506153b8565b505050509050019650505050505050600060405180830381600087803b1580156153fc57600080fd5b505af1158015615410573d6000803e3d6000fd5b50505050505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373426179626c6164653a204163636f756e7420697320616c7265616479207468652076616c7565206f6620276578636c7564656427426179626c6164653a20546865206c69717569646974792077616c6c657420697320616c7265616479207468697320616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c756545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636554686520726f7574657220616c72656164792068617320746861742061646472657373426179626c6164653a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c30303054686520556e697377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b65725061697273536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737353656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c5472616e73616374696f6e416d6f756e742e45524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e65642062792074686520424159424c41444520746f6b656e20636f6e7472616374426179626c6164653a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c756545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f546865206469766964656e6420747261636b657220616c72656164792068617320746861742061646472657373a2646970667358221220215b8ef7afa6b6af2f51c9eb5e7d516a5a469a83ce01ed6af15146162d1eaf7a64736f6c634300060c0033

Libraries Used

IterableMapping : 0x1408dd20d80b68693e02059b8f3fc5d4b28b2dceUnverified

Deployed Bytecode Sourcemap

43748:15091:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44045:66;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49304:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15330:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17497:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44276:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43826:41;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;16450:108;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;49182:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44462:52;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18148:355;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43951:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51950:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16292:93;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49762:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18912:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;43874:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53602:88;;;;;;;;;;;;;:::i;:::-;;52099:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;53832:141;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48701:307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52544:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53335:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16621:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33073:148;;;;;;;;;;;;;:::i;:::-;;51282:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;47863:830;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44187:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32431:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44317:77;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15549:104;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44232:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50232:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44594:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51834:108;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19633:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52392:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16961:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52682:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45052:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;49450:300;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49912:304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52236:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;44006:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;17199:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;44118:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50901:373;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53698:126;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51702:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53005:325;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33376:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44045:66;;;;:::o;49304:138::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49427:6:::1;49411:12;:23;49384:24;:50;;;;49304:138:::0;:::o;15330:100::-;15384:13;15417:5;15410:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15330:100;:::o;17497:169::-;17580:4;17597:39;17606:12;:10;:12::i;:::-;17620:7;17629:6;17597:8;:39::i;:::-;17654:4;17647:11;;17497:169;;;;:::o;44276:34::-;;;:::o;43826:41::-;;;;;;;;;;;;;:::o;16450:108::-;16511:7;16538:12;;16531:19;;16450:108;:::o;49182:110::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49274:10:::1;49262:9;;:22;;;;;;;;;;;;;;;;;;49182:110:::0;:::o;44462:52::-;;;:::o;18148:355::-;18288:4;18305:36;18315:6;18323:9;18334:6;18305:9;:36::i;:::-;18352:121;18361:6;18369:12;:10;:12::i;:::-;18383:89;18421:6;18383:89;;;;;;;;;;;;;;;;;:11;:19;18395:6;18383:19;;;;;;;;;;;;;;;:33;18403:12;:10;:12::i;:::-;18383:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;18352:8;:121::i;:::-;18491:4;18484:11;;18148:355;;;;;:::o;43951:46::-;;;;;;;;;;;;;:::o;51950:141::-;52013:7;52040:15;;;;;;;;;;;:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52033:50;;51950:141;:::o;16292:93::-;16350:5;16375:2;16368:9;;16292:93;:::o;49762:130::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49839:15:::1;;;;;;;;;;;:36;;;49876:7;49839:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;49762:130:::0;:::o;18912:218::-;19000:4;19017:83;19026:12;:10;:12::i;:::-;19040:7;19049:50;19088:10;19049:11;:25;19061:12;:10;:12::i;:::-;19049:25;;;;;;;;;;;;;;;:34;19075:7;19049:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;19017:8;:83::i;:::-;19118:4;19111:11;;18912:218;;;;:::o;43874:38::-;;;:::o;53602:88::-;53633:15;;;;;;;;;;;:30;;;53664:10;53676:5;53633:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53602:88::o;52099:125::-;52164:4;52188:19;:28;52208:7;52188:28;;;;;;;;;;;;;;;;;;;;;;;;;52181:35;;52099:125;;;:::o;53832:141::-;53897:7;53924:15;;;;;;;;;;;:39;;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53917:48;;53832:141;:::o;48701:307::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48810:15:::1;;;;;;;;;;;48788:38;;:10;:38;;;;48780:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48924:15;;;;;;;;;;;48882:59;;48904:10;48882:59;;;;;;;;;;;;48989:10;48952:15;;:48;;;;;;;;;;;;;;;;;;48701:307:::0;:::o;52544:130::-;52614:7;52635:15;;;;;;;;;;;:25;;;52661:7;52635:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52628:41;;52544:130;;;:::o;53335:259::-;53395:18;53415:14;53431:26;53461:15;;;;;;;;;;;:23;;;53485:3;53461:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53394:95;;;;;;53576:9;53499:87;;53564:5;53499:87;;;53524:10;53536:6;53544:18;53571:3;53499:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53335:259;;;;:::o;16621:127::-;16695:7;16722:9;:18;16732:7;16722:18;;;;;;;;;;;;;;;;16715:25;;16621:127;;;:::o;33073:148::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33180:1:::1;33143:40;;33164:6;;;;;;;;;;;33143:40;;;;;;;;;;;;33211:1;33194:6;;:19;;;;;;;;;;;;;;;;;;33073:148::o:0;51282:412::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51380:6:::1;51368:8;:18;;:40;;;;;51402:6;51390:8;:18;;51368:40;51360:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51506:16;;51494:8;:28;;51486:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51631:16;;51621:8;51597:51;;;;;;;;;;51678:8;51659:16;:27;;;;51282:412:::0;:::o;47863:830::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47972:15:::1;;;;;;;;;;;47950:38;;:10;:38;;;;47942:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48051:42;48128:10;48051:89;;48199:4;48161:43;;:18;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;:43;;;48153:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48291:18;:39;;;48339:18;48291:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48370:18;:39;;;48418:4;48370:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48435:18;:39;;;48475:7;:5;:7::i;:::-;48435:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48494:18;:39;;;48542:15;;;;;;;;;;;48494:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48619:15;;;;;;;;;;;48577:59;;48599:10;48577:59;;;;;;;;;;;;48667:18;48649:15;;:36;;;;;;;;;;;;;;;;;;32713:1;47863:830:::0;:::o;44187:38::-;;;:::o;32431:79::-;32469:7;32496:6;;;;;;;;;;;32489:13;;32431:79;:::o;44317:77::-;;;;;;;;;;;;;:::o;15549:104::-;15605:13;15638:7;15631:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15549:104;:::o;44232:37::-;;;:::o;50232:252::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50339:13:::1;50331:21;;:4;:21;;;;50323:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50435:41;50464:4;50470:5;50435:28;:41::i;:::-;50232:252:::0;;:::o;44594:40::-;;;;:::o;51834:108::-;51880:7;51907:15;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51900:34;;51834:108;:::o;19633:269::-;19726:4;19743:129;19752:12;:10;:12::i;:::-;19766:7;19775:96;19814:15;19775:96;;;;;;;;;;;;;;;;;:11;:25;19787:12;:10;:12::i;:::-;19775:25;;;;;;;;;;;;;;;:34;19801:7;19775:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;19743:8;:129::i;:::-;19890:4;19883:11;;19633:269;;;;:::o;52392:147::-;52461:7;52485:15;;;;;;;;;;;:38;;;52524:7;52485:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52478:54;;52392:147;;;:::o;16961:175::-;17047:4;17064:42;17074:12;:10;:12::i;:::-;17088:9;17099:6;17064:9;:42::i;:::-;17124:4;17117:11;;16961:175;;;;:::o;52682:318::-;52778:7;52800:6;52821;52842:7;52864;52886;52908;52930;52957:15;;;;;;;;;;;:26;;;52984:7;52957:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52950:42;;;;;;;;;;;;;;;;52682:318;;;;;;;;;:::o;45052:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;49450:300::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49575:8:::1;49543:40;;:19;:28;49563:7;49543:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;49535:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49682:8;49651:19;:28;49671:7;49651:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;49724:7;49708:34;;;49733:8;49708:34;;;;;;;;;;;;;;;;;;;;49450:300:::0;;:::o;49912:304::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50029:9:::1;50025:115;50048:8;;:15;;50044:1;:19;50025:115;;;50120:8;50085:19;:32;50105:8;;50114:1;50105:11;;;;;;;;;;;;;;;50085:32;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;50065:3;;;;;;;50025:115;;;;50157:51;50189:8;;50199;50157:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49912:304:::0;;;:::o;52236:148::-;52306:4;52330:15;;;;;;;;;;;:37;;;52368:7;52330:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52323:53;;52236:148;;;:::o;44006:30::-;;;;;;;;;;;;;:::o;17199:151::-;17288:7;17315:11;:18;17327:5;17315:18;;;;;;;;;;;;;;;:27;17334:7;17315:27;;;;;;;;;;;;;;;;17308:34;;17199:151;;;;:::o;44118:60::-;;;;:::o;50901:373::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51018:15:::1;;;;;;;;;;;50996:37;;:18;:37;;;;50988:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51103:41;51119:18;51139:4;51103:15;:41::i;:::-;51203:15;;;;;;;;;;;51160:59;;51183:18;51160:59;;;;;;;;;;;;51248:18;51230:15;;:36;;;;;;;;;;;;;;;;;;50901:373:::0;:::o;53698:126::-;53753:7;53777:15;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53770:46;;53698:126;:::o;51702:124::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51776:15:::1;;;;;;;;;;;:31;;;51808:9;51776:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51702:124:::0;:::o;53005:325::-;53106:7;53128:6;53149;53170:7;53192;53214;53236;53258;53282:15;;;;;;;;;;;:33;;;53316:5;53282:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53275:47;;;;;;;;;;;;;;;;53005:325;;;;;;;;;:::o;33376:244::-;32653:12;:10;:12::i;:::-;32643:22;;:6;;;;;;;;;;;:22;;;32635:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33485:1:::1;33465:22;;:8;:22;;;;33457:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33575:8;33546:38;;33567:6;;;;;;;;;;;33546:38;;;;;;;;;;;;33604:8;33595:6;;:17;;;;;;;;;;;;;;;;;;33376:244:::0;:::o;8861:181::-;8919:7;8939:9;8955:1;8951;:5;8939:17;;8980:1;8975;:6;;8967:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9033:1;9026:8;;;8861:181;;;;:::o;97:98::-;150:7;177:10;170:17;;97:98;:::o;22819:380::-;22972:1;22955:19;;:5;:19;;;;22947:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23053:1;23034:21;;:7;:21;;;;23026:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23137:6;23107:11;:18;23119:5;23107:18;;;;;;;;;;;;;;;:27;23126:7;23107:27;;;;;;;;;;;;;;;:36;;;;23175:7;23159:32;;23168:5;23159:32;;;23184:6;23159:32;;;;;;;;;;;;;;;;;;22819:380;;;:::o;53989:2739::-;54137:1;54121:18;;:4;:18;;;;54113:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54214:1;54200:16;;:2;:16;;;;54192:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54294:1;54284:6;:11;54281:92;;;54312:28;54328:4;54334:2;54338:1;54312:15;:28::i;:::-;54355:7;;54281:92;54413:8;;;;;;;;;;;54412:9;:55;;;;;54438:25;:29;54464:2;54438:29;;;;;;;;;;;;;;;;;;;;;;;;;54412:55;:168;;;;;54564:15;;;;;;;;;;;54548:32;;:4;:32;;;;54412:168;:273;;;;;54662:19;:23;54682:2;54662:23;;;;;;;;;;;;;;;;;;;;;;;;;54661:24;54412:273;:365;;;;;54741:19;:36;54761:15;;;;;;;;;;;54741:36;;;;;;;;;;;;;;;;;;;;;;;;;54740:37;54412:365;54397:524;;;54822:24;;54812:6;:34;;54804:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54397:524;54927:28;54958:24;54976:4;54958:9;:24::i;:::-;54927:55;;55003:12;55042:18;;55018:20;:42;;55003:57;;55090:7;:33;;;;;55115:8;;;;;;;;;;;55114:9;55090:33;:82;;;;;55141:25;:31;55167:4;55141:31;;;;;;;;;;;;;;;;;;;;;;;;;55140:32;55090:82;:122;;;;;55197:15;;;;;;;;;;;55189:23;;:4;:23;;;;55090:122;:160;;;;;55235:15;;;;;;;;;;;55229:21;;:2;:21;;;;55090:160;55073:505;;;55288:4;55277:8;;:15;;;;;;;;;;;;;;;;;;55309:18;55330:53;55373:9;55330:38;55355:12;55330:20;:24;;:38;;;;:::i;:::-;:42;;:53;;;;:::i;:::-;55309:74;;55398:26;55413:10;55398:14;:26::i;:::-;55441:18;55462:24;55480:4;55462:9;:24::i;:::-;55441:45;;55501:32;55522:10;55501:20;:32::i;:::-;55561:5;55550:8;;:16;;;;;;;;;;;;;;;;;;55073:505;;;55592:12;55608:8;;;;;;;;;;;55607:9;55592:24;;55718:19;:25;55738:4;55718:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;55747:19;:23;55767:2;55747:23;;;;;;;;;;;;;;;;;;;;;;;;;55718:52;55715:99;;;55797:5;55787:15;;55715:99;55829:7;55826:352;;;55850:12;55865:30;55891:3;55865:21;55876:9;55865:6;:10;;:21;;;;:::i;:::-;:25;;:30;;;;:::i;:::-;55850:45;;55956:25;:29;55982:2;55956:29;;;;;;;;;;;;;;;;;;;;;;;;;55953:116;;;56013:40;56049:3;56013:31;56022:21;56013:4;:8;;:31;;;;:::i;:::-;:35;;:40;;;;:::i;:::-;56006:47;;55953:116;56091:16;56102:4;56091:6;:10;;:16;;;;:::i;:::-;56082:25;;56124:42;56140:4;56154;56161;56124:15;:42::i;:::-;55826:352;;56190:33;56206:4;56212:2;56216:6;56190:15;:33::i;:::-;56240:15;;;;;;;;;;;:26;;;56275:4;56282:15;56292:4;56282:9;:15::i;:::-;56240:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56236:74;;;;;;56324:15;;;;;;;;;;;:26;;;56359:2;56364:13;56374:2;56364:9;:13::i;:::-;56324:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56320:70;;;;;;56406:8;;;;;;;;;;;56402:319;;56425:11;56439:16;;56425:30;;56470:15;;;;;;;;;;;:23;;;56494:3;56470:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56466:244;;;;;56663:9;56587:86;;56652:4;56587:86;;;56612:10;56624:6;56632:18;56658:3;56587:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56499:184;;;56466:244;56402:319;;53989:2739;;;;;;;:::o;9764:192::-;9850:7;9883:1;9878;:6;;9886:12;9870:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9910:9;9926:1;9922;:5;9910:17;;9947:1;9940:8;;;9764:192;;;;;:::o;50492:399::-;50618:5;50583:40;;:25;:31;50609:4;50583:31;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;50575:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50729:5;50695:25;:31;50721:4;50695:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;50750:5;50747:79;;;50772:15;;;;;;;;;;;:36;;;50809:4;50772:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50747:79;50877:5;50843:40;;50871:4;50843:40;;;;;;;;;;;;50492:399;;:::o;20392:573::-;20550:1;20532:20;;:6;:20;;;;20524:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20634:1;20613:23;;:9;:23;;;;20605:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20689:47;20710:6;20718:9;20729:6;20689:20;:47::i;:::-;20769:71;20791:6;20769:71;;;;;;;;;;;;;;;;;:9;:17;20779:6;20769:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20749:9;:17;20759:6;20749:17;;;;;;;;;;;;;;;:91;;;;20874:32;20899:6;20874:9;:20;20884:9;20874:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20851:9;:20;20861:9;20851:20;;;;;;;;;;;;;;;:55;;;;20939:9;20922:35;;20931:6;20922:35;;;20950:6;20922:35;;;;;;;;;;;;;;;;;;20392:573;;;:::o;10215:471::-;10273:7;10523:1;10518;:6;10514:47;;;10548:1;10541:8;;;;10514:47;10573:9;10589:1;10585;:5;10573:17;;10618:1;10613;10609;:5;;;;;;:10;10601:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10677:1;10670:8;;;10215:471;;;;;:::o;11162:132::-;11220:7;11247:39;11251:1;11254;11247:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;11240:46;;11162:132;;;;:::o;56736:612::-;57060:22;57085:21;57060:46;;57167:18;57188:41;57214:14;57188:21;:25;;:41;;;;:::i;:::-;57167:62;;57253:26;57272:6;57253:18;:26::i;:::-;57305:34;57320:6;57328:10;57305:34;;;;;;;;;;;;;;;;;;;;;;;;56736:612;;;:::o;58524:312::-;58589:24;58606:6;58589:16;:24::i;:::-;58624:17;58644:21;58624:41;;58677:12;58702:15;;;;;;;;;;;58694:29;;58731:9;58694:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58676:69;;;58761:7;58758:71;;;58785:32;58799:6;58807:9;58785:32;;;;;;;;;;;;;;;;;;;;;;;;58758:71;58524:312;;;:::o;9325:136::-;9383:7;9410:43;9414:1;9417;9410:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;9403:50;;9325:136;;;;:::o;23802:125::-;;;;:::o;11790:278::-;11876:7;11908:1;11904;:5;11911:12;11896:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11935:9;11951:1;11947;:5;;;;;;11935:17;;12059:1;12052:8;;;11790:278;;;;;:::o;49020:150::-;49084:24;49101:6;49084:16;:24::i;:::-;49120:9;;;;;;;;;;;:18;;:41;49139:21;49120:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49020:150;:::o;57356:611::-;57494:21;57532:1;57518:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57494:40;;57563:4;57545;57550:1;57545:7;;;;;;;;;;;;;:23;;;;;;;;;;;57589:15;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57579:4;57584:1;57579:7;;;;;;;;;;;;;:32;;;;;;;;;;;57624:62;57641:4;57656:15;;;;;;;;;;;57674:11;57624:8;:62::i;:::-;57725:15;;;;;;;;;;;:66;;;57806:11;57832:1;57876:4;57903;57923:15;57725:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57356:611;;:::o

Swarm Source

ipfs://30b24135a0bc4b83f0a35765fc44ed0e5be4110338035c24b90aeefa22e21bde
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.