ETH Price: $3,402.07 (+2.71%)

Token

Cavapoo (CAVA)
 

Overview

Max Total Supply

10,000,000,000,000,000 CAVA

Holders

4,161 ( -0.024%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
doitbigchicago.eth
Balance
1,126,523,123,556.992456627 CAVA

Value
$0.00
0xaA621B960F22911462550c078df678493c22b2ae
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Cavapoo ($CAVA) is a community-driven project that focuses on bridging the gap between crypto and charity.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Cavapoo

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-28
*/

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity 0.6.11;

interface IERC20 {

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

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

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


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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


// pragma solidity >=0.5.0;

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


// pragma solidity >=0.5.0;

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

// pragma solidity >=0.6.2;

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

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

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


// pragma solidity >=0.6.2;

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

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


contract Cavapoo is Context, IERC20, Ownable {
    using SafeMath for uint256;

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

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 10_000_000_000 * 10**6 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = "Cavapoo";
    string private _symbol = "CAVA";
    uint8 private _decimals = 9;
    
    uint256 public _taxFee = 3;
    uint256 private _previousTaxFee = _taxFee;
    
    uint256 public _liquidityFee = 4;
    uint256 private _previousLiquidityFee = _liquidityFee;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    
    bool private inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    
    uint256 public _maxTxAmount = 100_000_000 * 10**6 * 10**9;
    uint256 private constant numTokensSellToAddToLiquidity = 500_000 * 10**6 * 10**9;
    
    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );
    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () public {
        _rOwned[_msgSender()] = _rTotal;
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
         // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) public onlyOwner() {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
        function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);        
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
        function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }
    
    function setTaxFeePercent(uint256 taxFee) external onlyOwner() {
        _taxFee = taxFee;
    }
    
    function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
        _liquidityFee = liquidityFee;
    }
   
    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }
    
     //to receive ETH from uniswapV2Router when swapping
    receive() external payable {}

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tLiquidity, _getRate());
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity);
    }

    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }
    
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }
    
    function calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(
            10**2
        );
    }

    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }
    
    function removeAllFee() private {
        if(_taxFee == 0 && _liquidityFee == 0) return;
        
        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;
        
        _taxFee = 0;
        _liquidityFee = 0;
    }
    
    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }
    
    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if(from != owner() && to != owner())
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap + liquidity lock?
        // also, don't get caught in a circular liquidity event.
        // also, don't swap & liquify if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));
        
        if(contractTokenBalance >= _maxTxAmount)
        {
            contractTokenBalance = _maxTxAmount;
        }
        
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            contractTokenBalance = numTokensSellToAddToLiquidity;
            //add liquidity
            swapAndLiquify(contractTokenBalance);
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;
        }
        
        //transfer amount, it will take tax, burn, liquidity fee
        _tokenTransfer(from,to,amount,takeFee);
    }

    function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {
        // split the contract balance into halves
        uint256 half = contractTokenBalance.div(2);
        uint256 otherHalf = contractTokenBalance.sub(half);

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

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

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

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);
        
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

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

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

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

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

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

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        
        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);           
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);   
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    // additional function to address ether in the contract left after swap
    // can be used by admins to buyback and burn the tokens or for other purposes
    // related to the project
    function withdrawLeftoverEther() external onlyOwner {
        msg.sender.transfer(address(this).balance);
    }

}

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":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"liquidityFee","type":"uint256"}],"name":"setLiquidityFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxFee","type":"uint256"}],"name":"setTaxFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawLeftoverEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526a084595161401484a000000600755600754600019816200002157fe5b06600019036008556040518060400160405280600781526020017f43617661706f6f00000000000000000000000000000000000000000000000000815250600a9080519060200190620000769291906200061e565b506040518060400160405280600481526020017f4341564100000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000c49291906200061e565b506009600c60006101000a81548160ff021916908360ff1602179055506003600d55600d54600e556004600f55600f546010556001601160016101000a81548160ff02191690831515021790555069152d02c7e14af68000006012553480156200012d57600080fd5b50600062000140620005ed60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060085460016000620001f5620005ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029357600080fd5b505afa158015620002a8573d6000803e3d6000fd5b505050506040513d6020811015620002bf57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033357600080fd5b505afa15801562000348573d6000803e3d6000fd5b505050506040513d60208110156200035f57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156200040657600080fd5b505af11580156200041b573d6000803e3d6000fd5b505050506040513d60208110156200043257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600160046000620004c6620005f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200057f620005ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6007546040518082815260200191505060405180910390a350620006cd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200066157805160ff191683800117855562000692565b8280016001018555821562000692579182015b828111156200069157825182559160200191906001019062000674565b5b509050620006a19190620006a5565b5090565b620006ca91905b80821115620006c6576000816000905550600101620006ac565b5090565b90565b60805160601c60a05160601c614b3a62000715600039806118155280612c89525080610ec0528061397f5280613a6b5280613a925280613bb35280613bda5250614b3a6000f3fe6080604052600436106102085760003560e01c806352390c021161011857806395d89b41116100a0578063c49b9a801161006f578063c49b9a8014610b82578063d543dbeb14610bbf578063dd62ed3e14610bfa578063ea2f0b3714610c7f578063f2fde38b14610cd05761020f565b806395d89b41146109f5578063a457c2d714610a85578063a9059cbb14610af8578063c287d49d14610b6b5761020f565b8063715018a6116100e7578063715018a6146108b85780637d1db4a5146108cf57806388f82020146108fa5780638da5cb5b146109635780638ee88c53146109ba5761020f565b806352390c021461076e5780635342acb4146107bf5780636bc87c3a1461082857806370a08231146108535761020f565b8063313ce5671161019b5780633bd5d1731161016a5780633bd5d17314610601578063437823ec1461063c5780634549b0391461068d57806349bd5a5e146106e85780634a74bb021461073f5761020f565b8063313ce567146104e15780633685d4191461051257806339509351146105635780633b124fe7146105d65761020f565b80631694505e116101d75780631694505e1461037d57806318160ddd146103d457806323b872dd146103ff5780632d838119146104925761020f565b8063061c82d01461021457806306fdde031461024f578063095ea7b3146102df57806313114a9d146103525761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061024d6004803603602081101561023757600080fd5b8101908080359060200190929190505050610d21565b005b34801561025b57600080fd5b50610264610df4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a4578082015181840152602081019050610289565b50505050905090810190601f1680156102d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102eb57600080fd5b506103386004803603604081101561030257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e96565b604051808215151515815260200191505060405180910390f35b34801561035e57600080fd5b50610367610eb4565b6040518082815260200191505060405180910390f35b34801561038957600080fd5b50610392610ebe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103e057600080fd5b506103e9610ee2565b6040518082815260200191505060405180910390f35b34801561040b57600080fd5b506104786004803603606081101561042257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eec565b604051808215151515815260200191505060405180910390f35b34801561049e57600080fd5b506104cb600480360360208110156104b557600080fd5b8101908080359060200190929190505050610fc5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6611049565b604051808260ff1660ff16815260200191505060405180910390f35b34801561051e57600080fd5b506105616004803603602081101561053557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611060565b005b34801561056f57600080fd5b506105bc6004803603604081101561058657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ee565b604051808215151515815260200191505060405180910390f35b3480156105e257600080fd5b506105eb6114a1565b6040518082815260200191505060405180910390f35b34801561060d57600080fd5b5061063a6004803603602081101561062457600080fd5b81019080803590602001909291905050506114a7565b005b34801561064857600080fd5b5061068b6004803603602081101561065f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611638565b005b34801561069957600080fd5b506106d2600480360360408110156106b057600080fd5b810190808035906020019092919080351515906020019092919050505061175c565b6040518082815260200191505060405180910390f35b3480156106f457600080fd5b506106fd611813565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074b57600080fd5b50610754611837565b604051808215151515815260200191505060405180910390f35b34801561077a57600080fd5b506107bd6004803603602081101561079157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061184a565b005b3480156107cb57600080fd5b5061080e600480360360208110156107e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b65565b604051808215151515815260200191505060405180910390f35b34801561083457600080fd5b5061083d611bbb565b6040518082815260200191505060405180910390f35b34801561085f57600080fd5b506108a26004803603602081101561087657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bc1565b6040518082815260200191505060405180910390f35b3480156108c457600080fd5b506108cd611cac565b005b3480156108db57600080fd5b506108e4611e34565b6040518082815260200191505060405180910390f35b34801561090657600080fd5b506109496004803603602081101561091d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e3a565b604051808215151515815260200191505060405180910390f35b34801561096f57600080fd5b50610978611e90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c657600080fd5b506109f3600480360360208110156109dd57600080fd5b8101908080359060200190929190505050611eb9565b005b348015610a0157600080fd5b50610a0a611f8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a4a578082015181840152602081019050610a2f565b50505050905090810190601f168015610a775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a9157600080fd5b50610ade60048036036040811015610aa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061202e565b604051808215151515815260200191505060405180910390f35b348015610b0457600080fd5b50610b5160048036036040811015610b1b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120fb565b604051808215151515815260200191505060405180910390f35b348015610b7757600080fd5b50610b80612119565b005b348015610b8e57600080fd5b50610bbd60048036036020811015610ba557600080fd5b8101908080351515906020019092919050505061222b565b005b348015610bcb57600080fd5b50610bf860048036036020811015610be257600080fd5b810190808035906020019092919050505061234c565b005b348015610c0657600080fd5b50610c6960048036036040811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612446565b6040518082815260200191505060405180910390f35b348015610c8b57600080fd5b50610cce60048036036020811015610ca257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b005b348015610cdc57600080fd5b50610d1f60048036036020811015610cf357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125f1565b005b610d296127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e8c5780601f10610e6157610100808354040283529160200191610e8c565b820191906000526020600020905b815481529060010190602001808311610e6f57829003601f168201915b5050505050905090565b6000610eaa610ea36127fe565b8484612806565b6001905092915050565b6000600954905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600754905090565b6000610ef98484846129fd565b610fba84610f056127fe565b610fb585604051806060016040528060288152602001614a1a60289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f6b6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd09092919063ffffffff16565b612806565b600190509392505050565b6000600854821115611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061495f602a913960400191505060405180910390fd5b600061102c612e90565b90506110418184612ebb90919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b6110686127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973206e6f74206578636c7564656400000000000000000081525060200191505060405180910390fd5b60008090505b6006805490508110156113ea578173ffffffffffffffffffffffffffffffffffffffff166006828154811061121f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113dd5760066001600680549050038154811061127b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600682815481106112b357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054806113a357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556113ea565b80806001019150506111ee565b5050565b60006114976113fb6127fe565b84611492856003600061140c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b612806565b6001905092915050565b600d5481565b60006114b16127fe565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ab4602c913960400191505060405180910390fd5b600061156183612f8d565b505050505090506115ba81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061161281600854612fe990919063ffffffff16565b60088190555061162d83600954612f0590919063ffffffff16565b600981905550505050565b6116406127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006007548311156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b816117f65760006117e684612f8d565b505050505090508091505061180d565b600061180184612f8d565b50505050915050809150505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160019054906101000a900460ff1681565b6118526127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611aa757611a63600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc5565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c5c57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611ca7565b611ca4600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc5565b90505b919050565b611cb46127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60125481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ec16127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f8190555050565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120245780601f10611ff957610100808354040283529160200191612024565b820191906000526020600020905b81548152906001019060200180831161200757829003601f168201915b5050505050905090565b60006120f161203b6127fe565b846120ec85604051806060016040528060258152602001614ae060259139600360006120656127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd09092919063ffffffff16565b612806565b6001905092915050565b600061210f6121086127fe565b84846129fd565b6001905092915050565b6121216127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612228573d6000803e3d6000fd5b50565b6122336127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051808215151515815260200191505060405180910390a150565b6123546127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612415576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61243d606461242f8360075461303390919063ffffffff16565b612ebb90919063ffffffff16565b60128190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124d56127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6125f96127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149896026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561288c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a906024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149af6022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a6b6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061493c6023913960400191505060405180910390fd5b60008111612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614a426029913960400191505060405180910390fd5b612b6a611e90565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bd85750612ba8611e90565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612c3957601254811115612c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806149d16028913960400191505060405180910390fd5b5b6000612c4430611bc1565b90506012548110612c555760125490505b6000681b1ae4d6e2ef5000008210159050808015612c805750601160009054906101000a900460ff16155b8015612cd857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf05750601160019054906101000a900460ff165b15612d0b57681b1ae4d6e2ef5000009150612d0a826130b9565b5b600060019050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612db25750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612dbc57600090505b612dc88686868461319b565b505050505050565b6000838311158290612e7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e42578082015181840152602081019050612e27565b50505050905090810190601f168015612e6f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000612e9d6134ac565b91509150612eb48183612ebb90919063ffffffff16565b9250505090565b6000612efd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613740565b905092915050565b600080828401905083811015612f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000806000806000806000612fa48a613806565b9250925092506000806000612fc28d8686612fbd612e90565b613860565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061302b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612dd0565b905092915050565b60008083141561304657600090506130b3565b600082840290508284828161305757fe5b04146130ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149f96021913960400191505060405180910390fd5b809150505b92915050565b6001601160006101000a81548160ff02191690831515021790555060006130ea600283612ebb90919063ffffffff16565b905060006131018284612fe990919063ffffffff16565b90506000479050613111836138e9565b60006131268247612fe990919063ffffffff16565b90506131328382613bad565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405180848152602001838152602001828152602001935050505060405180910390a1505050506000601160006101000a81548160ff02191690831515021790555050565b806131a9576131a8613d23565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561324c5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132615761325c848484613d66565b613498565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133045750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561331957613314848484613fc6565b613497565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133bd5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133d2576133cd848484614226565b613496565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134745750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613489576134848484846143f1565b613495565b613494848484614226565b5b5b5b5b806134a6576134a56146e6565b5b50505050565b600080600060085490506000600754905060008090505b600680549050811015613703578260016000600684815481106134e257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806135c9575081600260006006848154811061356157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156135e0576008546007549450945050505061373c565b61366960016000600684815481106135f457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484612fe990919063ffffffff16565b92506136f4600260006006848154811061367f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612fe990919063ffffffff16565b915080806001019150506134c3565b5061371b600754600854612ebb90919063ffffffff16565b8210156137335760085460075493509350505061373c565b81819350935050505b9091565b600080831182906137ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137b1578082015181840152602081019050613796565b50505050905090810190601f1680156137de5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137f857fe5b049050809150509392505050565b600080600080613815856146fa565b905060006138228661472b565b9050600061384b8261383d858a612fe990919063ffffffff16565b612fe990919063ffffffff16565b90508083839550955095505050509193909250565b600080600080613879858961303390919063ffffffff16565b90506000613890868961303390919063ffffffff16565b905060006138a7878961303390919063ffffffff16565b905060006138d0826138c28587612fe990919063ffffffff16565b612fe990919063ffffffff16565b9050838184965096509650505050509450945094915050565b6060600267ffffffffffffffff8111801561390357600080fd5b506040519080825280602002602001820160405280156139325781602001602082028036833780820191505090505b509050308160008151811061394357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156139e357600080fd5b505afa1580156139f7573d6000803e3d6000fd5b505050506040513d6020811015613a0d57600080fd5b810190808051906020019092919050505081600181518110613a2b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a90307f000000000000000000000000000000000000000000000000000000000000000084612806565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613b68578082015181840152602081019050613b4d565b505050509050019650505050505050600060405180830381600087803b158015613b9157600080fd5b505af1158015613ba5573d6000803e3d6000fd5b505050505050565b613bd8307f000000000000000000000000000000000000000000000000000000000000000084612806565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b158015613ccc57600080fd5b505af1158015613ce0573d6000803e3d6000fd5b50505050506040513d6060811015613cf757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505050565b6000600d54148015613d3757506000600f54145b15613d4157613d64565b600d54600e81905550600f546010819055506000600d819055506000600f819055505b565b600080600080600080613d7887612f8d565b955095509550955095509550613dd687600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e6b86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f4c8161475c565b613f568483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600080600080600080613fd887612f8d565b95509550955095509550955061403686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140cb83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061416085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141ac8161475c565b6141b68483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b60008060008060008061423887612f8d565b95509550955095509550955061429686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061432b85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143778161475c565b6143818483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b60008060008060008061440387612f8d565b95509550955095509550955061446187600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144f686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061458b83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061462085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061466c8161475c565b6146768483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600e54600d81905550601054600f81905550565b60006147246064614716600d548561303390919063ffffffff16565b612ebb90919063ffffffff16565b9050919050565b60006147556064614747600f548561303390919063ffffffff16565b612ebb90919063ffffffff16565b9050919050565b6000614766612e90565b9050600061477d828461303390919063ffffffff16565b90506147d181600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156148fc576148b883600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b61491682600854612fe990919063ffffffff16565b60088190555061493181600954612f0590919063ffffffff16565b600981905550505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bc33f20ac8edafe2689632b560d031c2b74e83fda7ce8e2855f182d1ece3212964736f6c634300060b0033

Deployed Bytecode

0x6080604052600436106102085760003560e01c806352390c021161011857806395d89b41116100a0578063c49b9a801161006f578063c49b9a8014610b82578063d543dbeb14610bbf578063dd62ed3e14610bfa578063ea2f0b3714610c7f578063f2fde38b14610cd05761020f565b806395d89b41146109f5578063a457c2d714610a85578063a9059cbb14610af8578063c287d49d14610b6b5761020f565b8063715018a6116100e7578063715018a6146108b85780637d1db4a5146108cf57806388f82020146108fa5780638da5cb5b146109635780638ee88c53146109ba5761020f565b806352390c021461076e5780635342acb4146107bf5780636bc87c3a1461082857806370a08231146108535761020f565b8063313ce5671161019b5780633bd5d1731161016a5780633bd5d17314610601578063437823ec1461063c5780634549b0391461068d57806349bd5a5e146106e85780634a74bb021461073f5761020f565b8063313ce567146104e15780633685d4191461051257806339509351146105635780633b124fe7146105d65761020f565b80631694505e116101d75780631694505e1461037d57806318160ddd146103d457806323b872dd146103ff5780632d838119146104925761020f565b8063061c82d01461021457806306fdde031461024f578063095ea7b3146102df57806313114a9d146103525761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061024d6004803603602081101561023757600080fd5b8101908080359060200190929190505050610d21565b005b34801561025b57600080fd5b50610264610df4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a4578082015181840152602081019050610289565b50505050905090810190601f1680156102d15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102eb57600080fd5b506103386004803603604081101561030257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e96565b604051808215151515815260200191505060405180910390f35b34801561035e57600080fd5b50610367610eb4565b6040518082815260200191505060405180910390f35b34801561038957600080fd5b50610392610ebe565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103e057600080fd5b506103e9610ee2565b6040518082815260200191505060405180910390f35b34801561040b57600080fd5b506104786004803603606081101561042257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eec565b604051808215151515815260200191505060405180910390f35b34801561049e57600080fd5b506104cb600480360360208110156104b557600080fd5b8101908080359060200190929190505050610fc5565b6040518082815260200191505060405180910390f35b3480156104ed57600080fd5b506104f6611049565b604051808260ff1660ff16815260200191505060405180910390f35b34801561051e57600080fd5b506105616004803603602081101561053557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611060565b005b34801561056f57600080fd5b506105bc6004803603604081101561058657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113ee565b604051808215151515815260200191505060405180910390f35b3480156105e257600080fd5b506105eb6114a1565b6040518082815260200191505060405180910390f35b34801561060d57600080fd5b5061063a6004803603602081101561062457600080fd5b81019080803590602001909291905050506114a7565b005b34801561064857600080fd5b5061068b6004803603602081101561065f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611638565b005b34801561069957600080fd5b506106d2600480360360408110156106b057600080fd5b810190808035906020019092919080351515906020019092919050505061175c565b6040518082815260200191505060405180910390f35b3480156106f457600080fd5b506106fd611813565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074b57600080fd5b50610754611837565b604051808215151515815260200191505060405180910390f35b34801561077a57600080fd5b506107bd6004803603602081101561079157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061184a565b005b3480156107cb57600080fd5b5061080e600480360360208110156107e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b65565b604051808215151515815260200191505060405180910390f35b34801561083457600080fd5b5061083d611bbb565b6040518082815260200191505060405180910390f35b34801561085f57600080fd5b506108a26004803603602081101561087657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bc1565b6040518082815260200191505060405180910390f35b3480156108c457600080fd5b506108cd611cac565b005b3480156108db57600080fd5b506108e4611e34565b6040518082815260200191505060405180910390f35b34801561090657600080fd5b506109496004803603602081101561091d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e3a565b604051808215151515815260200191505060405180910390f35b34801561096f57600080fd5b50610978611e90565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109c657600080fd5b506109f3600480360360208110156109dd57600080fd5b8101908080359060200190929190505050611eb9565b005b348015610a0157600080fd5b50610a0a611f8c565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a4a578082015181840152602081019050610a2f565b50505050905090810190601f168015610a775780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a9157600080fd5b50610ade60048036036040811015610aa857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061202e565b604051808215151515815260200191505060405180910390f35b348015610b0457600080fd5b50610b5160048036036040811015610b1b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120fb565b604051808215151515815260200191505060405180910390f35b348015610b7757600080fd5b50610b80612119565b005b348015610b8e57600080fd5b50610bbd60048036036020811015610ba557600080fd5b8101908080351515906020019092919050505061222b565b005b348015610bcb57600080fd5b50610bf860048036036020811015610be257600080fd5b810190808035906020019092919050505061234c565b005b348015610c0657600080fd5b50610c6960048036036040811015610c1d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612446565b6040518082815260200191505060405180910390f35b348015610c8b57600080fd5b50610cce60048036036020811015610ca257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cd565b005b348015610cdc57600080fd5b50610d1f60048036036020811015610cf357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125f1565b005b610d296127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600d8190555050565b6060600a8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e8c5780601f10610e6157610100808354040283529160200191610e8c565b820191906000526020600020905b815481529060010190602001808311610e6f57829003601f168201915b5050505050905090565b6000610eaa610ea36127fe565b8484612806565b6001905092915050565b6000600954905090565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600754905090565b6000610ef98484846129fd565b610fba84610f056127fe565b610fb585604051806060016040528060288152602001614a1a60289139600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f6b6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd09092919063ffffffff16565b612806565b600190509392505050565b6000600854821115611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061495f602a913960400191505060405180910390fd5b600061102c612e90565b90506110418184612ebb90919063ffffffff16565b915050919050565b6000600c60009054906101000a900460ff16905090565b6110686127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4163636f756e74206973206e6f74206578636c7564656400000000000000000081525060200191505060405180910390fd5b60008090505b6006805490508110156113ea578173ffffffffffffffffffffffffffffffffffffffff166006828154811061121f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156113dd5760066001600680549050038154811061127b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600682815481106112b357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060068054806113a357fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556113ea565b80806001019150506111ee565b5050565b60006114976113fb6127fe565b84611492856003600061140c6127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b612806565b6001905092915050565b600d5481565b60006114b16127fe565b9050600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611556576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ab4602c913960400191505060405180910390fd5b600061156183612f8d565b505050505090506115ba81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061161281600854612fe990919063ffffffff16565b60088190555061162d83600954612f0590919063ffffffff16565b600981905550505050565b6116406127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60006007548311156117d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e74206d757374206265206c657373207468616e20737570706c790081525060200191505060405180910390fd5b816117f65760006117e684612f8d565b505050505090508091505061180d565b600061180184612f8d565b50505050915050809150505b92915050565b7f00000000000000000000000080562222ec4d0f8a2bddd10ce972cbb2d616780281565b601160019054906101000a900460ff1681565b6118526127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4163636f756e7420697320616c7265616479206578636c75646564000000000081525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611aa757611a63600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc5565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600f5481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c5c57600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611ca7565b611ca4600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610fc5565b90505b919050565b611cb46127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60125481565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ec16127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f8190555050565b6060600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120245780601f10611ff957610100808354040283529160200191612024565b820191906000526020600020905b81548152906001019060200180831161200757829003601f168201915b5050505050905090565b60006120f161203b6127fe565b846120ec85604051806060016040528060258152602001614ae060259139600360006120656127fe565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dd09092919063ffffffff16565b612806565b6001905092915050565b600061210f6121086127fe565b84846129fd565b6001905092915050565b6121216127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146121e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612228573d6000803e3d6000fd5b50565b6122336127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051808215151515815260200191505060405180910390a150565b6123546127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612415576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61243d606461242f8360075461303390919063ffffffff16565b612ebb90919063ffffffff16565b60128190555050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124d56127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6125f96127fe565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806149896026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561288c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614a906024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806149af6022913960400191505060405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614a6b6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061493c6023913960400191505060405180910390fd5b60008111612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614a426029913960400191505060405180910390fd5b612b6a611e90565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bd85750612ba8611e90565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612c3957601254811115612c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806149d16028913960400191505060405180910390fd5b5b6000612c4430611bc1565b90506012548110612c555760125490505b6000681b1ae4d6e2ef5000008210159050808015612c805750601160009054906101000a900460ff16155b8015612cd857507f00000000000000000000000080562222ec4d0f8a2bddd10ce972cbb2d616780273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015612cf05750601160019054906101000a900460ff165b15612d0b57681b1ae4d6e2ef5000009150612d0a826130b9565b5b600060019050600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612db25750600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612dbc57600090505b612dc88686868461319b565b505050505050565b6000838311158290612e7d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e42578082015181840152602081019050612e27565b50505050905090810190601f168015612e6f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000612e9d6134ac565b91509150612eb48183612ebb90919063ffffffff16565b9250505090565b6000612efd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613740565b905092915050565b600080828401905083811015612f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806000806000806000806000612fa48a613806565b9250925092506000806000612fc28d8686612fbd612e90565b613860565b9250925092508282828888889b509b509b509b509b509b5050505050505091939550919395565b600061302b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612dd0565b905092915050565b60008083141561304657600090506130b3565b600082840290508284828161305757fe5b04146130ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149f96021913960400191505060405180910390fd5b809150505b92915050565b6001601160006101000a81548160ff02191690831515021790555060006130ea600283612ebb90919063ffffffff16565b905060006131018284612fe990919063ffffffff16565b90506000479050613111836138e9565b60006131268247612fe990919063ffffffff16565b90506131328382613bad565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56184828560405180848152602001838152602001828152602001935050505060405180910390a1505050506000601160006101000a81548160ff02191690831515021790555050565b806131a9576131a8613d23565b5b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561324c5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156132615761325c848484613d66565b613498565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133045750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b1561331957613314848484613fc6565b613497565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156133bd5750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133d2576133cd848484614226565b613496565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134745750600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15613489576134848484846143f1565b613495565b613494848484614226565b5b5b5b5b806134a6576134a56146e6565b5b50505050565b600080600060085490506000600754905060008090505b600680549050811015613703578260016000600684815481106134e257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411806135c9575081600260006006848154811061356157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b156135e0576008546007549450945050505061373c565b61366960016000600684815481106135f457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484612fe990919063ffffffff16565b92506136f4600260006006848154811061367f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205483612fe990919063ffffffff16565b915080806001019150506134c3565b5061371b600754600854612ebb90919063ffffffff16565b8210156137335760085460075493509350505061373c565b81819350935050505b9091565b600080831182906137ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137b1578082015181840152602081019050613796565b50505050905090810190601f1680156137de5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816137f857fe5b049050809150509392505050565b600080600080613815856146fa565b905060006138228661472b565b9050600061384b8261383d858a612fe990919063ffffffff16565b612fe990919063ffffffff16565b90508083839550955095505050509193909250565b600080600080613879858961303390919063ffffffff16565b90506000613890868961303390919063ffffffff16565b905060006138a7878961303390919063ffffffff16565b905060006138d0826138c28587612fe990919063ffffffff16565b612fe990919063ffffffff16565b9050838184965096509650505050509450945094915050565b6060600267ffffffffffffffff8111801561390357600080fd5b506040519080825280602002602001820160405280156139325781602001602082028036833780820191505090505b509050308160008151811061394357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156139e357600080fd5b505afa1580156139f7573d6000803e3d6000fd5b505050506040513d6020811015613a0d57600080fd5b810190808051906020019092919050505081600181518110613a2b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a90307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612806565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015613b68578082015181840152602081019050613b4d565b505050509050019650505050505050600060405180830381600087803b158015613b9157600080fd5b505af1158015613ba5573d6000803e3d6000fd5b505050505050565b613bd8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612806565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008030426040518863ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200196505050505050506060604051808303818588803b158015613ccc57600080fd5b505af1158015613ce0573d6000803e3d6000fd5b50505050506040513d6060811015613cf757600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050505050505050565b6000600d54148015613d3757506000600f54145b15613d4157613d64565b600d54600e81905550600f546010819055506000600d819055506000600f819055505b565b600080600080600080613d7887612f8d565b955095509550955095509550613dd687600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e6b86600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f4c8161475c565b613f568483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600080600080600080613fd887612f8d565b95509550955095509550955061403686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140cb83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061416085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506141ac8161475c565b6141b68483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b60008060008060008061423887612f8d565b95509550955095509550955061429686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061432b85600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506143778161475c565b6143818483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b60008060008060008061440387612f8d565b95509550955095509550955061446187600260008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506144f686600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fe990919063ffffffff16565b600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061458b83600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061462085600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061466c8161475c565b6146768483614901565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600e54600d81905550601054600f81905550565b60006147246064614716600d548561303390919063ffffffff16565b612ebb90919063ffffffff16565b9050919050565b60006147556064614747600f548561303390919063ffffffff16565b612ebb90919063ffffffff16565b9050919050565b6000614766612e90565b9050600061477d828461303390919063ffffffff16565b90506147d181600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600160003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600560003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156148fc576148b883600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612f0590919063ffffffff16565b600260003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b61491682600854612fe990919063ffffffff16565b60088190555061493181600954612f0590919063ffffffff16565b600981905550505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bc33f20ac8edafe2689632b560d031c2b74e83fda7ce8e2855f182d1ece3212964736f6c634300060b0033

Deployed Bytecode Sourcemap

18626:18715:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26071:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21010:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21922:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23043:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19553:51;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21287:95;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22091:313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23967:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21196:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24683:475;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22412:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19365:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23138:377;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25826:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23523:436;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19611:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19698:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24228:447;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29969:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19452:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21390:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9977:148;;;;;;;;;;;;;:::i;:::-;;19751:57;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22915:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9335:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26181:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21101:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22638:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21596:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37223:113;;;;;;;;;;;;;:::i;:::-;;26484:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26314:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21771:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25949:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10280:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26071:98;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26155:6:::1;26145:7;:16;;;;26071:98:::0;:::o;21010:83::-;21047:13;21080:5;21073:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21010:83;:::o;21922:161::-;21997:4;22014:39;22023:12;:10;:12::i;:::-;22037:7;22046:6;22014:8;:39::i;:::-;22071:4;22064:11;;21922:161;;;;:::o;23043:87::-;23085:7;23112:10;;23105:17;;23043:87;:::o;19553:51::-;;;:::o;21287:95::-;21340:7;21367;;21360:14;;21287:95;:::o;22091:313::-;22189:4;22206:36;22216:6;22224:9;22235:6;22206:9;:36::i;:::-;22253:121;22262:6;22270:12;:10;:12::i;:::-;22284:89;22322:6;22284:89;;;;;;;;;;;;;;;;;:11;:19;22296:6;22284:19;;;;;;;;;;;;;;;:33;22304:12;:10;:12::i;:::-;22284:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;22253:8;:121::i;:::-;22392:4;22385:11;;22091:313;;;;;:::o;23967:253::-;24033:7;24072;;24061;:18;;24053:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24137:19;24160:10;:8;:10::i;:::-;24137:33;;24188:24;24200:11;24188:7;:11;;:24;;;;:::i;:::-;24181:31;;;23967:253;;;:::o;21196:83::-;21237:5;21262:9;;;;;;;;;;;21255:16;;21196:83;:::o;24683:475::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24765:11:::1;:20;24777:7;24765:20;;;;;;;;;;;;;;;;;;;;;;;;;24757:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24829:9;24841:1:::0;24829:13:::1;;24824:327;24848:9;:16;;;;24844:1;:20;24824:327;;;24906:7;24890:23;;:9;24900:1;24890:12;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;24886:254;;;24949:9;24978:1;24959:9;:16;;;;:20;24949:31;;;;;;;;;;;;;;;;;;;;;;;;;24934:9;24944:1;24934:12;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;25018:1;24999:7;:16;25007:7;24999:16;;;;;;;;;;;;;;;:20;;;;25061:5;25038:11;:20;25050:7;25038:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25085:9;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25119:5;;24886:254;24866:3;;;;;;;24824:327;;;;24683:475:::0;:::o;22412:218::-;22500:4;22517:83;22526:12;:10;:12::i;:::-;22540:7;22549:50;22588:10;22549:11;:25;22561:12;:10;:12::i;:::-;22549:25;;;;;;;;;;;;;;;:34;22575:7;22549:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;22517:8;:83::i;:::-;22618:4;22611:11;;22412:218;;;;:::o;19365:26::-;;;;:::o;23138:377::-;23190:14;23207:12;:10;:12::i;:::-;23190:29;;23239:11;:19;23251:6;23239:19;;;;;;;;;;;;;;;;;;;;;;;;;23238:20;23230:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23319:15;23343:19;23354:7;23343:10;:19::i;:::-;23318:44;;;;;;;23391:28;23411:7;23391;:15;23399:6;23391:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;23373:7;:15;23381:6;23373:15;;;;;;;;;;;;;;;:46;;;;23440:20;23452:7;23440;;:11;;:20;;;;:::i;:::-;23430:7;:30;;;;23484:23;23499:7;23484:10;;:14;;:23;;;;:::i;:::-;23471:10;:36;;;;23138:377;;;:::o;25826:111::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25925:4:::1;25895:18;:27;25914:7;25895:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;25826:111:::0;:::o;23523:436::-;23613:7;23652;;23641;:18;;23633:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23711:17;23706:246;;23746:15;23770:19;23781:7;23770:10;:19::i;:::-;23745:44;;;;;;;23811:7;23804:14;;;;;23706:246;23853:23;23884:19;23895:7;23884:10;:19::i;:::-;23851:52;;;;;;;23925:15;23918:22;;;23523:436;;;;;:::o;19611:38::-;;;:::o;19698:40::-;;;;;;;;;;;;;:::o;24228:447::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24425:11:::1;:20;24437:7;24425:20;;;;;;;;;;;;;;;;;;;;;;;;;24424:21;24416:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24510:1;24491:7;:16;24499:7;24491:16;;;;;;;;;;;;;;;;:20;24488:108;;;24547:37;24567:7;:16;24575:7;24567:16;;;;;;;;;;;;;;;;24547:19;:37::i;:::-;24528:7;:16;24536:7;24528:16;;;;;;;;;;;;;;;:56;;;;24488:108;24629:4;24606:11;:20;24618:7;24606:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24644:9;24659:7;24644:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24228:447:::0;:::o;29969:123::-;30033:4;30057:18;:27;30076:7;30057:27;;;;;;;;;;;;;;;;;;;;;;;;;30050:34;;29969:123;;;:::o;19452:32::-;;;;:::o;21390:198::-;21456:7;21480:11;:20;21492:7;21480:20;;;;;;;;;;;;;;;;;;;;;;;;;21476:49;;;21509:7;:16;21517:7;21509:16;;;;;;;;;;;;;;;;21502:23;;;;21476:49;21543:37;21563:7;:16;21571:7;21563:16;;;;;;;;;;;;;;;;21543:19;:37::i;:::-;21536:44;;21390:198;;;;:::o;9977:148::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10084:1:::1;10047:40;;10068:6;::::0;::::1;;;;;;;;;10047:40;;;;;;;;;;;;10115:1;10098:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;9977:148::o:0;19751:57::-;;;;:::o;22915:120::-;22983:4;23007:11;:20;23019:7;23007:20;;;;;;;;;;;;;;;;;;;;;;;;;23000:27;;22915:120;;;:::o;9335:79::-;9373:7;9400:6;;;;;;;;;;;9393:13;;9335:79;:::o;26181:122::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26283:12:::1;26267:13;:28;;;;26181:122:::0;:::o;21101:87::-;21140:13;21173:7;21166:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21101:87;:::o;22638:269::-;22731:4;22748:129;22757:12;:10;:12::i;:::-;22771:7;22780:96;22819:15;22780:96;;;;;;;;;;;;;;;;;:11;:25;22792:12;:10;:12::i;:::-;22780:25;;;;;;;;;;;;;;;:34;22806:7;22780:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;22748:8;:129::i;:::-;22895:4;22888:11;;22638:269;;;;:::o;21596:167::-;21674:4;21691:42;21701:12;:10;:12::i;:::-;21715:9;21726:6;21691:9;:42::i;:::-;21751:4;21744:11;;21596:167;;;;:::o;37223:113::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37286:10:::1;:19;;:42;37306:21;37286:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;37223:113::o:0;26484:171::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26585:8:::1;26561:21;;:32;;;;;;;;;;;;;;;;;;26609:38;26638:8;26609:38;;;;;;;;;;;;;;;;;;;;;;26484:171:::0;:::o;26314:162::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26408:60:::1;26452:5;26408:25;26420:12;26408:7;;:11;;:25;;;;:::i;:::-;:29;;:60;;;;:::i;:::-;26393:12;:75;;;;26314:162:::0;:::o;21771:143::-;21852:7;21879:11;:18;21891:5;21879:18;;;;;;;;;;;;;;;:27;21898:7;21879:27;;;;;;;;;;;;;;;;21872:34;;21771:143;;;;:::o;25949:110::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26046:5:::1;26016:18;:27;26035:7;26016:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;25949:110:::0;:::o;10280:244::-;9557:12;:10;:12::i;:::-;9547:22;;:6;;;;;;;;;;;:22;;;9539:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10389:1:::1;10369:22;;:8;:22;;;;10361:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10479:8;10450:38;;10471:6;::::0;::::1;;;;;;;;;10450:38;;;;;;;;;;;;10508:8;10499:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;10280:244:::0;:::o;7971:106::-;8024:15;8059:10;8052:17;;7971:106;:::o;30100:337::-;30210:1;30193:19;;:5;:19;;;;30185:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30291:1;30272:21;;:7;:21;;;;30264:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30375:6;30345:11;:18;30357:5;30345:18;;;;;;;;;;;;;;;:27;30364:7;30345:27;;;;;;;;;;;;;;;:36;;;;30413:7;30397:32;;30406:5;30397:32;;;30422:6;30397:32;;;;;;;;;;;;;;;;;;30100:337;;;:::o;30445:1813::-;30583:1;30567:18;;:4;:18;;;;30559:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30660:1;30646:16;;:2;:16;;;;30638:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30730:1;30721:6;:10;30713:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30799:7;:5;:7::i;:::-;30791:15;;:4;:15;;;;:32;;;;;30816:7;:5;:7::i;:::-;30810:13;;:2;:13;;;;30791:32;30788:125;;;30856:12;;30846:6;:22;;30838:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30788:125;31208:28;31239:24;31257:4;31239:9;:24::i;:::-;31208:55;;31311:12;;31287:20;:36;31284:112;;31372:12;;31349:35;;31284:112;31416:24;19872:23;31443:20;:53;;31416:80;;31525:19;:53;;;;;31562:16;;;;;;;;;;;31561:17;31525:53;:91;;;;;31603:13;31595:21;;:4;:21;;;;31525:91;:129;;;;;31633:21;;;;;;;;;;;31525:129;31507:318;;;19872:23;31681:52;;31777:36;31792:20;31777:14;:36::i;:::-;31507:318;31906:12;31921:4;31906:19;;32033:18;:24;32052:4;32033:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;32061:18;:22;32080:2;32061:22;;;;;;;;;;;;;;;;;;;;;;;;;32033:50;32030:96;;;32109:5;32099:15;;32030:96;32212:38;32227:4;32232:2;32235:6;32242:7;32212:14;:38::i;:::-;30445:1813;;;;;;:::o;4381:192::-;4467:7;4500:1;4495;:6;;4503:12;4487:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4527:9;4543:1;4539;:5;4527:17;;4564:1;4557:8;;;4381:192;;;;;:::o;28119:163::-;28160:7;28181:15;28198;28217:19;:17;:19::i;:::-;28180:56;;;;28254:20;28266:7;28254;:11;;:20;;;;:::i;:::-;28247:27;;;;28119:163;:::o;5779:132::-;5837:7;5864:39;5868:1;5871;5864:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5857:46;;5779:132;;;;:::o;3478:181::-;3536:7;3556:9;3572:1;3568;:5;3556:17;;3597:1;3592;:6;;3584:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3650:1;3643:8;;;3478:181;;;;:::o;26917:419::-;26976:7;26985;26994;27003;27012;27021;27042:23;27067:12;27081:18;27103:20;27115:7;27103:11;:20::i;:::-;27041:82;;;;;;27135:15;27152:23;27177:12;27193:50;27205:7;27214:4;27220:10;27232;:8;:10::i;:::-;27193:11;:50::i;:::-;27134:109;;;;;;27262:7;27271:15;27288:4;27294:15;27311:4;27317:10;27254:74;;;;;;;;;;;;;;;;;;26917:419;;;;;;;:::o;3942:136::-;4000:7;4027:43;4031:1;4034;4027:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4020:50;;3942:136;;;;:::o;4832:471::-;4890:7;5140:1;5135;:6;5131:47;;;5165:1;5158:8;;;;5131:47;5190:9;5206:1;5202;:5;5190:17;;5235:1;5230;5226;:5;;;;;;:10;5218:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5294:1;5287:8;;;4832:471;;;;;:::o;32266:985::-;20222:4;20203:16;;:23;;;;;;;;;;;;;;;;;;32402:12:::1;32417:27;32442:1;32417:20;:24;;:27;;;;:::i;:::-;32402:42;;32455:17;32475:30;32500:4;32475:20;:24;;:30;;;;:::i;:::-;32455:50;;32783:22;32808:21;32783:46;;32874:22;32891:4;32874:16;:22::i;:::-;33027:18;33048:41;33074:14;33048:21;:25;;:41;;;;:::i;:::-;33027:62;;33139:35;33152:9;33163:10;33139:12;:35::i;:::-;33200:43;33215:4;33221:10;33233:9;33200:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20237:1;;;;20268:5:::0;20249:16;;:24;;;;;;;;;;;;;;;;;;32266:985;:::o;34508:834::-;34619:7;34615:40;;34641:14;:12;:14::i;:::-;34615:40;34680:11;:19;34692:6;34680:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;34704:11;:22;34716:9;34704:22;;;;;;;;;;;;;;;;;;;;;;;;;34703:23;34680:46;34676:597;;;34743:48;34765:6;34773:9;34784:6;34743:21;:48::i;:::-;34676:597;;;34814:11;:19;34826:6;34814:19;;;;;;;;;;;;;;;;;;;;;;;;;34813:20;:46;;;;;34837:11;:22;34849:9;34837:22;;;;;;;;;;;;;;;;;;;;;;;;;34813:46;34809:464;;;34876:46;34896:6;34904:9;34915:6;34876:19;:46::i;:::-;34809:464;;;34945:11;:19;34957:6;34945:19;;;;;;;;;;;;;;;;;;;;;;;;;34944:20;:47;;;;;34969:11;:22;34981:9;34969:22;;;;;;;;;;;;;;;;;;;;;;;;;34968:23;34944:47;34940:333;;;35008:44;35026:6;35034:9;35045:6;35008:17;:44::i;:::-;34940:333;;;35074:11;:19;35086:6;35074:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;35097:11;:22;35109:9;35097:22;;;;;;;;;;;;;;;;;;;;;;;;;35074:45;35070:203;;;35136:48;35158:6;35166:9;35177:6;35136:21;:48::i;:::-;35070:203;;;35217:44;35235:6;35243:9;35254:6;35217:17;:44::i;:::-;35070:203;34940:333;34809:464;34676:597;35297:7;35293:41;;35319:15;:13;:15::i;:::-;35293:41;34508:834;;;;:::o;28290:561::-;28340:7;28349;28369:15;28387:7;;28369:25;;28405:15;28423:7;;28405:25;;28452:9;28464:1;28452:13;;28447:289;28471:9;:16;;;;28467:1;:20;28447:289;;;28537:7;28513;:21;28521:9;28531:1;28521:12;;;;;;;;;;;;;;;;;;;;;;;;;28513:21;;;;;;;;;;;;;;;;:31;:66;;;;28572:7;28548;:21;28556:9;28566:1;28556:12;;;;;;;;;;;;;;;;;;;;;;;;;28548:21;;;;;;;;;;;;;;;;:31;28513:66;28509:97;;;28589:7;;28598;;28581:25;;;;;;;;;28509:97;28631:34;28643:7;:21;28651:9;28661:1;28651:12;;;;;;;;;;;;;;;;;;;;;;;;;28643:21;;;;;;;;;;;;;;;;28631:7;:11;;:34;;;;:::i;:::-;28621:44;;28690:34;28702:7;:21;28710:9;28720:1;28710:12;;;;;;;;;;;;;;;;;;;;;;;;;28702:21;;;;;;;;;;;;;;;;28690:7;:11;;:34;;;;:::i;:::-;28680:44;;28489:3;;;;;;;28447:289;;;;28760:20;28772:7;;28760;;:11;;:20;;;;:::i;:::-;28750:7;:30;28746:61;;;28790:7;;28799;;28782:25;;;;;;;;28746:61;28826:7;28835;28818:25;;;;;;28290:561;;;:::o;6407:278::-;6493:7;6525:1;6521;:5;6528:12;6513:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6552:9;6568:1;6564;:5;;;;;;6552:17;;6676:1;6669:8;;;6407:278;;;;;:::o;27344:330::-;27404:7;27413;27422;27442:12;27457:24;27473:7;27457:15;:24::i;:::-;27442:39;;27492:18;27513:30;27535:7;27513:21;:30::i;:::-;27492:51;;27554:23;27580:33;27602:10;27580:17;27592:4;27580:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;27554:59;;27632:15;27649:4;27655:10;27624:42;;;;;;;;;27344:330;;;;;:::o;27682:429::-;27797:7;27806;27815;27835:15;27853:24;27865:11;27853:7;:11;;:24;;;;:::i;:::-;27835:42;;27888:12;27903:21;27912:11;27903:4;:8;;:21;;;;:::i;:::-;27888:36;;27935:18;27956:27;27971:11;27956:10;:14;;:27;;;;:::i;:::-;27935:48;;27994:23;28020:33;28042:10;28020:17;28032:4;28020:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;27994:59;;28072:7;28081:15;28098:4;28064:39;;;;;;;;;;27682:429;;;;;;;;:::o;33259:589::-;33385:21;33423:1;33409:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33385:40;;33454:4;33436;33441:1;33436:7;;;;;;;;;;;;;:23;;;;;;;;;;;33480:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33470:4;33475:1;33470:7;;;;;;;;;;;;;:32;;;;;;;;;;;33515:62;33532:4;33547:15;33565:11;33515:8;:62::i;:::-;33616:15;:66;;;33697:11;33723:1;33767:4;33794;33814:15;33616:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33259:589;;:::o;33856:571::-;34004:62;34021:4;34036:15;34054:11;34004:8;:62::i;:::-;34161:15;:31;;;34200:9;34233:4;34253:11;34279:1;34322;34373:4;34393:15;34161:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33856:571;;:::o;29570:250::-;29627:1;29616:7;;:12;:34;;;;;29649:1;29632:13;;:18;29616:34;29613:46;;;29652:7;;29613:46;29697:7;;29679:15;:25;;;;29739:13;;29715:21;:37;;;;29783:1;29773:7;:11;;;;29811:1;29795:13;:17;;;;29570:250;:::o;36454:566::-;36557:15;36574:23;36599:12;36613:23;36638:12;36652:18;36674:19;36685:7;36674:10;:19::i;:::-;36556:137;;;;;;;;;;;;36722:28;36742:7;36722;:15;36730:6;36722:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36704:7;:15;36712:6;36704:15;;;;;;;;;;;;;;;:46;;;;36779:28;36799:7;36779;:15;36787:6;36779:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36761:7;:15;36769:6;36761:15;;;;;;;;;;;;;;;:46;;;;36839:39;36862:15;36839:7;:18;36847:9;36839:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36818:7;:18;36826:9;36818:18;;;;;;;;;;;;;;;:60;;;;36892:26;36907:10;36892:14;:26::i;:::-;36929:23;36941:4;36947;36929:11;:23::i;:::-;36985:9;36968:44;;36977:6;36968:44;;;36996:15;36968:44;;;;;;;;;;;;;;;;;;36454:566;;;;;;;;;:::o;35860:586::-;35961:15;35978:23;36003:12;36017:23;36042:12;36056:18;36078:19;36089:7;36078:10;:19::i;:::-;35960:137;;;;;;;;;;;;36126:28;36146:7;36126;:15;36134:6;36126:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;36108:7;:15;36116:6;36108:15;;;;;;;;;;;;;;;:46;;;;36186:39;36209:15;36186:7;:18;36194:9;36186:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36165:7;:18;36173:9;36165:18;;;;;;;;;;;;;;;:60;;;;36257:39;36280:15;36257:7;:18;36265:9;36257:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;36236:7;:18;36244:9;36236:18;;;;;;;;;;;;;;;:60;;;;36318:26;36333:10;36318:14;:26::i;:::-;36355:23;36367:4;36373;36355:11;:23::i;:::-;36411:9;36394:44;;36403:6;36394:44;;;36422:15;36394:44;;;;;;;;;;;;;;;;;;35860:586;;;;;;;;;:::o;35350:502::-;35449:15;35466:23;35491:12;35505:23;35530:12;35544:18;35566:19;35577:7;35566:10;:19::i;:::-;35448:137;;;;;;;;;;;;35614:28;35634:7;35614;:15;35622:6;35614:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;35596:7;:15;35604:6;35596:15;;;;;;;;;;;;;;;:46;;;;35674:39;35697:15;35674:7;:18;35682:9;35674:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;35653:7;:18;35661:9;35653:18;;;;;;;;;;;;;;;:60;;;;35724:26;35739:10;35724:14;:26::i;:::-;35761:23;35773:4;35779;35761:11;:23::i;:::-;35817:9;35800:44;;35809:6;35800:44;;;35828:15;35800:44;;;;;;;;;;;;;;;;;;35350:502;;;;;;;;;:::o;25168:642::-;25271:15;25288:23;25313:12;25327:23;25352:12;25366:18;25388:19;25399:7;25388:10;:19::i;:::-;25270:137;;;;;;;;;;;;25436:28;25456:7;25436;:15;25444:6;25436:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;25418:7;:15;25426:6;25418:15;;;;;;;;;;;;;;;:46;;;;25493:28;25513:7;25493;:15;25501:6;25493:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;25475:7;:15;25483:6;25475:15;;;;;;;;;;;;;;;:46;;;;25553:39;25576:15;25553:7;:18;25561:9;25553:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;25532:7;:18;25540:9;25532:18;;;;;;;;;;;;;;;:60;;;;25624:39;25647:15;25624:7;:18;25632:9;25624:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;25603:7;:18;25611:9;25603:18;;;;;;;;;;;;;;;:60;;;;25682:26;25697:10;25682:14;:26::i;:::-;25719:23;25731:4;25737;25719:11;:23::i;:::-;25775:9;25758:44;;25767:6;25758:44;;;25786:15;25758:44;;;;;;;;;;;;;;;;;;25168:642;;;;;;;;;:::o;29832:125::-;29886:15;;29876:7;:25;;;;29928:21;;29912:13;:37;;;;29832:125::o;29230:154::-;29294:7;29321:55;29360:5;29321:20;29333:7;;29321;:11;;:20;;;;:::i;:::-;:24;;:55;;;;:::i;:::-;29314:62;;29230:154;;;:::o;29392:166::-;29462:7;29489:61;29534:5;29489:26;29501:13;;29489:7;:11;;:26;;;;:::i;:::-;:30;;:61;;;;:::i;:::-;29482:68;;29392:166;;;:::o;28863:355::-;28926:19;28949:10;:8;:10::i;:::-;28926:33;;28970:18;28991:27;29006:11;28991:10;:14;;:27;;;;:::i;:::-;28970:48;;29054:38;29081:10;29054:7;:22;29070:4;29054:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;29029:7;:22;29045:4;29029:22;;;;;;;;;;;;;;;:63;;;;29106:11;:26;29126:4;29106:26;;;;;;;;;;;;;;;;;;;;;;;;;29103:107;;;29172:38;29199:10;29172:7;:22;29188:4;29172:22;;;;;;;;;;;;;;;;:26;;:38;;;;:::i;:::-;29147:7;:22;29163:4;29147:22;;;;;;;;;;;;;;;:63;;;;29103:107;28863:355;;;:::o;26762:147::-;26840:17;26852:4;26840:7;;:11;;:17;;;;:::i;:::-;26830:7;:27;;;;26881:20;26896:4;26881:10;;:14;;:20;;;;:::i;:::-;26868:10;:33;;;;26762:147;;:::o

Swarm Source

ipfs://bc33f20ac8edafe2689632b560d031c2b74e83fda7ce8e2855f182d1ece32129
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.