ETH Price: $2,644.66 (-1.27%)

Contract

0x2fef0642EF9d7dE689D2e55751A7f1A3eE1deAd9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Approve186122042023-11-20 9:48:11449 days ago1700473691IN
0x2fef0642...3eE1deAd9
0 ETH0.00077431
Approve169628742023-04-02 17:26:11680 days ago1680456371IN
0x2fef0642...3eE1deAd9
0 ETH0.000461518.48394954
Approve158574922022-10-30 1:08:47835 days ago1667092127IN
0x2fef0642...3eE1deAd9
0 ETH0.000415018.7830977
Approve158141842022-10-23 23:46:59841 days ago1666568819IN
0x2fef0642...3eE1deAd9
0 ETH0.0004811810.18339864
Approve157434802022-10-14 2:51:23851 days ago1665715883IN
0x2fef0642...3eE1deAd9
0 ETH0.0006615214
Approve157254342022-10-11 14:22:11853 days ago1665498131IN
0x2fef0642...3eE1deAd9
0 ETH0.0006120424.51302987
Approve156931572022-10-07 2:12:11858 days ago1665108731IN
0x2fef0642...3eE1deAd9
0 ETH0.0005765812.2023153
Approve156931322022-10-07 2:07:11858 days ago1665108431IN
0x2fef0642...3eE1deAd9
0 ETH0.0006573913.91245816
Approve156789002022-10-05 2:22:59860 days ago1664936579IN
0x2fef0642...3eE1deAd9
0 ETH0.0014175630
Approve156679342022-10-03 13:30:23862 days ago1664803823IN
0x2fef0642...3eE1deAd9
0 ETH0.0010002521.16843683
Approve156678972022-10-03 13:22:47862 days ago1664803367IN
0x2fef0642...3eE1deAd9
0 ETH0.0006484813.72400976
Approve156634802022-10-02 22:34:23862 days ago1664750063IN
0x2fef0642...3eE1deAd9
0 ETH0.00021224.49091519
Approve156491652022-09-30 22:33:47864 days ago1664577227IN
0x2fef0642...3eE1deAd9
0 ETH0.0005654211.96613896
Approve156480192022-09-30 18:43:47864 days ago1664563427IN
0x2fef0642...3eE1deAd9
0 ETH0.0007548115.97429307
Approve156468042022-09-30 14:39:11864 days ago1664548751IN
0x2fef0642...3eE1deAd9
0 ETH0.0011340424
Approve156465232022-09-30 13:42:59865 days ago1664545379IN
0x2fef0642...3eE1deAd9
0 ETH0.002194746.44673019
Approve156463082022-09-30 12:59:47865 days ago1664542787IN
0x2fef0642...3eE1deAd9
0 ETH0.000934819.78336414
Approve156454612022-09-30 10:09:47865 days ago1664532587IN
0x2fef0642...3eE1deAd9
0 ETH0.000447789.47658773
Approve156448692022-09-30 8:10:35865 days ago1664525435IN
0x2fef0642...3eE1deAd9
0 ETH0.0005615511.88428498
Approve156448522022-09-30 8:07:11865 days ago1664525231IN
0x2fef0642...3eE1deAd9
0 ETH0.0002501710.01974206
Approve156447612022-09-30 7:48:23865 days ago1664524103IN
0x2fef0642...3eE1deAd9
0 ETH0.0002612310.46274138
Approve156446882022-09-30 7:33:47865 days ago1664523227IN
0x2fef0642...3eE1deAd9
0 ETH0.000484410.2514337
Approve156443752022-09-30 6:30:59865 days ago1664519459IN
0x2fef0642...3eE1deAd9
0 ETH0.0005145310.88909087
Claim156440562022-09-30 5:26:35865 days ago1664515595IN
0x2fef0642...3eE1deAd9
0 ETH0.0006280210.95361516
Claim156440482022-09-30 5:24:59865 days ago1664515499IN
0x2fef0642...3eE1deAd9
0 ETH0.0027830611.06952451
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
157029782022-10-08 11:09:11857 days ago1665227351
0x2fef0642...3eE1deAd9
0.00343819 ETH
157029782022-10-08 11:09:11857 days ago1665227351
0x2fef0642...3eE1deAd9
0.00515729 ETH
157029782022-10-08 11:09:11857 days ago1665227351
0x2fef0642...3eE1deAd9
0.00859548 ETH
156789072022-10-05 2:24:23860 days ago1664936663
0x2fef0642...3eE1deAd9
0.00331624 ETH
156789072022-10-05 2:24:23860 days ago1664936663
0x2fef0642...3eE1deAd9
0.00497437 ETH
156789072022-10-05 2:24:23860 days ago1664936663
0x2fef0642...3eE1deAd9
0.00829062 ETH
156620372022-10-02 17:44:11862 days ago1664732651
0x2fef0642...3eE1deAd9
0.00395016 ETH
156620372022-10-02 17:44:11862 days ago1664732651
0x2fef0642...3eE1deAd9
0.00592524 ETH
156620372022-10-02 17:44:11862 days ago1664732651
0x2fef0642...3eE1deAd9
0.00987541 ETH
156489562022-09-30 21:51:47864 days ago1664574707
0x2fef0642...3eE1deAd9
0.00388295 ETH
156489562022-09-30 21:51:47864 days ago1664574707
0x2fef0642...3eE1deAd9
0.00582443 ETH
156489562022-09-30 21:51:47864 days ago1664574707
0x2fef0642...3eE1deAd9
0.00970738 ETH
156468912022-09-30 14:56:35864 days ago1664549795
0x2fef0642...3eE1deAd9
0.00663035 ETH
156468912022-09-30 14:56:35864 days ago1664549795
0x2fef0642...3eE1deAd9
0.00994553 ETH
156468912022-09-30 14:56:35864 days ago1664549795
0x2fef0642...3eE1deAd9
0.01657588 ETH
156448772022-09-30 8:12:23865 days ago1664525543
0x2fef0642...3eE1deAd9
0.00523377 ETH
156448772022-09-30 8:12:23865 days ago1664525543
0x2fef0642...3eE1deAd9
0.00785066 ETH
156448772022-09-30 8:12:23865 days ago1664525543
0x2fef0642...3eE1deAd9
0.01308443 ETH
156448552022-09-30 8:07:47865 days ago1664525267
0x2fef0642...3eE1deAd9
0.00653627 ETH
156448552022-09-30 8:07:47865 days ago1664525267
0x2fef0642...3eE1deAd9
0.0098044 ETH
156448552022-09-30 8:07:47865 days ago1664525267
0x2fef0642...3eE1deAd9
0.01634067 ETH
156446912022-09-30 7:34:23865 days ago1664523263
0x2fef0642...3eE1deAd9
0.00775818 ETH
156446912022-09-30 7:34:23865 days ago1664523263
0x2fef0642...3eE1deAd9
0.01163727 ETH
156446912022-09-30 7:34:23865 days ago1664523263
0x2fef0642...3eE1deAd9
0.01939545 ETH
156445292022-09-30 7:01:59865 days ago1664521319
0x2fef0642...3eE1deAd9
0.00737715 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SonOfTsuka

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

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

/*    WEB: https://www.sonoftsuka.com


      TWITTER: https://twitter.com/sonoftsuka


      TG: https://t.me/sonoftsukerc     */


pragma solidity ^0.8.4;

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "tansfer from the zero address");
        require(to != address(0), "transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(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);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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 IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

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 SonOfTsuka is Context, ERC20, Ownable {
    using SafeMath for uint256;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private _isExcludedFromSellLock;
    mapping (address => bool) private bots;
    mapping (address => uint) private cooldown;
    mapping (address => uint) private sellLock;

    uint256 private _swapTokensAt;
    uint256 private _maxTokensToSwapForFees;

    address payable private _feeAddrWallet1;
    address payable private _feeAddrWallet2;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    IERC20 private rewardToken;
    IERC20 private stableToken;
    IUniswapV2Pair rewardTokenPair;

    uint private tradingOpenTime;
    bool private inSwap = false;
    bool private swapEnabled = false;
    bool private cooldownEnabled = false;
    uint256 private _maxWalletAmount = SUPPLY;

    MeditationRewards public meditationRewards;

    uint256 private dividendsFees = 2;
    uint256 private marketingFees = 2;

    uint256 private slippageDiscount = 20;
    uint256 private SUPPLY = 1e9 * 10**18;

    struct PairReserves {
        uint256 stableReservesPrevious;
        uint256 rewardReservesPrevious;
        uint256 blockNumberPrevious;
        uint256 stableReserves;
        uint256 rewardReserves;
        uint256 blockNumber;
    }

    PairReserves private rewardPairReserves;
    uint256 private peakPrice;
    uint256 private dipPercent;
    uint256 private lastDipPayout;

    uint256 private constant FACTOR = 1e20;

    event DipPayout(uint256 amount, uint256 price, uint256 peakPrice, uint256 dipPercent);

    constructor () ERC20("SonOfTsuka", "$SOT") {
        _feeAddrWallet1 = payable(0x9549fC2bF891A8BC103e49657A3816C565B74947);
        _feeAddrWallet2 = payable(0x7cC26593F13085c6CC8cC8981689964eBd5a3E5C);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_feeAddrWallet1] = true;
        _isExcludedFromFee[_feeAddrWallet2] = true;

        _isExcludedFromSellLock[owner()] = true;
        _isExcludedFromSellLock[address(this)] = true;

        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        rewardToken = IERC20(0xc5fB36dd2fb59d3B98dEfF88425a3F425Ee469eD);
        stableToken = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);

        rewardTokenPair = IUniswapV2Pair(IUniswapV2Factory(uniswapV2Router.factory()).getPair(address(rewardToken), address(stableToken)));

        updateRewardPairReserves();

        meditationRewards = new MeditationRewards(payable(address(this)), rewardToken, stableToken);

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

        _mint(owner(), SUPPLY);
    }

    function updateMeditationRewards(address newMeditationRewards) external onlyOwner {
        meditationRewards = MeditationRewards(newMeditationRewards);
    }

    function updateSlippageDiscount(uint256 discount) external onlyOwner {
        require(discount <= 100);
        slippageDiscount = discount;
    }

    function recoverFunds(address tokenAddress, uint256 tokenAmount) external onlyOwner {
        require(tokenAddress != address(rewardToken));
        IERC20(tokenAddress).transfer(owner(), tokenAmount);

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


    function updateRewardPairReserves() private {
        if(rewardPairReserves.blockNumber == block.number) {
            return;
        }

        rewardPairReserves.blockNumberPrevious = rewardPairReserves.blockNumber;
        rewardPairReserves.stableReservesPrevious = rewardPairReserves.stableReserves;
        rewardPairReserves.rewardReservesPrevious = rewardPairReserves.rewardReserves;

        (uint256 r0, uint256 r1,) = rewardTokenPair.getReserves();

        address token0 = rewardTokenPair.token0();

        if(token0 == address(stableToken)) {
            rewardPairReserves.stableReserves = r0;
            rewardPairReserves.rewardReserves = r1;
        }
        else {
            rewardPairReserves.stableReserves = r1;
            rewardPairReserves.rewardReserves = r0;
        }

        if(rewardPairReserves.blockNumber == 0) {
            rewardPairReserves.blockNumberPrevious = block.number;
            rewardPairReserves.stableReservesPrevious = rewardPairReserves.stableReserves;
            rewardPairReserves.rewardReservesPrevious = rewardPairReserves.rewardReserves;
        }

        rewardPairReserves.blockNumber = block.number;
    }

    function getCurrentPrice(int256 tokenDelta) private view returns (uint256) {
        if(uniswapV2Pair == address(0)) {
            return 0;
        }

        (uint256 rStable, uint256 rToken,) = IUniswapV2Pair(uniswapV2Pair).getReserves();

        address token0 = IUniswapV2Pair(uniswapV2Pair).token0();

        if(token0 != address(stableToken)) {
            uint256 temp = rStable;
            rStable = rToken;
            rToken = temp;
        }

        uint256 k = rStable * rToken;

        rToken = uint256(int256(rToken) + tokenDelta);
        rStable = k / rToken;

        return rStable * FACTOR / rToken;
    }

    

    function updatePeakPriceAndDipPercent(int256 tokenDelta) private {
        uint256 price = getCurrentPrice(tokenDelta);

        if(price == 0) {
            return;
        }

        if(price > peakPrice) {
            peakPrice = price;
        }

        dipPercent = 100 - price * 100 / peakPrice;
        
        if(dipPercent >= 50) {
            uint256 amount = rewardToken.balanceOf(address(this)) * 50 / 100;
            emit DipPayout(amount, price, peakPrice, dipPercent);

            rewardToken.approve(address(meditationRewards), amount);
            meditationRewards.distributeDividendsFromOwner(amount);

            peakPrice = price;
            dipPercent = 0;
            lastDipPayout = amount;
        }
    }

    function getData(address account) external view returns (uint256[] memory dividendInfo, uint256 dipPoolBalance, uint256 dip, uint256 lastDipPayoutAmount) {
        dividendInfo = meditationRewards.getDividendInfo(account);
        dipPoolBalance = rewardToken.balanceOf(address(this));
        dip = dipPercent;
        lastDipPayoutAmount = lastDipPayout;
    }

    function claim() external {
		meditationRewards.claimDividends(msg.sender);
    }

    function setSwapTokensAt(uint256 amount) external onlyOwner() {
        _swapTokensAt = amount;
    }

    function setMaxTokensToSwapForFees(uint256 amount) external onlyOwner() {
        _maxTokensToSwapForFees = amount;
    }

    function setCooldownEnabled(bool onoff) external onlyOwner() {
        cooldownEnabled = onoff;
    }

    function excludeFromSellLock(address user) external onlyOwner() {
        _isExcludedFromSellLock[user] = true;
    }

    function _transfer(address from, address to, uint256 amount) internal override {
        require(from != address(0), "transfer from the zero address");
        require(to != address(0), "transfer to the zero address");
        
        if(from == to) {
            super._transfer(from, to, amount);
            return;
        }

        if (from != owner() && to != owner()) {
            require(tradingOpenTime > 0 || from == address(this));
            require(!bots[from] && !bots[to]);
            if (
                from == uniswapV2Pair &&
                to != address(uniswapV2Router) &&
                !_isExcludedFromFee[to] &&
                cooldownEnabled) {
                require(balanceOf(to) + amount <= _maxWalletAmount);

                // Cooldown
                require(cooldown[to] < block.timestamp);
                cooldown[to] = block.timestamp + (15 seconds);

                if(!_isExcludedFromSellLock[to] && sellLock[to] == 0) {
                    uint elapsed = block.timestamp - tradingOpenTime;

                    if(elapsed < 30) {
                        uint256 sellLockDuration = (30 - elapsed) * 120;

                        sellLock[to] = block.timestamp + sellLockDuration;
                    }
                }
            }
            else if(!_isExcludedFromSellLock[from]) {
                require(sellLock[from] < block.timestamp, "wait");
            }

            uint256 swapAmount = balanceOf(address(this));

            if (swapAmount >= _swapTokensAt &&
                !inSwap &&
                from != uniswapV2Pair &&
                swapEnabled) {

                _swapFees(slippageDiscount);
            }
        }

        if(from != address(uniswapV2Router) && to == uniswapV2Pair) {
            meditationRewards.claimDividends(from);
        }

        uint256 fee = dividendsFees + marketingFees;

        if(tradingOpenTime == 0 || inSwap) {
            fee = 0;
        }
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            fee = 0;
        }
        if(from == address(uniswapV2Router) || to == address(uniswapV2Router)) {
            fee = 0;
        }

        if(fee > 0) {
            uint256 feeAmount = fee * amount / 100;
            super._transfer(from, address(this), feeAmount);
            amount -= feeAmount;
        }

        super._transfer(from, to, amount);

        meditationRewards.setBalance(payable(from), balanceOf(from));
        meditationRewards.setBalance(payable(to), balanceOf(to));

        updateRewardPairReserves();

        int256 tokenDelta = 0;

        if(from == uniswapV2Pair) {
            tokenDelta = -int256(amount);
        }
        else if(to == uniswapV2Pair) {
            tokenDelta = int256(amount);
        }

        updatePeakPriceAndDipPercent(tokenDelta);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(stableToken);
        path[2] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        try uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        ) {} catch {} 
    }

    function sendETHToFee(uint256 amount) private {
        uint256 to1 = amount.mul(60).div(100);
        _feeAddrWallet1.transfer(to1);
        _feeAddrWallet2.transfer(amount - to1);
    }

    function openTrading() external onlyOwner() {
        require(tradingOpenTime == 0, "already open");

        _approve(address(this), address(uniswapV2Router), SUPPLY);
        IERC20(stableToken).approve(address(uniswapV2Router), type(uint).max);

        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), address(stableToken));

        meditationRewards.excludeFromDividends(address(uniswapV2Router));
        meditationRewards.excludeFromDividends(address(uniswapV2Pair));

        _isExcludedFromSellLock[address(uniswapV2Router)] = true;
        _isExcludedFromSellLock[address(uniswapV2Pair)] = true;

        _isExcludedFromFee[address(uniswapV2Router)];

        uniswapV2Router.addLiquidity(
            address(stableToken),
            address(this),
            stableToken.balanceOf(address(this)),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        
        swapEnabled = true;
        cooldownEnabled = true;
        _maxWalletAmount = SUPPLY * 2 / 100;
        tradingOpenTime = block.timestamp;

        _swapTokensAt = SUPPLY * 1 / 1000;
        _maxTokensToSwapForFees = SUPPLY * 2 / 1000;

        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);

        updateRewardPairReserves();
        updatePeakPriceAndDipPercent(0);
    }

    function setBots(address[] memory bots_) public onlyOwner {
        for (uint i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
            meditationRewards.excludeFromDividends(bots_[i]);
        }
    }

    function delBot(address notbot) public onlyOwner {
        bots[notbot] = false;
    }

    function removeStrictWalletLimit() public onlyOwner {
        _maxWalletAmount = SUPPLY;
    }

    receive() external payable {}

    function swapFees(uint256 discount) external onlyOwner {
        _swapFees(discount);
    }
    
    function _swapFees(uint256 discount) private {
        inSwap = true;
        uint256 tokenBalance = balanceOf(address(this));
        uint256 swapAmount = tokenBalance;
        if(swapAmount > _maxTokensToSwapForFees) {
             swapAmount = _maxTokensToSwapForFees;
        }

        uint256 amountForMarketing = swapAmount * marketingFees / (marketingFees + dividendsFees);
        uint256 amountForDividends = swapAmount - amountForMarketing;

        swapTokensForEth(amountForMarketing);
        sendETHToFee(address(this).balance);

        uint256 price = getCurrentPrice(0);

        uint256 stableOut = amountForDividends * price / FACTOR;

        uint256 stableReserves = rewardPairReserves.stableReserves;
        uint256 rewardReserves = rewardPairReserves.rewardReserves;

        if(block.number == rewardPairReserves.blockNumber) {
            stableReserves = rewardPairReserves.stableReservesPrevious;
            rewardReserves = rewardPairReserves.rewardReservesPrevious;
        }

        uint256 minimumAmountOut = stableOut * rewardReserves / stableReserves;
        minimumAmountOut = minimumAmountOut * (100 - discount) / 100;

        uint256 balanceBefore = rewardToken.balanceOf(address(this));

        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = address(stableToken);
        path[2] = address(rewardToken);

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

        try uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            amountForDividends,
            minimumAmountOut,
            path,
            address(this),
            block.timestamp
        ) {} catch {}

        uint256 tokensGained = rewardToken.balanceOf(address(this)) - balanceBefore;

        if(tokensGained > 0) {
            uint256 toDivs = tokensGained / 2;

            rewardToken.approve(address(meditationRewards), toDivs);
            meditationRewards.distributeDividendsFromOwner(toDivs);
        }

        inSwap = false;
    }
}


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

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

contract DividendPayingToken is ERC20, Ownable {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;
 
  uint256 constant internal magnitude = 2**128;
 
  uint256 internal magnifiedDividendPerShare;
  uint256 internal lastAmount;
  
 
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;
 
  uint256 public totalDividendsDistributed;
 
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount
  );


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

  }
 
  function distributeDividends(uint256 amount) internal {
    require(totalSupply() > 0);
 
    if (amount > 0) {
      magnifiedDividendPerShare = magnifiedDividendPerShare.add(
        (amount).mul(magnitude) / totalSupply()
      );
      emit DividendsDistributed(msg.sender, amount);
 
      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  function dividendOf(address _owner) public view returns(uint256) {
    return withdrawableDividendOf(_owner);
  }
 
  function withdrawableDividendOf(address _owner) public view returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }
 
  function withdrawnDividendOf(address _owner) public view returns(uint256) {
    return withdrawnDividends[_owner];
  }
 
 
  function accumulativeDividendOf(address _owner) public view returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }
 
  function _transfer(address from, address to, uint256 value) internal virtual override {
    require(false);
 
    int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
    magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
    magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
  }
 
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);
 
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }
 
  function _burn(address account, uint256 value) internal override {
    super._burn(account, value);
 
    magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
      .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
  }
 
  function _setBalance(address account, uint256 newBalance) internal {
    uint256 currentBalance = balanceOf(account);
 
    if(newBalance > currentBalance) {
      uint256 mintAmount = newBalance.sub(currentBalance);
      _mint(account, mintAmount);
    } else if(newBalance < currentBalance) {
      uint256 burnAmount = currentBalance.sub(newBalance);
      _burn(account, burnAmount);
    }
  }
}

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

    SonOfTsuka public immutable token;
    IERC20 public immutable rewardToken;
    IERC20 public immutable stableToken;

    mapping (address => bool) public excludedFromDividends;
    mapping (address => uint256) public lastClaimTimes;

    uint256 public vestingDuration;

    struct AutoClaimInfo {
        address account;
        uint256 time;
    }

    AutoClaimInfo[] private autoClaims;
    uint256 private autoClaimIndex;
    mapping (address => uint256) autoClaimAccountIndex;

    event ExcludeFromDividends(address indexed account);

    event Claim(address indexed account, uint256 factor, uint256 amount, uint256 toMarketing, uint256 toDivs);

    modifier onlyOwnerOfOwner() {
        require(Ownable(owner()).owner() == _msgSender(), "nope");
        _;
    }
    
    constructor(address payable owner, IERC20 _rewardToken, IERC20 _stableToken) DividendPayingToken("MeditatinRewards", "$MEDITATE") {
        rewardToken = _rewardToken;
        stableToken = _stableToken;
        
        token = SonOfTsuka(owner);

        vestingDuration = 10 days;

        transferOwnership(owner);

        AutoClaimInfo memory autoClaimInfo;
        autoClaims.push(autoClaimInfo);
        autoClaimIndex = 1;
    }

    bool private silenceWarning;

    function _transfer(address, address, uint256) internal override {
        silenceWarning = true;
        require(false, "nah");
    }

    function excludeFromDividends(address account) external onlyOwner {
        if(excludedFromDividends[account]) {
            return;
        }

    	excludedFromDividends[account] = true;

    	_setBalance(account, 0);

    	emit ExcludeFromDividends(account);
    }

    function getDividendInfo(address account) external view returns (uint256[] memory dividendInfo) {
        uint256 withdrawableDividends = withdrawableDividendOf(account);
        uint256 totalDividends = accumulativeDividendOf(account);
        uint256 claimFactor = getAccountClaimFactor(account);
        uint256 vestingPeriodStart = lastClaimTimes[account];
        uint256 vestingPeriodEnd = vestingPeriodStart > 0 ? vestingPeriodStart + vestingDuration : 0;

        dividendInfo = new uint256[](11);

        dividendInfo[0] = withdrawableDividends;
        dividendInfo[1] = totalDividends;
        dividendInfo[2] = claimFactor;
        dividendInfo[3] = vestingPeriodStart;
        dividendInfo[4] = vestingPeriodEnd;

        dividendInfo[5] =  balanceOf(account);
        
        if(totalSupply() > 0) {
            dividendInfo[6] = dividendInfo[5] * 10000 / totalSupply();
        }

        dividendInfo[7] = autoClaimAccountIndex[account];

        AutoClaimInfo storage autoClaimInfo = autoClaims[dividendInfo[7]];

        dividendInfo[8] = uint256(uint160(autoClaimInfo.account));
        dividendInfo[9] = autoClaimInfo.time;

        dividendInfo[10] = autoClaimIndex;
    }


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

        _setBalance(account, newBalance);

        //Set this so vesting calculations work after the account get a balance
        if(newBalance > 0 && lastClaimTimes[account] == 0) {
            setLastClaimTime(account);
        }

        autoClaim(1);
    }

    uint256 public constant WITHDRAW_MAX_FACTOR = 10000;

    function getAccountClaimFactor(address account) public view returns (uint256) {
        uint256 lastClaimTime = lastClaimTimes[account];

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

        uint256 elapsed = block.timestamp - lastClaimTime;

        uint256 factor;

        if(elapsed >= vestingDuration) {
            factor = WITHDRAW_MAX_FACTOR;
        }
        else {
            factor = WITHDRAW_MAX_FACTOR * elapsed / vestingDuration;
        }

        return factor;
    }

    function distributeDividendsFromOwner(uint256 amount) external onlyOwner {
        try rewardToken.transferFrom(owner(), address(this), amount) returns (bool success) {
            if(success) {
                distributeDividends(amount);
            }
        } catch {
            
        }
    }

    function claimDividends(address account)
        external onlyOwner returns (bool) {
        return _claimDividends(account);
    }

    function _claimDividends(address account)
        private returns (bool) {
        uint256 withdrawableDividend = withdrawableDividendOf(account);

        if(withdrawableDividend == 0) {
            setLastClaimTime(account);
            return true;
        }

        uint256 factor = getAccountClaimFactor(account);

        withdrawnDividends[account] = withdrawnDividends[account].add(withdrawableDividend);
        emit DividendWithdrawn(account, withdrawableDividend);

        uint256 vestedAmount = withdrawableDividend * factor / WITHDRAW_MAX_FACTOR;
        uint256 unvestedAmount = withdrawableDividend - vestedAmount;

        try rewardToken.transfer(account, vestedAmount) returns (bool success) {
            if(!success) {
                withdrawnDividends[account] = withdrawnDividends[account].sub(withdrawableDividend);
                return false;
            }
        } catch {
            withdrawnDividends[account] = withdrawnDividends[account].sub(withdrawableDividend);
            return false;
        }

        uint256 toMarketing = 0;
        uint256 toDivs = 0;

        if(unvestedAmount > 0) {
            toMarketing = unvestedAmount / 3;
            toDivs = unvestedAmount - toMarketing;

            try rewardToken.transfer(Ownable(owner()).owner(), toMarketing) returns (bool success) {
                if(!success) {
                    distributeDividends(toMarketing);
                }
            } catch {
                distributeDividends(toMarketing);
            }

            distributeDividends(toDivs);
        }

        setLastClaimTime(account);

        emit Claim(account, factor, vestedAmount, toMarketing, toDivs);

        return true;
    }

    function setLastClaimTime(address account) private {
        lastClaimTimes[account] = block.timestamp;

        if(autoClaimAccountIndex[account] != 0) {
            delete autoClaims[autoClaimAccountIndex[account]];
        }

        AutoClaimInfo memory autoClaimInfo;

        autoClaimInfo.account = account;
        autoClaimInfo.time = block.timestamp + vestingDuration;

        autoClaimAccountIndex[account] = autoClaims.length;
        autoClaims.push(autoClaimInfo);
    }

    function autoClaim(uint256 amount) public {
        uint256 iterations = 0;

        for(uint256 i = autoClaimIndex; i < autoClaims.length && iterations < amount; i++) {
            AutoClaimInfo storage autoClaimInfo = autoClaims[i];

            if(autoClaimInfo.time > block.timestamp) {
                return;
            }

            if(autoClaimInfo.account != address(0)) {
                _claimDividends(autoClaimInfo.account);
            }

            autoClaimIndex++;
            iterations++;
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"peakPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dipPercent","type":"uint256"}],"name":"DipPayout","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"notbot","type":"address"}],"name":"delBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"excludeFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getData","outputs":[{"internalType":"uint256[]","name":"dividendInfo","type":"uint256[]"},{"internalType":"uint256","name":"dipPoolBalance","type":"uint256"},{"internalType":"uint256","name":"dip","type":"uint256"},{"internalType":"uint256","name":"lastDipPayoutAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"meditationRewards","outputs":[{"internalType":"contract MeditationRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeStrictWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTokensToSwapForFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"swapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMeditationRewards","type":"address"}],"name":"updateMeditationRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"updateSlippageDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055506000601660026101000a81548160ff021916908315150217905550601c5460175560026019556002601a556014601b556b033b2e3c9fd0803ce8000000601c553480156200008757600080fd5b506040518060400160405280600a81526020017f536f6e4f665473756b61000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f24534f540000000000000000000000000000000000000000000000000000000081525081600390805190602001906200010c92919062000eb7565b5080600490805190602001906200012592919062000eb7565b50505060006200013a62000a8a60201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350739549fc2bf891a8bc103e49657a3816c565b74947600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737cc26593f13085c6cc8cc8981689964ebd5a3e5c600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760006200029962000a9260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600760003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160076000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860006200044c62000a9260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600860003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550737a250d5630b4cf539739df2c5dacb4c659f2488d601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c5fb36dd2fb59d3b98deff88425a3f425ee469ed601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200065d57600080fd5b505afa15801562000672573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000698919062000fba565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016200071892919062001101565b60206040518083038186803b1580156200073157600080fd5b505afa15801562000746573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200076c919062000fba565b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007bc62000abc60201b60201c565b30601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051620008119062000f48565b6200081f93929190620010c4565b604051809103906000f0801580156200083c573d6000803e3d6000fd5b50601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620008fc9190620010a7565b600060405180830381600087803b1580156200091757600080fd5b505af11580156200092c573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0306040518263ffffffff1660e01b81526004016200098d9190620010a7565b600060405180830381600087803b158015620009a857600080fd5b505af1158015620009bd573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db062000a0f62000a9260201b60201c565b6040518263ffffffff1660e01b815260040162000a2d9190620010a7565b600060405180830381600087803b15801562000a4857600080fd5b505af115801562000a5d573d6000803e3d6000fd5b5050505062000a8462000a7562000a9260201b60201c565b601c5462000d3f60201b60201c565b6200138a565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b43601d60050154141562000ad05762000d3d565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801562000b6957600080fd5b505afa15801562000b7e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ba4919062000fe6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801562000c3457600080fd5b505afa15801562000c49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c6f919062000fba565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000ce25782601d6003018190555081601d6004018190555062000cf7565b81601d6003018190555082601d600401819055505b6000601d60050154141562000d2f5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000da9906200112e565b60405180910390fd5b62000dc66000838362000ead60201b60201c565b806002600082825462000dda91906200117e565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000e8d919062001150565b60405180910390a362000ea96000838362000eb260201b60201c565b5050565b505050565b505050565b82805462000ec5906200127f565b90600052602060002090601f01602090048101928262000ee9576000855562000f35565b82601f1062000f0457805160ff191683800117855562000f35565b8280016001018555821562000f35579182015b8281111562000f3457825182559160200191906001019062000f17565b5b50905062000f44919062000f56565b5090565b6146cd806200737483390190565b5b8082111562000f7157600081600090555060010162000f57565b5090565b60008151905062000f86816200133c565b92915050565b60008151905062000f9d8162001356565b92915050565b60008151905062000fb48162001370565b92915050565b60006020828403121562000fcd57600080fd5b600062000fdd8482850162000f75565b91505092915050565b60008060006060848603121562000ffc57600080fd5b60006200100c8682870162000f8c565b93505060206200101f8682870162000f8c565b9250506040620010328682870162000fa3565b9150509250925092565b6200104781620011ef565b82525050565b6200105881620011db565b82525050565b620010698162001257565b82525050565b60006200107e601f836200116d565b91506200108b8262001313565b602082019050919050565b620010a1816200123d565b82525050565b6000602082019050620010be60008301846200104d565b92915050565b6000606082019050620010db60008301866200103c565b620010ea60208301856200105e565b620010f960408301846200105e565b949350505050565b60006040820190506200111860008301856200104d565b6200112760208301846200104d565b9392505050565b6000602082019050818103600083015262001149816200106f565b9050919050565b600060208201905062001167600083018462001096565b92915050565b600082825260208201905092915050565b60006200118b826200123d565b915062001198836200123d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620011d057620011cf620012b5565b5b828201905092915050565b6000620011e8826200121d565b9050919050565b6000620011fc826200121d565b9050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600062001264826200126b565b9050919050565b600062001278826200121d565b9050919050565b600060028204905060018216806200129857607f821691505b60208210811415620012af57620012ae620012e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6200134781620011db565b81146200135357600080fd5b50565b620013618162001203565b81146200136d57600080fd5b50565b6200137b8162001247565b81146200138757600080fd5b50565b615fda806200139a6000396000f3fe6080604052600436106101c65760003560e01c8063715018a6116100f7578063a457c2d711610095578063cd6ef3a411610064578063cd6ef3a414610626578063dd62ed3e1461064f578063f2fde38b1461068c578063f57d8ac1146106b5576101cd565b8063a457c2d71461056c578063a9059cbb146105a9578063b515566a146105e6578063c9567bf91461060f576101cd565b80637b4e8038116100d15780637b4e8038146104d65780638da5cb5b146104ff57806395d89b411461052a57806399ce371a14610555576101cd565b8063715018a61461046b5780637229006914610482578063729d8a87146104ad576101cd565b806338266b221161016457806353674ba61161013e57806353674ba6146103b357806358609754146103dc5780635932ead11461040557806370a082311461042e576101cd565b806338266b221461031f578063395093511461035f5780634e71d92d1461039c576101cd565b806323b872dd116101a057806323b872dd14610265578063273123b7146102a25780632a5bdc33146102cb578063313ce567146102f4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106de565b6040516101f491906153e7565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190614ca6565b610770565b60405161023191906153b1565b60405180910390f35b34801561024657600080fd5b5061024f610793565b60405161025c91906155a9565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190614c57565b61079d565b60405161029991906153b1565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190614bc9565b6107cc565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190614bc9565b6108be565b005b34801561030057600080fd5b506103096109b0565b60405161031691906156bd565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190614bc9565b6109b9565b6040516103569493929190615365565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190614ca6565b610b30565b60405161039391906153b1565b60405180910390f35b3480156103a857600080fd5b506103b1610b67565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190614e05565b610c17565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190614ca6565b610cb8565b005b34801561041157600080fd5b5061042c60048036038101906104279190614d64565b610ecb565b005b34801561043a57600080fd5b5061045560048036038101906104509190614bc9565b610f7f565b60405161046291906155a9565b60405180910390f35b34801561047757600080fd5b50610480610fc7565b005b34801561048e57600080fd5b5061049761111f565b6040516104a491906153cc565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190614e05565b611145565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614e05565b6111e6565b005b34801561050b57600080fd5b50610514611289565b6040516105219190615251565b60405180910390f35b34801561053657600080fd5b5061053f6112b3565b60405161054c91906153e7565b60405180910390f35b34801561056157600080fd5b5061056a611345565b005b34801561057857600080fd5b50610593600480360381019061058e9190614ca6565b6113e7565b6040516105a091906153b1565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614ca6565b61145e565b6040516105dd91906153b1565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190614ce2565b611481565b005b34801561061b57600080fd5b506106246116a0565b005b34801561063257600080fd5b5061064d60048036038101906106489190614bc9565b61202c565b005b34801561065b57600080fd5b5061067660048036038101906106719190614c1b565b612107565b60405161068391906155a9565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190614bc9565b61218e565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190614e05565b6122a1565b005b6060600380546106ed90615abf565b80601f016020809104026020016040519081016040528092919081815260200182805461071990615abf565b80156107665780601f1061073b57610100808354040283529160200191610766565b820191906000526020600020905b81548152906001019060200180831161074957829003601f168201915b5050505050905090565b60008061077b612350565b9050610788818585612358565b600191505092915050565b6000600254905090565b6000806107a8612350565b90506107b5858285612523565b6107c08585856125af565b60019150509392505050565b6107d4612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90615569565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6108c6612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90615569565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b60606000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2e6819b866040518263ffffffff1660e01b8152600401610a1b9190615251565b60006040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190614d23565b9350601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610acd9190615251565b60206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614e2e565b9250602454915060255490509193509193565b600080610b3b612350565b9050610b5c818585610b4d8589612107565b610b579190615882565b612358565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b8152600401610bc29190615251565b602060405180830381600087803b158015610bdc57600080fd5b505af1158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190614d8d565b50565b610c1f612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590615569565b60405180910390fd5b80600c8190555050565b610cc0612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690615569565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dce611289565b836040518363ffffffff1660e01b8152600401610dec92919061533c565b602060405180830381600087803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3e9190614d8d565b506000471115610ec7576000610e52611289565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e759061523c565b60006040518083038185875af1925050503d8060008114610eb2576040519150601f19603f3d011682016040523d82523d6000602084013e610eb7565b606091505b5050905080610ec557600080fd5b505b5050565b610ed3612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990615569565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcf612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61114d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390615569565b60405180910390fd5b80600d8190555050565b6111ee612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490615569565b60405180910390fd5b6112868161321c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c290615abf565b80601f01602080910402602001604051908101604052809291908181526020018280546112ee90615abf565b801561133b5780601f106113105761010080835404028352916020019161133b565b820191906000526020600020905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615569565b60405180910390fd5b601c54601781905550565b6000806113f2612350565b905060006114008286612107565b905083811015611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906154e9565b60405180910390fd5b6114528286868403612358565b60019250505092915050565b600080611469612350565b90506114768185856125af565b600191505092915050565b611489612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90615569565b60405180910390fd5b60005b815181101561169c57600160096000848481518110611563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0838381518110611633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116579190615251565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615b22565b91505061151b565b5050565b6116a8612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615569565b60405180910390fd5b60006015541461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390615509565b60405180910390fd5b6117ab30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601c54612358565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161184a92919061533c565b602060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189c9190614d8d565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190614bf2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611999929190615295565b602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190614bf2565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611aa89190615251565b600060405180830381600087803b158015611ac257600080fd5b505af1158015611ad6573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b579190615251565b600060405180830381600087803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b50505050600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a905050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da79190615251565b60206040518083038186803b158015611dbf57600080fd5b505afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df79190614e2e565b611e0030610f7f565b600080611e0b611289565b426040518963ffffffff1660e01b8152600401611e2f9897969594939291906152be565b606060405180830381600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614e57565b5050506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff02191690831515021790555060646002601c54611ecb9190615909565b611ed591906158d8565b601781905550426015819055506103e86001601c54611ef49190615909565b611efe91906158d8565b600c819055506103e86002601c54611f169190615909565b611f2091906158d8565b600d81905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611fc592919061533c565b602060405180830381600087803b158015611fdf57600080fd5b505af1158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190614d8d565b50612020613936565b61202a6000613bac565b565b612034612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90615569565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612196612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90615429565b60405180910390fd5b61229e81613e94565b50565b6122a9612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90615569565b60405180910390fd5b606481111561234657600080fd5b80601b8190555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90615589565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90615449565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161251691906155a9565b60405180910390a3505050565b600061252f8484612107565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a9578181101561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906154a9565b60405180910390fd5b6125a88484848403612358565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690615489565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126d3576126ce838383613f5a565b613217565b6126db611289565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127495750612719611289565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612cce576000601554118061278a57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61279357600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128375750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61284057600080fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156128eb5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129415750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156129595750601660029054906101000a900460ff165b15612b49576017548161296b84610f7f565b6129759190615882565b111561298057600080fd5b42600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106129cb57600080fd5b600f426129d89190615882565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ab457506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15612b4457600060155442612ac99190615963565b9050601e811015612b42576000607882601e612ae59190615963565b612aef9190615909565b90508042612afd9190615882565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b612c1d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c1c5742600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290615549565b60405180910390fd5b5b5b6000612c2830610f7f565b9050600c548110158015612c495750601660009054906101000a900460ff16155b8015612ca35750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cbb5750601660019054906101000a900460ff165b15612ccc57612ccb601b5461321c565b5b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d795750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612e2d57601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b8152600401612dd99190615251565b602060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2b9190614d8d565b505b6000601a54601954612e3f9190615882565b905060006015541480612e5e5750601660009054906101000a900460ff165b15612e6857600090505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f095750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1357600090505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612fc657600090505b600081111561300657600060648383612fdf9190615909565b612fe991906158d8565b9050612ff6853083613f5a565b80836130029190615963565b9250505b613011848484613f5a565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8561305987610f7f565b6040518363ffffffff1660e01b815260040161307692919061526c565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc846130f086610f7f565b6040518363ffffffff1660e01b815260040161310d92919061526c565b600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505050613147613936565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156131b057826131a990615b6b565b905061320b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561320a578290505b5b61321481613bac565b50505b505050565b6001601660006101000a81548160ff021916908315150217905550600061324230610f7f565b90506000819050600d5481111561325957600d5490505b6000601954601a5461326b9190615882565b601a54836132799190615909565b61328391906158d8565b9050600081836132939190615963565b905061329e826141d2565b6132a747614530565b60006132b3600061463c565b9050600068056bc75e2d6310000082846132cd9190615909565b6132d791906158d8565b90506000601d6003015490506000601d600401549050601d6005015443141561330b57601d600001549150601d6001015490505b600082828561331a9190615909565b61332491906158d8565b905060648a60646133359190615963565b826133409190615909565b61334a91906158d8565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133a99190615251565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614e2e565b90506000600367ffffffffffffffff81111561343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b50905030816000815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613541577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106135d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061363f30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d79589858430426040518663ffffffff1660e01b81526004016136a295949392919061561e565b600060405180830381600087803b1580156136bc57600080fd5b505af19250505080156136cd575060015b6136d6576136d7565b5b600082601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137359190615251565b60206040518083038186803b15801561374d57600080fd5b505afa158015613761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137859190614e2e565b61378f9190615963565b9050600081111561390c5760006002826137a991906158d8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161382a92919061533c565b602060405180830381600087803b15801561384457600080fd5b505af1158015613858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061387c9190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b81526004016138d891906155a9565b600060405180830381600087803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b50505050505b6000601660006101000a81548160ff02191690831515021790555050505050505050505050505050565b43601d60050154141561394857613baa565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156139e057600080fd5b505afa1580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613aa757600080fd5b505afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf9190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b505782601d6003018190555081601d60040181905550613b65565b81601d6003018190555082601d600401819055505b6000601d600501541415613b9c5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b6000613bb78261463c565b90506000811415613bc85750613e91565b602354811115613bda57806023819055505b602354606482613bea9190615909565b613bf491906158d8565b6064613c009190615963565b602481905550603260245410613e8f57600060646032601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c719190615251565b60206040518083038186803b158015613c8957600080fd5b505afa158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc19190614e2e565b613ccb9190615909565b613cd591906158d8565b90507f75a56278d9bb7100eb58040300f14109299b3494d97d5fc015b06c8ca27c5fec8183602354602454604051613d109493929190615678565b60405180910390a1601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613d9792919061533c565b602060405180830381600087803b158015613db157600080fd5b505af1158015613dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de99190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b8152600401613e4591906155a9565b600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b5050505081602381905550600060248190555080602581905550505b505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc190615409565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561403a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403190615489565b60405180910390fd5b6140458383836148c3565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156140cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c2906154c9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516141b991906155a9565b60405180910390a36141cc8484846148c8565b50505050565b6000600367ffffffffffffffff811115614215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156142435781602001602082028036833780820191505090505b5090503081600081518110614281577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110614318577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156143ba57600080fd5b505afa1580156143ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143f29190614bf2565b8160028151811061442c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061449330601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144f79594939291906155c4565b600060405180830381600087803b15801561451157600080fd5b505af1925050508015614522575060015b61452b5761452c565b5b5050565b6000614559606461454b603c856148cd90919063ffffffff16565b61494890919063ffffffff16565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156145c3573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc828461460c9190615963565b9081150290604051600060405180830381858888f19350505050158015614637573d6000803e3d6000fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561469d57600090506148be565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470857600080fd5b505afa15801561471c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147409190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156147cf57600080fd5b505afa1580156147e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148079190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461486b576000839050829350809250505b600082846148799190615909565b9050858361488791906157ee565b9250828161489591906158d8565b93508268056bc75e2d63100000856148ad9190615909565b6148b791906158d8565b9450505050505b919050565b505050565b505050565b6000808314156148e05760009050614942565b600082846148ee9190615909565b90508284826148fd91906158d8565b1461493d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161493490615529565b60405180910390fd5b809150505b92915050565b600061498a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614992565b905092915050565b600080831182906149d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149d091906153e7565b60405180910390fd5b50600083856149e891906158d8565b9050809150509392505050565b6000614a08614a03846156fd565b6156d8565b90508083825260208201905082856020860282011115614a2757600080fd5b60005b85811015614a575781614a3d8882614acd565b845260208401935060208301925050600181019050614a2a565b5050509392505050565b6000614a74614a6f84615729565b6156d8565b90508083825260208201905082856020860282011115614a9357600080fd5b60005b85811015614ac35781614aa98882614b9f565b845260208401935060208301925050600181019050614a96565b5050509392505050565b600081359050614adc81615f31565b92915050565b600081519050614af181615f31565b92915050565b600082601f830112614b0857600080fd5b8135614b188482602086016149f5565b91505092915050565b600082601f830112614b3257600080fd5b8151614b42848260208601614a61565b91505092915050565b600081359050614b5a81615f48565b92915050565b600081519050614b6f81615f48565b92915050565b600081519050614b8481615f5f565b92915050565b600081359050614b9981615f76565b92915050565b600081519050614bae81615f76565b92915050565b600081519050614bc381615f8d565b92915050565b600060208284031215614bdb57600080fd5b6000614be984828501614acd565b91505092915050565b600060208284031215614c0457600080fd5b6000614c1284828501614ae2565b91505092915050565b60008060408385031215614c2e57600080fd5b6000614c3c85828601614acd565b9250506020614c4d85828601614acd565b9150509250929050565b600080600060608486031215614c6c57600080fd5b6000614c7a86828701614acd565b9350506020614c8b86828701614acd565b9250506040614c9c86828701614b8a565b9150509250925092565b60008060408385031215614cb957600080fd5b6000614cc785828601614acd565b9250506020614cd885828601614b8a565b9150509250929050565b600060208284031215614cf457600080fd5b600082013567ffffffffffffffff811115614d0e57600080fd5b614d1a84828501614af7565b91505092915050565b600060208284031215614d3557600080fd5b600082015167ffffffffffffffff811115614d4f57600080fd5b614d5b84828501614b21565b91505092915050565b600060208284031215614d7657600080fd5b6000614d8484828501614b4b565b91505092915050565b600060208284031215614d9f57600080fd5b6000614dad84828501614b60565b91505092915050565b600080600060608486031215614dcb57600080fd5b6000614dd986828701614b75565b9350506020614dea86828701614b75565b9250506040614dfb86828701614bb4565b9150509250925092565b600060208284031215614e1757600080fd5b6000614e2584828501614b8a565b91505092915050565b600060208284031215614e4057600080fd5b6000614e4e84828501614b9f565b91505092915050565b600080600060608486031215614e6c57600080fd5b6000614e7a86828701614b9f565b9350506020614e8b86828701614b9f565b9250506040614e9c86828701614b9f565b9150509250925092565b6000614eb28383614ee5565b60208301905092915050565b6000614eca838361520f565b60208301905092915050565b614edf81615a20565b82525050565b614eee81615997565b82525050565b614efd81615997565b82525050565b6000614f0e82615775565b614f1881856157b0565b9350614f2383615755565b8060005b83811015614f54578151614f3b8882614ea6565b9750614f4683615796565b925050600181019050614f27565b5085935050505092915050565b6000614f6c82615780565b614f7681856157c1565b9350614f8183615765565b8060005b83811015614fb2578151614f998882614ebe565b9750614fa4836157a3565b925050600181019050614f85565b5085935050505092915050565b614fc8816159a9565b82525050565b614fd781615a32565b82525050565b614fe681615a56565b82525050565b6000614ff78261578b565b61500181856157dd565b9350615011818560208601615a8c565b61501a81615c70565b840191505092915050565b6000615032601d836157dd565b915061503d82615c81565b602082019050919050565b60006150556026836157dd565b915061506082615caa565b604082019050919050565b60006150786022836157dd565b915061508382615cf9565b604082019050919050565b600061509b601e836157dd565b91506150a682615d48565b602082019050919050565b60006150be601c836157dd565b91506150c982615d71565b602082019050919050565b60006150e1601d836157dd565b91506150ec82615d9a565b602082019050919050565b6000615104601f836157dd565b915061510f82615dc3565b602082019050919050565b6000615127601e836157dd565b915061513282615dec565b602082019050919050565b600061514a600c836157dd565b915061515582615e15565b602082019050919050565b600061516d6021836157dd565b915061517882615e3e565b604082019050919050565b60006151906004836157dd565b915061519b82615e8d565b602082019050919050565b60006151b36020836157dd565b91506151be82615eb6565b602082019050919050565b60006151d66000836157d2565b91506151e182615edf565b600082019050919050565b60006151f96024836157dd565b915061520482615ee2565b604082019050919050565b615218816159f9565b82525050565b615227816159f9565b82525050565b61523681615a13565b82525050565b6000615247826151c9565b9150819050919050565b60006020820190506152666000830184614ef4565b92915050565b60006040820190506152816000830185614ed6565b61528e602083018461521e565b9392505050565b60006040820190506152aa6000830185614ef4565b6152b76020830184614ef4565b9392505050565b6000610100820190506152d4600083018b614ef4565b6152e1602083018a614ef4565b6152ee604083018961521e565b6152fb606083018861521e565b6153086080830187614fdd565b61531560a0830186614fdd565b61532260c0830185614ef4565b61532f60e083018461521e565b9998505050505050505050565b60006040820190506153516000830185614ef4565b61535e602083018461521e565b9392505050565b6000608082019050818103600083015261537f8187614f61565b905061538e602083018661521e565b61539b604083018561521e565b6153a8606083018461521e565b95945050505050565b60006020820190506153c66000830184614fbf565b92915050565b60006020820190506153e16000830184614fce565b92915050565b600060208201905081810360008301526154018184614fec565b905092915050565b6000602082019050818103600083015261542281615025565b9050919050565b6000602082019050818103600083015261544281615048565b9050919050565b600060208201905081810360008301526154628161506b565b9050919050565b600060208201905081810360008301526154828161508e565b9050919050565b600060208201905081810360008301526154a2816150b1565b9050919050565b600060208201905081810360008301526154c2816150d4565b9050919050565b600060208201905081810360008301526154e2816150f7565b9050919050565b600060208201905081810360008301526155028161511a565b9050919050565b600060208201905081810360008301526155228161513d565b9050919050565b6000602082019050818103600083015261554281615160565b9050919050565b6000602082019050818103600083015261556281615183565b9050919050565b60006020820190508181036000830152615582816151a6565b9050919050565b600060208201905081810360008301526155a2816151ec565b9050919050565b60006020820190506155be600083018461521e565b92915050565b600060a0820190506155d9600083018861521e565b6155e66020830187614fdd565b81810360408301526155f88186614f03565b90506156076060830185614ef4565b615614608083018461521e565b9695505050505050565b600060a082019050615633600083018861521e565b615640602083018761521e565b81810360408301526156528186614f03565b90506156616060830185614ef4565b61566e608083018461521e565b9695505050505050565b600060808201905061568d600083018761521e565b61569a602083018661521e565b6156a7604083018561521e565b6156b4606083018461521e565b95945050505050565b60006020820190506156d2600083018461522d565b92915050565b60006156e26156f3565b90506156ee8282615af1565b919050565b6000604051905090565b600067ffffffffffffffff82111561571857615717615c41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561574457615743615c41565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006157f9826159b5565b9150615804836159b5565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561583f5761583e615bb4565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561587757615876615bb4565b5b828201905092915050565b600061588d826159f9565b9150615898836159f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158cd576158cc615bb4565b5b828201905092915050565b60006158e3826159f9565b91506158ee836159f9565b9250826158fe576158fd615be3565b5b828204905092915050565b6000615914826159f9565b915061591f836159f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561595857615957615bb4565b5b828202905092915050565b600061596e826159f9565b9150615979836159f9565b92508282101561598c5761598b615bb4565b5b828203905092915050565b60006159a2826159d9565b9050919050565b60008115159050919050565b6000819050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000615a2b82615a68565b9050919050565b6000615a3d82615a44565b9050919050565b6000615a4f826159d9565b9050919050565b6000615a61826159f9565b9050919050565b6000615a7382615a7a565b9050919050565b6000615a85826159d9565b9050919050565b60005b83811015615aaa578082015181840152602081019050615a8f565b83811115615ab9576000848401525b50505050565b60006002820490506001821680615ad757607f821691505b60208210811415615aeb57615aea615c12565b5b50919050565b615afa82615c70565b810181811067ffffffffffffffff82111715615b1957615b18615c41565b5b80604052505050565b6000615b2d826159f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b6057615b5f615bb4565b5b600182019050919050565b6000615b76826159b5565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615ba957615ba8615bb4565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f616c7265616479206f70656e0000000000000000000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f7761697400000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b615f3a81615997565b8114615f4557600080fd5b50565b615f51816159a9565b8114615f5c57600080fd5b50565b615f68816159bf565b8114615f7357600080fd5b50565b615f7f816159f9565b8114615f8a57600080fd5b50565b615f9681615a03565b8114615fa157600080fd5b5056fea264697066735822122005ffb5d7609075d0513f767483910cb20fbd35732a3fb8aea502620a0362952564736f6c6343000804003360e06040523480156200001157600080fd5b50604051620046cd380380620046cd8339818101604052810190620000379190620005ec565b6040518060400160405280601081526020017f4d656469746174696e52657761726473000000000000000000000000000000008152506040518060400160405280600981526020017f244d45444954415445000000000000000000000000000000000000000000000081525081818160039080519060200190620000bd929190620004de565b508060049080519060200190620000d6929190620004de565b5050506000620000eb620002e760201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050620d2f00600e819055506200024c83620002ef60201b60201c565b620002566200056f565b600f81908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155505060016010819055505050505062000852565b600033905090565b620002ff620002e760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000391576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038890620006b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000404576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fb9062000690565b60405180910390fd5b62000415816200041860201b60201c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ec9062000741565b90600052602060002090601f0160209004810192826200051057600085556200055c565b82601f106200052b57805160ff19168380011785556200055c565b828001600101855582156200055c579182015b828111156200055b5782518255916020019190600101906200053e565b5b5090506200056b91906200059f565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b5b80821115620005ba576000816000905550600101620005a0565b5090565b600081519050620005cf816200081e565b92915050565b600081519050620005e68162000838565b92915050565b6000806000606084860312156200060257600080fd5b60006200061286828701620005be565b93505060206200062586828701620005d5565b92505060406200063886828701620005d5565b9150509250925092565b600062000651602683620006d4565b91506200065e82620007a6565b604082019050919050565b600062000678602083620006d4565b91506200068582620007f5565b602082019050919050565b60006020820190508181036000830152620006ab8162000642565b9050919050565b60006020820190508181036000830152620006cd8162000669565b9050919050565b600082825260208201905092915050565b6000620006f28262000721565b9050919050565b6000620007068262000721565b9050919050565b60006200071a82620006e5565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200075a57607f821691505b6020821081141562000771576200077062000777565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200082981620006f9565b81146200083557600080fd5b50565b62000843816200070d565b81146200084f57600080fd5b50565b60805160601c60a05160601c60c05160601c613e2d620008a0600039600061114d01526000818161077901528181611b050152818161219501526123b301526000611b290152613e2d6000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063aafd847a116100ad578063dd62ed3e1161007c578063dd62ed3e1461063c578063e30443bc1461066c578063f2fde38b14610688578063f7c618c1146106a4578063fc0c546a146106c2576101fb565b8063aafd847a1461058e578063b2e6819b146105be578063bc091122146105ee578063c7e772ed1461060c576101fb565b8063a8b9d240116100e9578063a8b9d240146104e0578063a9059cbb14610510578063a93a8d2214610540578063a9d75b2b14610570576101fb565b80638da5cb5b1461044457806391b89fba1461046257806395d89b4114610492578063a457c2d7146104b0576101fb565b8063313ce567116101925780634e7b827f116101615780634e7b827f146103bc57806370a08231146103ec578063715018a61461041c57806385a6b3ae14610426576101fb565b8063313ce5671461033657806331e79db014610354578063395093511461037057806340b63369146103a0576101fb565b806318160ddd116101ce57806318160ddd14610288578063226cfa3d146102a657806323b872dd146102d657806327ce014714610306576101fb565b806303dd6b901461020057806306fdde031461021c578063095ea7b31461023a5780631514617e1461026a575b600080fd5b61021a6004803603810190610215919061306d565b6106e0565b005b610224610844565b6040516102319190613440565b60405180910390f35b610254600480360381019061024f9190613008565b6108d6565b60405161026191906133ef565b60405180910390f35b6102726108f9565b60405161027f91906135e2565b60405180910390f35b6102906108ff565b60405161029d91906135e2565b60405180910390f35b6102c060048036038101906102bb9190612f2b565b610909565b6040516102cd91906135e2565b60405180910390f35b6102f060048036038101906102eb9190612fb9565b610921565b6040516102fd91906133ef565b60405180910390f35b610320600480360381019061031b9190612f2b565b610950565b60405161032d91906135e2565b60405180910390f35b61033e6109f3565b60405161034b9190613642565b60405180910390f35b61036e60048036038101906103699190612f2b565b6109fc565b005b61038a60048036038101906103859190613008565b610b94565b60405161039791906133ef565b60405180910390f35b6103ba60048036038101906103b5919061306d565b610bcb565b005b6103d660048036038101906103d19190612f2b565b610d13565b6040516103e391906133ef565b60405180910390f35b61040660048036038101906104019190612f2b565b610d33565b60405161041391906135e2565b60405180910390f35b610424610d7b565b005b61042e610ed3565b60405161043b91906135e2565b60405180910390f35b61044c610ed9565b6040516104599190613352565b60405180910390f35b61047c60048036038101906104779190612f2b565b610f03565b60405161048991906135e2565b60405180910390f35b61049a610f15565b6040516104a79190613440565b60405180910390f35b6104ca60048036038101906104c59190613008565b610fa7565b6040516104d791906133ef565b60405180910390f35b6104fa60048036038101906104f59190612f2b565b61101e565b60405161050791906135e2565b60405180910390f35b61052a60048036038101906105259190613008565b611081565b60405161053791906133ef565b60405180910390f35b61055a60048036038101906105559190612f2b565b6110a4565b60405161056791906135e2565b60405180910390f35b61057861114b565b604051610585919061340a565b60405180910390f35b6105a860048036038101906105a39190612f2b565b61116f565b6040516105b591906135e2565b60405180910390f35b6105d860048036038101906105d39190612f2b565b6111b8565b6040516105e591906133cd565b60405180910390f35b6105f6611755565b60405161060391906135e2565b60405180910390f35b61062660048036038101906106219190612f2b565b61175b565b60405161063391906133ef565b60405180910390f35b61065660048036038101906106519190612f7d565b611804565b60405161066391906135e2565b60405180910390f35b61068660048036038101906106819190613008565b61188b565b005b6106a2600480360381019061069d9190612f2b565b6119f0565b005b6106ac611b03565b6040516106b9919061340a565b60405180910390f35b6106ca611b27565b6040516106d79190613425565b60405180910390f35b6106e8611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90613562565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd6107bb610ed9565b30846040518463ffffffff1660e01b81526004016107db9392919061336d565b602060405180830381600087803b1580156107f557600080fd5b505af192505050801561082657506040513d601f19601f820116820180604052508101906108239190613044565b60015b61082f57610841565b801561083f5761083e82611b53565b5b505b50565b606060038054610853906139c9565b80601f016020809104026020016040519081016040528092919081815260200182805461087f906139c9565b80156108cc5780601f106108a1576101008083540402835291602001916108cc565b820191906000526020600020905b8154815290600101906020018083116108af57829003601f168201915b5050505050905090565b6000806108e1611b4b565b90506108ee818585611c2d565b600191505092915050565b600e5481565b6000600254905090565b600d6020528060005260406000206000915090505481565b60008061092c611b4b565b9050610939858285611df8565b610944858585611e84565b60019150509392505050565b60007001000000000000000000000000000000006109e26109dd600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109cf6109ca6109b988610d33565b600754611ee590919063ffffffff16565b611f60565b611f7d90919063ffffffff16565b611fc8565b6109ec919061379c565b9050919050565b60006012905090565b610a04611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a90613562565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aea57610b91565b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610b4d816000611fdf565b8073ffffffffffffffffffffffffffffffffffffffff167fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2560405160405180910390a25b50565b600080610b9f611b4b565b9050610bc0818585610bb18589611804565b610bbb9190613746565b611c2d565b600191505092915050565b60008060105490505b600f8054905081108015610be757508282105b15610d0d576000600f8281548110610c28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190504281600101541115610c4c57505050610d10565b600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cd357610cd18160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661204c565b505b60106000815480929190610ce6906139fb565b91905055508280610cf6906139fb565b935050508080610d05906139fb565b915050610bd4565b50505b50565b600c6020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d83611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0990613562565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600b5481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610f0e8261101e565b9050919050565b606060048054610f24906139c9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f50906139c9565b8015610f9d5780601f10610f7257610100808354040283529160200191610f9d565b820191906000526020600020905b815481529060010190602001808311610f8057829003601f168201915b5050505050905090565b600080610fb2611b4b565b90506000610fc08286611804565b905083811015611005576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffc90613522565b60405180910390fd5b6110128286868403611c2d565b60019250505092915050565b600061107a600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461106c84610950565b61257590919063ffffffff16565b9050919050565b60008061108c611b4b565b9050611099818585611e84565b600191505092915050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156110fc576000915050611146565b6000814261110a91906138bb565b90506000600e54821061112157612710905061113f565b600e548261271061113291906137cd565b61113c919061379c565b90505b8093505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006111c58361101e565b905060006111d284610950565b905060006111df856110a4565b90506000600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211611235576000611244565b600e54826112439190613746565b5b9050600b67ffffffffffffffff811115611287577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112b55781602001602082028036833780820191505090505b50955084866000815181106112f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050838660018151811061133a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508286600281518110611381577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505081866003815181106113c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808660048151811061140f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505061142487610d33565b8660058151811061145e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060006114746108ff565b1115611522576114826108ff565b612710876005815181106114bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516114d191906137cd565b6114db919061379c565b86600681518110611515577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250505b601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548660078151811061159c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250506000600f876007815181106115e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181548110611625577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16876008815181106116aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508060010154876009815181106116f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060105487600a8151811061173e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050505050505050919050565b61271081565b6000611765611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613562565b60405180910390fd5b6117fd8261204c565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611893611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990613562565b60405180910390fd5b600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611979576119ec565b6119838282611fdf565b6000811180156119d257506000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156119e1576119e0826125bf565b5b6119eb6001610bcb565b5b5050565b6119f8611b4b565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e90613562565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aee906134a2565b60405180910390fd5b611b0081612827565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b6000611b5d6108ff565b11611b6757600080fd5b6000811115611c2a57611bba611b7b6108ff565b611b9f70010000000000000000000000000000000084611ee590919063ffffffff16565b611ba9919061379c565b6007546128ed90919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051611c0691906135e2565b60405180910390a2611c2381600b546128ed90919063ffffffff16565b600b819055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c94906135a2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d04906134c2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611deb91906135e2565b60405180910390a3505050565b6000611e048484611804565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611e7e5781811015611e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6790613502565b60405180910390fd5b611e7d8484848403611c2d565b5b50505050565b6001601260006101000a81548160ff0219169083151502179055506000611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed790613482565b60405180910390fd5b505050565b600080831415611ef85760009050611f5a565b60008284611f0691906137cd565b9050828482611f15919061379c565b14611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90613542565b60405180910390fd5b809150505b92915050565b6000808290506000811215611f7457600080fd5b80915050919050565b6000808284611f8c91906136b2565b905060008312158015611f9f5750838112155b80611fb55750600083128015611fb457508381125b5b611fbe57600080fd5b8091505092915050565b600080821215611fd757600080fd5b819050919050565b6000611fea83610d33565b90508082111561201b576000612009828461257590919063ffffffff16565b9050612015848261294b565b50612047565b80821015612046576000612038838361257590919063ffffffff16565b90506120448482612a0a565b505b5b505050565b6000806120588361101e565b905060008114156120765761206c836125bf565b6001915050612570565b6000612081846110a4565b90506120d582600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128ed90919063ffffffff16565b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8360405161215e91906135e2565b60405180910390a26000612710828461217791906137cd565b612181919061379c565b90506000818461219191906138bb565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87846040518363ffffffff1660e01b81526004016121ee9291906133a4565b602060405180830381600087803b15801561220857600080fd5b505af192505050801561223957506040513d601f19601f820116820180604052508101906122369190613044565b60015b6122df5761228f84600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257590919063ffffffff16565b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000945050505050612570565b806123875761233685600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461257590919063ffffffff16565b600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600095505050505050612570565b506000806000831115612508576003836123a1919061379c565b915081836123af91906138bb565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f5610ed9565b73ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124729190612f54565b846040518363ffffffff1660e01b81526004016124909291906133a4565b602060405180830381600087803b1580156124aa57600080fd5b505af19250505080156124db57506040513d601f19601f820116820180604052508101906124d89190613044565b60015b6124ed576124e882611b53565b6124fe565b806124fc576124fb83611b53565b5b505b61250781611b53565b5b612511886125bf565b8773ffffffffffffffffffffffffffffffffffffffff167f68e1caf97c4c29c1ac46024e9590f80b7a1f690d393703879cf66eea4e1e84218686858560405161255d94939291906135fd565b60405180910390a2600196505050505050505b919050565b60006125b783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ac9565b905092915050565b42600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461270457600f601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815481106126c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905550505b61270c612ea7565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600e54426127529190613746565b816020018181525050600f80549050601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f81908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082846128fc9190613746565b905083811015612941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612938906134e2565b60405180910390fd5b8091505092915050565b6129558282612b2d565b6129c361297561297083600754611ee590919063ffffffff16565b611f60565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c8490919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b612a148282612ccf565b612a82612a34612a2f83600754611ee590919063ffffffff16565b611f60565b600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f7d90919063ffffffff16565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000838311158290612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b089190613440565b60405180910390fd5b5060008385612b2091906138bb565b9050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b94906135c2565b60405180910390fd5b612ba960008383612e9d565b8060026000828254612bbb9190613746565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612c6c91906135e2565b60405180910390a3612c8060008383612ea2565b5050565b6000808284612c939190613827565b905060008312158015612ca65750838113155b80612cbc5750600083128015612cbb57508381135b5b612cc557600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3690613582565b60405180910390fd5b612d4b82600083612e9d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc890613462565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612e8491906135e2565b60405180910390a3612e9883600084612ea2565b505050565b505050565b505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600081359050612ee681613db2565b92915050565b600081519050612efb81613db2565b92915050565b600081519050612f1081613dc9565b92915050565b600081359050612f2581613de0565b92915050565b600060208284031215612f3d57600080fd5b6000612f4b84828501612ed7565b91505092915050565b600060208284031215612f6657600080fd5b6000612f7484828501612eec565b91505092915050565b60008060408385031215612f9057600080fd5b6000612f9e85828601612ed7565b9250506020612faf85828601612ed7565b9150509250929050565b600080600060608486031215612fce57600080fd5b6000612fdc86828701612ed7565b9350506020612fed86828701612ed7565b9250506040612ffe86828701612f16565b9150509250925092565b6000806040838503121561301b57600080fd5b600061302985828601612ed7565b925050602061303a85828601612f16565b9150509250929050565b60006020828403121561305657600080fd5b600061306484828501612f01565b91505092915050565b60006020828403121561307f57600080fd5b600061308d84828501612f16565b91505092915050565b60006130a28383613325565b60208301905092915050565b6130b7816138ef565b82525050565b60006130c88261366d565b6130d28185613690565b93506130dd8361365d565b8060005b8381101561310e5781516130f58882613096565b975061310083613683565b9250506001810190506130e1565b5085935050505092915050565b61312481613901565b82525050565b6131338161394e565b82525050565b61314281613972565b82525050565b600061315382613678565b61315d81856136a1565b935061316d818560208601613996565b61317681613ad1565b840191505092915050565b600061318e6022836136a1565b915061319982613ae2565b604082019050919050565b60006131b16003836136a1565b91506131bc82613b31565b602082019050919050565b60006131d46026836136a1565b91506131df82613b5a565b604082019050919050565b60006131f76022836136a1565b915061320282613ba9565b604082019050919050565b600061321a601b836136a1565b915061322582613bf8565b602082019050919050565b600061323d601d836136a1565b915061324882613c21565b602082019050919050565b6000613260601e836136a1565b915061326b82613c4a565b602082019050919050565b60006132836021836136a1565b915061328e82613c73565b604082019050919050565b60006132a66020836136a1565b91506132b182613cc2565b602082019050919050565b60006132c96021836136a1565b91506132d482613ceb565b604082019050919050565b60006132ec6024836136a1565b91506132f782613d3a565b604082019050919050565b600061330f601f836136a1565b915061331a82613d89565b602082019050919050565b61332e81613937565b82525050565b61333d81613937565b82525050565b61334c81613941565b82525050565b600060208201905061336760008301846130ae565b92915050565b600060608201905061338260008301866130ae565b61338f60208301856130ae565b61339c6040830184613334565b949350505050565b60006040820190506133b960008301856130ae565b6133c66020830184613334565b9392505050565b600060208201905081810360008301526133e781846130bd565b905092915050565b6000602082019050613404600083018461311b565b92915050565b600060208201905061341f600083018461312a565b92915050565b600060208201905061343a6000830184613139565b92915050565b6000602082019050818103600083015261345a8184613148565b905092915050565b6000602082019050818103600083015261347b81613181565b9050919050565b6000602082019050818103600083015261349b816131a4565b9050919050565b600060208201905081810360008301526134bb816131c7565b9050919050565b600060208201905081810360008301526134db816131ea565b9050919050565b600060208201905081810360008301526134fb8161320d565b9050919050565b6000602082019050818103600083015261351b81613230565b9050919050565b6000602082019050818103600083015261353b81613253565b9050919050565b6000602082019050818103600083015261355b81613276565b9050919050565b6000602082019050818103600083015261357b81613299565b9050919050565b6000602082019050818103600083015261359b816132bc565b9050919050565b600060208201905081810360008301526135bb816132df565b9050919050565b600060208201905081810360008301526135db81613302565b9050919050565b60006020820190506135f76000830184613334565b92915050565b60006080820190506136126000830187613334565b61361f6020830186613334565b61362c6040830185613334565b6136396060830184613334565b95945050505050565b60006020820190506136576000830184613343565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006136bd8261390d565b91506136c88361390d565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561370357613702613a44565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561373b5761373a613a44565b5b828201905092915050565b600061375182613937565b915061375c83613937565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561379157613790613a44565b5b828201905092915050565b60006137a782613937565b91506137b283613937565b9250826137c2576137c1613a73565b5b828204905092915050565b60006137d882613937565b91506137e383613937565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561381c5761381b613a44565b5b828202905092915050565b60006138328261390d565b915061383d8361390d565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561387857613877613a44565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182136000841216156138b0576138af613a44565b5b828203905092915050565b60006138c682613937565b91506138d183613937565b9250828210156138e4576138e3613a44565b5b828203905092915050565b60006138fa82613917565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061395982613960565b9050919050565b600061396b82613917565b9050919050565b600061397d82613984565b9050919050565b600061398f82613917565b9050919050565b60005b838110156139b4578082015181840152602081019050613999565b838111156139c3576000848401525b50505050565b600060028204905060018216806139e157607f821691505b602082108114156139f5576139f4613aa2565b5b50919050565b6000613a0682613937565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3957613a38613a44565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e61680000000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613dbb816138ef565b8114613dc657600080fd5b50565b613dd281613901565b8114613ddd57600080fd5b50565b613de981613937565b8114613df457600080fd5b5056fea26469706673582212205212967d7afe5c28e0ad7f4eb9a90e2359353885e8228b9bfe8deb93666616be64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c8063715018a6116100f7578063a457c2d711610095578063cd6ef3a411610064578063cd6ef3a414610626578063dd62ed3e1461064f578063f2fde38b1461068c578063f57d8ac1146106b5576101cd565b8063a457c2d71461056c578063a9059cbb146105a9578063b515566a146105e6578063c9567bf91461060f576101cd565b80637b4e8038116100d15780637b4e8038146104d65780638da5cb5b146104ff57806395d89b411461052a57806399ce371a14610555576101cd565b8063715018a61461046b5780637229006914610482578063729d8a87146104ad576101cd565b806338266b221161016457806353674ba61161013e57806353674ba6146103b357806358609754146103dc5780635932ead11461040557806370a082311461042e576101cd565b806338266b221461031f578063395093511461035f5780634e71d92d1461039c576101cd565b806323b872dd116101a057806323b872dd14610265578063273123b7146102a25780632a5bdc33146102cb578063313ce567146102f4576101cd565b806306fdde03146101d2578063095ea7b3146101fd57806318160ddd1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106de565b6040516101f491906153e7565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f9190614ca6565b610770565b60405161023191906153b1565b60405180910390f35b34801561024657600080fd5b5061024f610793565b60405161025c91906155a9565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190614c57565b61079d565b60405161029991906153b1565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190614bc9565b6107cc565b005b3480156102d757600080fd5b506102f260048036038101906102ed9190614bc9565b6108be565b005b34801561030057600080fd5b506103096109b0565b60405161031691906156bd565b60405180910390f35b34801561032b57600080fd5b5061034660048036038101906103419190614bc9565b6109b9565b6040516103569493929190615365565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190614ca6565b610b30565b60405161039391906153b1565b60405180910390f35b3480156103a857600080fd5b506103b1610b67565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190614e05565b610c17565b005b3480156103e857600080fd5b5061040360048036038101906103fe9190614ca6565b610cb8565b005b34801561041157600080fd5b5061042c60048036038101906104279190614d64565b610ecb565b005b34801561043a57600080fd5b5061045560048036038101906104509190614bc9565b610f7f565b60405161046291906155a9565b60405180910390f35b34801561047757600080fd5b50610480610fc7565b005b34801561048e57600080fd5b5061049761111f565b6040516104a491906153cc565b60405180910390f35b3480156104b957600080fd5b506104d460048036038101906104cf9190614e05565b611145565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190614e05565b6111e6565b005b34801561050b57600080fd5b50610514611289565b6040516105219190615251565b60405180910390f35b34801561053657600080fd5b5061053f6112b3565b60405161054c91906153e7565b60405180910390f35b34801561056157600080fd5b5061056a611345565b005b34801561057857600080fd5b50610593600480360381019061058e9190614ca6565b6113e7565b6040516105a091906153b1565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190614ca6565b61145e565b6040516105dd91906153b1565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190614ce2565b611481565b005b34801561061b57600080fd5b506106246116a0565b005b34801561063257600080fd5b5061064d60048036038101906106489190614bc9565b61202c565b005b34801561065b57600080fd5b5061067660048036038101906106719190614c1b565b612107565b60405161068391906155a9565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae9190614bc9565b61218e565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190614e05565b6122a1565b005b6060600380546106ed90615abf565b80601f016020809104026020016040519081016040528092919081815260200182805461071990615abf565b80156107665780601f1061073b57610100808354040283529160200191610766565b820191906000526020600020905b81548152906001019060200180831161074957829003601f168201915b5050505050905090565b60008061077b612350565b9050610788818585612358565b600191505092915050565b6000600254905090565b6000806107a8612350565b90506107b5858285612523565b6107c08585856125af565b60019150509392505050565b6107d4612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085a90615569565b60405180910390fd5b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6108c6612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90615569565b60405180910390fd5b6001600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006012905090565b60606000806000601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2e6819b866040518263ffffffff1660e01b8152600401610a1b9190615251565b60006040518083038186803b158015610a3357600080fd5b505afa158015610a47573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610a709190614d23565b9350601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610acd9190615251565b60206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190614e2e565b9250602454915060255490509193509193565b600080610b3b612350565b9050610b5c818585610b4d8589612107565b610b579190615882565b612358565b600191505092915050565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed336040518263ffffffff1660e01b8152600401610bc29190615251565b602060405180830381600087803b158015610bdc57600080fd5b505af1158015610bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c149190614d8d565b50565b610c1f612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca590615569565b60405180910390fd5b80600c8190555050565b610cc0612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4690615569565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610daa57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dce611289565b836040518363ffffffff1660e01b8152600401610dec92919061533c565b602060405180830381600087803b158015610e0657600080fd5b505af1158015610e1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3e9190614d8d565b506000471115610ec7576000610e52611289565b73ffffffffffffffffffffffffffffffffffffffff1647604051610e759061523c565b60006040518083038185875af1925050503d8060008114610eb2576040519150601f19603f3d011682016040523d82523d6000602084013e610eb7565b606091505b5050905080610ec557600080fd5b505b5050565b610ed3612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5990615569565b60405180910390fd5b80601660026101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fcf612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61114d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390615569565b60405180910390fd5b80600d8190555050565b6111ee612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461127d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127490615569565b60405180910390fd5b6112868161321c565b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c290615abf565b80601f01602080910402602001604051908101604052809291908181526020018280546112ee90615abf565b801561133b5780601f106113105761010080835404028352916020019161133b565b820191906000526020600020905b81548152906001019060200180831161131e57829003601f168201915b5050505050905090565b61134d612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390615569565b60405180910390fd5b601c54601781905550565b6000806113f2612350565b905060006114008286612107565b905083811015611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906154e9565b60405180910390fd5b6114528286868403612358565b60019250505092915050565b600080611469612350565b90506114768185856125af565b600191505092915050565b611489612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f90615569565b60405180910390fd5b60005b815181101561169c57600160096000848481518110611563577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0838381518110611633577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016116579190615251565b600060405180830381600087803b15801561167157600080fd5b505af1158015611685573d6000803e3d6000fd5b50505050808061169490615b22565b91505061151b565b5050565b6116a8612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90615569565b60405180910390fd5b60006015541461177c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177390615509565b60405180910390fd5b6117ab30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601c54612358565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161184a92919061533c565b602060405180830381600087803b15801561186457600080fd5b505af1158015611878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189c9190614d8d565b50601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193d9190614bf2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611999929190615295565b602060405180830381600087803b1580156119b357600080fd5b505af11580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb9190614bf2565b601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611aa89190615251565b600060405180830381600087803b158015611ac257600080fd5b505af1158015611ad6573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166331e79db0601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611b579190615251565b600060405180830381600087803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b50505050600160086000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160086000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060076000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a905050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1630601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da79190615251565b60206040518083038186803b158015611dbf57600080fd5b505afa158015611dd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df79190614e2e565b611e0030610f7f565b600080611e0b611289565b426040518963ffffffff1660e01b8152600401611e2f9897969594939291906152be565b606060405180830381600087803b158015611e4957600080fd5b505af1158015611e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e819190614e57565b5050506001601660016101000a81548160ff0219169083151502179055506001601660026101000a81548160ff02191690831515021790555060646002601c54611ecb9190615909565b611ed591906158d8565b601781905550426015819055506103e86001601c54611ef49190615909565b611efe91906158d8565b600c819055506103e86002601c54611f169190615909565b611f2091906158d8565b600d81905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611fc592919061533c565b602060405180830381600087803b158015611fdf57600080fd5b505af1158015611ff3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120179190614d8d565b50612020613936565b61202a6000613bac565b565b612034612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90615569565b60405180910390fd5b80601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612196612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90615569565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90615429565b60405180910390fd5b61229e81613e94565b50565b6122a9612350565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232f90615569565b60405180910390fd5b606481111561234657600080fd5b80601b8190555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bf90615589565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90615449565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161251691906155a9565b60405180910390a3505050565b600061252f8484612107565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146125a9578181101561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906154a9565b60405180910390fd5b6125a88484848403612358565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561261f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261690615469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690615489565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126d3576126ce838383613f5a565b613217565b6126db611289565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156127495750612719611289565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612cce576000601554118061278a57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61279357600080fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156128375750600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b61284057600080fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480156128eb5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156129415750600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156129595750601660029054906101000a900460ff165b15612b49576017548161296b84610f7f565b6129759190615882565b111561298057600080fd5b42600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106129cb57600080fd5b600f426129d89190615882565b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612ab457506000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b15612b4457600060155442612ac99190615963565b9050601e811015612b42576000607882601e612ae59190615963565b612aef9190615909565b90508042612afd9190615882565b600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b505b612c1d565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612c1c5742600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1290615549565b60405180910390fd5b5b5b6000612c2830610f7f565b9050600c548110158015612c495750601660009054906101000a900460ff16155b8015612ca35750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015612cbb5750601660019054906101000a900460ff165b15612ccc57612ccb601b5461321c565b5b505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d795750601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15612e2d57601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c7e772ed846040518263ffffffff1660e01b8152600401612dd99190615251565b602060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2b9190614d8d565b505b6000601a54601954612e3f9190615882565b905060006015541480612e5e5750601660009054906101000a900460ff165b15612e6857600090505b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f095750600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612f1357600090505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612fbc5750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612fc657600090505b600081111561300657600060648383612fdf9190615909565b612fe991906158d8565b9050612ff6853083613f5a565b80836130029190615963565b9250505b613011848484613f5a565b601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc8561305987610f7f565b6040518363ffffffff1660e01b815260040161307692919061526c565b600060405180830381600087803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b50505050601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc846130f086610f7f565b6040518363ffffffff1660e01b815260040161310d92919061526c565b600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505050613147613936565b6000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156131b057826131a990615b6b565b905061320b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561320a578290505b5b61321481613bac565b50505b505050565b6001601660006101000a81548160ff021916908315150217905550600061324230610f7f565b90506000819050600d5481111561325957600d5490505b6000601954601a5461326b9190615882565b601a54836132799190615909565b61328391906158d8565b9050600081836132939190615963565b905061329e826141d2565b6132a747614530565b60006132b3600061463c565b9050600068056bc75e2d6310000082846132cd9190615909565b6132d791906158d8565b90506000601d6003015490506000601d600401549050601d6005015443141561330b57601d600001549150601d6001015490505b600082828561331a9190615909565b61332491906158d8565b905060648a60646133359190615963565b826133409190615909565b61334a91906158d8565b90506000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016133a99190615251565b60206040518083038186803b1580156133c157600080fd5b505afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190614e2e565b90506000600367ffffffffffffffff81111561343e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561346c5781602001602082028036833780820191505090505b50905030816000815181106134aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613541577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816002815181106135d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061363f30601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d79589858430426040518663ffffffff1660e01b81526004016136a295949392919061561e565b600060405180830381600087803b1580156136bc57600080fd5b505af19250505080156136cd575060015b6136d6576136d7565b5b600082601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016137359190615251565b60206040518083038186803b15801561374d57600080fd5b505afa158015613761573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137859190614e2e565b61378f9190615963565b9050600081111561390c5760006002826137a991906158d8565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161382a92919061533c565b602060405180830381600087803b15801561384457600080fd5b505af1158015613858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061387c9190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b81526004016138d891906155a9565b600060405180830381600087803b1580156138f257600080fd5b505af1158015613906573d6000803e3d6000fd5b50505050505b6000601660006101000a81548160ff02191690831515021790555050505050505050505050505050565b43601d60050154141561394857613baa565b601d60050154601d60020181905550601d60030154601d60000181905550601d60040154601d60010181905550600080601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156139e057600080fd5b505afa1580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015613aa757600080fd5b505afa158015613abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adf9190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b505782601d6003018190555081601d60040181905550613b65565b81601d6003018190555082601d600401819055505b6000601d600501541415613b9c5743601d60020181905550601d60030154601d60000181905550601d60040154601d600101819055505b43601d600501819055505050505b565b6000613bb78261463c565b90506000811415613bc85750613e91565b602354811115613bda57806023819055505b602354606482613bea9190615909565b613bf491906158d8565b6064613c009190615963565b602481905550603260245410613e8f57600060646032601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401613c719190615251565b60206040518083038186803b158015613c8957600080fd5b505afa158015613c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cc19190614e2e565b613ccb9190615909565b613cd591906158d8565b90507f75a56278d9bb7100eb58040300f14109299b3494d97d5fc015b06c8ca27c5fec8183602354602454604051613d109493929190615678565b60405180910390a1601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401613d9792919061533c565b602060405180830381600087803b158015613db157600080fd5b505af1158015613dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613de99190614d8d565b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166303dd6b90826040518263ffffffff1660e01b8152600401613e4591906155a9565b600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b5050505081602381905550600060248190555080602581905550505b505b50565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fc190615409565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561403a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161403190615489565b60405180910390fd5b6140458383836148c3565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156140cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140c2906154c9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516141b991906155a9565b60405180910390a36141cc8484846148c8565b50505050565b6000600367ffffffffffffffff811115614215577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156142435781602001602082028036833780820191505090505b5090503081600081518110614281577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110614318577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156143ba57600080fd5b505afa1580156143ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143f29190614bf2565b8160028151811061442c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061449330601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612358565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016144f79594939291906155c4565b600060405180830381600087803b15801561451157600080fd5b505af1925050508015614522575060015b61452b5761452c565b5b5050565b6000614559606461454b603c856148cd90919063ffffffff16565b61494890919063ffffffff16565b9050600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156145c3573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc828461460c9190615963565b9081150290604051600060405180830381858888f19350505050158015614637573d6000803e3d6000fd5b505050565b60008073ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561469d57600090506148be565b600080601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561470857600080fd5b505afa15801561471c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147409190614db6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156147cf57600080fd5b505afa1580156147e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148079190614bf2565b9050601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461486b576000839050829350809250505b600082846148799190615909565b9050858361488791906157ee565b9250828161489591906158d8565b93508268056bc75e2d63100000856148ad9190615909565b6148b791906158d8565b9450505050505b919050565b505050565b505050565b6000808314156148e05760009050614942565b600082846148ee9190615909565b90508284826148fd91906158d8565b1461493d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161493490615529565b60405180910390fd5b809150505b92915050565b600061498a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614992565b905092915050565b600080831182906149d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016149d091906153e7565b60405180910390fd5b50600083856149e891906158d8565b9050809150509392505050565b6000614a08614a03846156fd565b6156d8565b90508083825260208201905082856020860282011115614a2757600080fd5b60005b85811015614a575781614a3d8882614acd565b845260208401935060208301925050600181019050614a2a565b5050509392505050565b6000614a74614a6f84615729565b6156d8565b90508083825260208201905082856020860282011115614a9357600080fd5b60005b85811015614ac35781614aa98882614b9f565b845260208401935060208301925050600181019050614a96565b5050509392505050565b600081359050614adc81615f31565b92915050565b600081519050614af181615f31565b92915050565b600082601f830112614b0857600080fd5b8135614b188482602086016149f5565b91505092915050565b600082601f830112614b3257600080fd5b8151614b42848260208601614a61565b91505092915050565b600081359050614b5a81615f48565b92915050565b600081519050614b6f81615f48565b92915050565b600081519050614b8481615f5f565b92915050565b600081359050614b9981615f76565b92915050565b600081519050614bae81615f76565b92915050565b600081519050614bc381615f8d565b92915050565b600060208284031215614bdb57600080fd5b6000614be984828501614acd565b91505092915050565b600060208284031215614c0457600080fd5b6000614c1284828501614ae2565b91505092915050565b60008060408385031215614c2e57600080fd5b6000614c3c85828601614acd565b9250506020614c4d85828601614acd565b9150509250929050565b600080600060608486031215614c6c57600080fd5b6000614c7a86828701614acd565b9350506020614c8b86828701614acd565b9250506040614c9c86828701614b8a565b9150509250925092565b60008060408385031215614cb957600080fd5b6000614cc785828601614acd565b9250506020614cd885828601614b8a565b9150509250929050565b600060208284031215614cf457600080fd5b600082013567ffffffffffffffff811115614d0e57600080fd5b614d1a84828501614af7565b91505092915050565b600060208284031215614d3557600080fd5b600082015167ffffffffffffffff811115614d4f57600080fd5b614d5b84828501614b21565b91505092915050565b600060208284031215614d7657600080fd5b6000614d8484828501614b4b565b91505092915050565b600060208284031215614d9f57600080fd5b6000614dad84828501614b60565b91505092915050565b600080600060608486031215614dcb57600080fd5b6000614dd986828701614b75565b9350506020614dea86828701614b75565b9250506040614dfb86828701614bb4565b9150509250925092565b600060208284031215614e1757600080fd5b6000614e2584828501614b8a565b91505092915050565b600060208284031215614e4057600080fd5b6000614e4e84828501614b9f565b91505092915050565b600080600060608486031215614e6c57600080fd5b6000614e7a86828701614b9f565b9350506020614e8b86828701614b9f565b9250506040614e9c86828701614b9f565b9150509250925092565b6000614eb28383614ee5565b60208301905092915050565b6000614eca838361520f565b60208301905092915050565b614edf81615a20565b82525050565b614eee81615997565b82525050565b614efd81615997565b82525050565b6000614f0e82615775565b614f1881856157b0565b9350614f2383615755565b8060005b83811015614f54578151614f3b8882614ea6565b9750614f4683615796565b925050600181019050614f27565b5085935050505092915050565b6000614f6c82615780565b614f7681856157c1565b9350614f8183615765565b8060005b83811015614fb2578151614f998882614ebe565b9750614fa4836157a3565b925050600181019050614f85565b5085935050505092915050565b614fc8816159a9565b82525050565b614fd781615a32565b82525050565b614fe681615a56565b82525050565b6000614ff78261578b565b61500181856157dd565b9350615011818560208601615a8c565b61501a81615c70565b840191505092915050565b6000615032601d836157dd565b915061503d82615c81565b602082019050919050565b60006150556026836157dd565b915061506082615caa565b604082019050919050565b60006150786022836157dd565b915061508382615cf9565b604082019050919050565b600061509b601e836157dd565b91506150a682615d48565b602082019050919050565b60006150be601c836157dd565b91506150c982615d71565b602082019050919050565b60006150e1601d836157dd565b91506150ec82615d9a565b602082019050919050565b6000615104601f836157dd565b915061510f82615dc3565b602082019050919050565b6000615127601e836157dd565b915061513282615dec565b602082019050919050565b600061514a600c836157dd565b915061515582615e15565b602082019050919050565b600061516d6021836157dd565b915061517882615e3e565b604082019050919050565b60006151906004836157dd565b915061519b82615e8d565b602082019050919050565b60006151b36020836157dd565b91506151be82615eb6565b602082019050919050565b60006151d66000836157d2565b91506151e182615edf565b600082019050919050565b60006151f96024836157dd565b915061520482615ee2565b604082019050919050565b615218816159f9565b82525050565b615227816159f9565b82525050565b61523681615a13565b82525050565b6000615247826151c9565b9150819050919050565b60006020820190506152666000830184614ef4565b92915050565b60006040820190506152816000830185614ed6565b61528e602083018461521e565b9392505050565b60006040820190506152aa6000830185614ef4565b6152b76020830184614ef4565b9392505050565b6000610100820190506152d4600083018b614ef4565b6152e1602083018a614ef4565b6152ee604083018961521e565b6152fb606083018861521e565b6153086080830187614fdd565b61531560a0830186614fdd565b61532260c0830185614ef4565b61532f60e083018461521e565b9998505050505050505050565b60006040820190506153516000830185614ef4565b61535e602083018461521e565b9392505050565b6000608082019050818103600083015261537f8187614f61565b905061538e602083018661521e565b61539b604083018561521e565b6153a8606083018461521e565b95945050505050565b60006020820190506153c66000830184614fbf565b92915050565b60006020820190506153e16000830184614fce565b92915050565b600060208201905081810360008301526154018184614fec565b905092915050565b6000602082019050818103600083015261542281615025565b9050919050565b6000602082019050818103600083015261544281615048565b9050919050565b600060208201905081810360008301526154628161506b565b9050919050565b600060208201905081810360008301526154828161508e565b9050919050565b600060208201905081810360008301526154a2816150b1565b9050919050565b600060208201905081810360008301526154c2816150d4565b9050919050565b600060208201905081810360008301526154e2816150f7565b9050919050565b600060208201905081810360008301526155028161511a565b9050919050565b600060208201905081810360008301526155228161513d565b9050919050565b6000602082019050818103600083015261554281615160565b9050919050565b6000602082019050818103600083015261556281615183565b9050919050565b60006020820190508181036000830152615582816151a6565b9050919050565b600060208201905081810360008301526155a2816151ec565b9050919050565b60006020820190506155be600083018461521e565b92915050565b600060a0820190506155d9600083018861521e565b6155e66020830187614fdd565b81810360408301526155f88186614f03565b90506156076060830185614ef4565b615614608083018461521e565b9695505050505050565b600060a082019050615633600083018861521e565b615640602083018761521e565b81810360408301526156528186614f03565b90506156616060830185614ef4565b61566e608083018461521e565b9695505050505050565b600060808201905061568d600083018761521e565b61569a602083018661521e565b6156a7604083018561521e565b6156b4606083018461521e565b95945050505050565b60006020820190506156d2600083018461522d565b92915050565b60006156e26156f3565b90506156ee8282615af1565b919050565b6000604051905090565b600067ffffffffffffffff82111561571857615717615c41565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561574457615743615c41565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006157f9826159b5565b9150615804836159b5565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561583f5761583e615bb4565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561587757615876615bb4565b5b828201905092915050565b600061588d826159f9565b9150615898836159f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156158cd576158cc615bb4565b5b828201905092915050565b60006158e3826159f9565b91506158ee836159f9565b9250826158fe576158fd615be3565b5b828204905092915050565b6000615914826159f9565b915061591f836159f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561595857615957615bb4565b5b828202905092915050565b600061596e826159f9565b9150615979836159f9565b92508282101561598c5761598b615bb4565b5b828203905092915050565b60006159a2826159d9565b9050919050565b60008115159050919050565b6000819050919050565b60006dffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b6000615a2b82615a68565b9050919050565b6000615a3d82615a44565b9050919050565b6000615a4f826159d9565b9050919050565b6000615a61826159f9565b9050919050565b6000615a7382615a7a565b9050919050565b6000615a85826159d9565b9050919050565b60005b83811015615aaa578082015181840152602081019050615a8f565b83811115615ab9576000848401525b50505050565b60006002820490506001821680615ad757607f821691505b60208210811415615aeb57615aea615c12565b5b50919050565b615afa82615c70565b810181811067ffffffffffffffff82111715615b1957615b18615c41565b5b80604052505050565b6000615b2d826159f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b6057615b5f615bb4565b5b600182019050919050565b6000615b76826159b5565b91507f8000000000000000000000000000000000000000000000000000000000000000821415615ba957615ba8615bb4565b5b816000039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f74616e736665722066726f6d20746865207a65726f2061646472657373000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f7472616e736665722066726f6d20746865207a65726f20616464726573730000600082015250565b7f7472616e7366657220746f20746865207a65726f206164647265737300000000600082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f7472616e7366657220616d6f756e7420657863656564732062616c616e636500600082015250565b7f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000600082015250565b7f616c7265616479206f70656e0000000000000000000000000000000000000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f7761697400000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b615f3a81615997565b8114615f4557600080fd5b50565b615f51816159a9565b8114615f5c57600080fd5b50565b615f68816159bf565b8114615f7357600080fd5b50565b615f7f816159f9565b8114615f8a57600080fd5b50565b615f9681615a03565b8114615fa157600080fd5b5056fea264697066735822122005ffb5d7609075d0513f767483910cb20fbd35732a3fb8aea502620a0362952564736f6c63430008040033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.