ETH Price: $3,629.66 (+0.09%)
Gas: 7.68 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ConnectUniswapV2

Compiler Version
v0.6.0+commit.26b70077

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

pragma solidity ^0.6.0;

interface TokenInterface {
    function approve(address, uint256) external;
    function transfer(address, uint) external;
    function transferFrom(address, address, uint) external;
    function deposit() external payable;
    function withdraw(uint) external;
    function balanceOf(address) external view returns (uint);
    function decimals() external view returns (uint);
}

interface MemoryInterface {
    function getUint(uint id) external returns (uint num);
    function setUint(uint id, uint val) external;
}

interface EventInterface {
    function emitEvent(uint connectorType, uint connectorID, bytes32 eventCode, bytes calldata eventData) external;
}

contract Stores {

  /**
   * @dev Return ethereum address
   */
  function getEthAddr() internal pure returns (address) {
    return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; // ETH Address
  }

  /**
   * @dev Return memory variable address
   */
  function getMemoryAddr() internal pure returns (address) {
    return 0x8a5419CfC711B2343c17a6ABf4B2bAFaBb06957F; // InstaMemory Address
  }

  /**
   * @dev Return InstaEvent Address.
   */
  function getEventAddr() internal pure returns (address) {
    return 0x2af7ea6Cb911035f3eb1ED895Cb6692C39ecbA97; // InstaEvent Address
  }

  /**
   * @dev Get Uint value from InstaMemory Contract.
   */
  function getUint(uint getId, uint val) internal returns (uint returnVal) {
    returnVal = getId == 0 ? val : MemoryInterface(getMemoryAddr()).getUint(getId);
  }

  /**
  * @dev Set Uint value in InstaMemory Contract.
  */
  function setUint(uint setId, uint val) virtual internal {
    if (setId != 0) MemoryInterface(getMemoryAddr()).setUint(setId, val);
  }

  /**
  * @dev emit event on event contract
  */
  function emitEvent(bytes32 eventCode, bytes memory eventData) virtual internal {
    (uint model, uint id) = connectorID();
    EventInterface(getEventAddr()).emitEvent(model, id, eventCode, eventData);
  }

  /**
  * @dev Connector Details.
  */
  function connectorID() public pure returns(uint model, uint id) {
    (model, id) = (1, 71);
  }

}

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

contract DSMath {
  uint constant WAD = 10 ** 18;
  uint constant RAY = 10 ** 27;

  function add(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.add(x, y);
  }

  function sub(uint x, uint y) internal virtual pure returns (uint z) {
    z = SafeMath.sub(x, y);
  }

  function mul(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.mul(x, y);
  }

  function div(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.div(x, y);
  }

  function wmul(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.add(SafeMath.mul(x, y), WAD / 2) / WAD;
  }

  function wdiv(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.add(SafeMath.mul(x, WAD), y / 2) / y;
  }

  function rdiv(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.add(SafeMath.mul(x, RAY), y / 2) / y;
  }

  function rmul(uint x, uint y) internal pure returns (uint z) {
    z = SafeMath.add(SafeMath.mul(x, y), RAY / 2) / RAY;
  }

}

pragma solidity >=0.4.0;

// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian {
    // credit for this implementation goes to
    // https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L687
    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        // this block is equivalent to r = uint256(1) << (BitMath.mostSignificantBit(x) / 2);
        // however that code costs significantly more gas
        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}

interface IUniswapV2Router02 {
    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 removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    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 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);
}

interface IUniswapV2Factory {
  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 feeTo() external view returns (address);
  function feeToSetter() external view returns (address);

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

interface IUniswapV2Pair {
  function balanceOf(address owner) 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 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);
}

contract UniswapHelpers is Stores, DSMath {
    using SafeMath for uint256;

    /**
     * @dev Return WETH address
     */
    function getAddressWETH() internal pure returns (address) {
        return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // mainnet
        // return 0xd0A1E359811322d97991E03f863a0C30C2cF029C; // kovan
    }

    /**
     * @dev Return uniswap v2 router02 Address
     */
    function getUniswapAddr() internal pure returns (address) {
        return 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    }

    function convert18ToDec(uint _dec, uint256 _amt) internal pure returns (uint256 amt) {
        amt = (_amt / 10 ** (18 - _dec));
    }

    function convertTo18(uint _dec, uint256 _amt) internal pure returns (uint256 amt) {
        amt = mul(_amt, 10 ** (18 - _dec));
    }

    function getTokenBalace(address token) internal view returns (uint256 amt) {
        amt = token == getEthAddr() ? address(this).balance : TokenInterface(token).balanceOf(address(this));
    }

    function changeEthAddress(address buy, address sell) internal pure returns(TokenInterface _buy, TokenInterface _sell){
        _buy = buy == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(buy);
        _sell = sell == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(sell);
    }

    function convertEthToWeth(TokenInterface token, uint amount) internal {
        if(address(token) == getAddressWETH()) token.deposit.value(amount)();
    }

    function convertWethToEth(TokenInterface token, uint amount) internal {
       if(address(token) == getAddressWETH()) {
            token.approve(getAddressWETH(), amount);
            token.withdraw(amount);
        }
    }

    function getExpectedBuyAmt(
        IUniswapV2Router02 router,
        address[] memory paths,
        uint sellAmt
    ) internal view returns(uint buyAmt) {
        uint[] memory amts = router.getAmountsOut(
            sellAmt,
            paths
        );
        buyAmt = amts[1];
    }

    function getExpectedSellAmt(
        IUniswapV2Router02 router,
        address[] memory paths,
        uint buyAmt
    ) internal view returns(uint sellAmt) {
        uint[] memory amts = router.getAmountsIn(
            buyAmt,
            paths
        );
        sellAmt = amts[0];
    }

    function checkPair(
        IUniswapV2Router02 router,
        address[] memory paths
    ) internal view {
        address pair = IUniswapV2Factory(router.factory()).getPair(paths[0], paths[1]);
        require(pair != address(0), "No-exchange-address");
    }

    function getPaths(
        address buyAddr,
        address sellAddr
    ) internal pure returns(address[] memory paths) {
        paths = new address[](2);
        paths[0] = address(sellAddr);
        paths[1] = address(buyAddr);
    }

    function changeEthToWeth(
        address[] memory tokens
    ) internal pure returns(TokenInterface[] memory _tokens) {
        _tokens = new TokenInterface[](2);
        _tokens[0] = tokens[0] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[0]);
        _tokens[1] = tokens[1] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[1]);
    }

    function calculateSwapInAmount(uint256 reserveIn, uint256 userIn)
        internal
        pure
        returns (uint256)
    {
         return
            Babylonian
                .sqrt(
                    reserveIn.mul(
                        userIn.mul(3988000).add(reserveIn.mul(3988009))
                    )
                ).sub(reserveIn.mul(1997)) / 1994;
    }
}

contract LiquidityHelpers is UniswapHelpers {
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint slippage
    ) internal returns (uint _amtA, uint _amtB, uint _liquidity) {
        IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());
        (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB);

        convertEthToWeth(_tokenA, amountADesired);
        convertEthToWeth(_tokenB, amountBDesired);
        _tokenA.approve(address(router), 0);
        _tokenA.approve(address(router), amountADesired);

        _tokenB.approve(address(router), 0);
        _tokenB.approve(address(router), amountBDesired);

       uint minAmtA = wmul(sub(WAD, slippage), amountADesired);
        uint minAmtB = wmul(sub(WAD, slippage), amountBDesired);

       (_amtA, _amtB, _liquidity) = router.addLiquidity(
            address(_tokenA),
            address(_tokenB),
            amountADesired,
            amountBDesired,
            minAmtA,
            minAmtB,
            address(this),
            now + 1
        );

        if (_amtA < amountADesired) {
            convertWethToEth(_tokenA, _tokenA.balanceOf(address(this)));
        }

        if (_amtB < amountBDesired) {
            convertWethToEth(_tokenB, _tokenB.balanceOf(address(this)));
        }
    }

    function _addSingleLiquidity(
        address tokenA,
        address tokenB,
        uint amountA,
        uint minUniAmount
    ) internal returns (uint _amtA, uint _amtB, uint _liquidity) {
        IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());
        (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB);
        
        uint256 _amountA = amountA;
        
        if (amountA == uint(-1)) {
            _amountA = tokenA == getEthAddr() ? address(this).balance : _tokenA.balanceOf(address(this));
        }

        convertEthToWeth(_tokenA, _amountA);


        uint256 _amountB; 
        
        (_amountA, _amountB)= _swapSingleToken(router, _tokenA, _tokenB, _amountA);

        _tokenA.approve(address(router), 0);
        _tokenA.approve(address(router), _amountA);

        _tokenB.approve(address(router), 0);
        _tokenB.approve(address(router), _amountB);

       (_amtA, _amtB, _liquidity) = router.addLiquidity(
            address(_tokenA),
            address(_tokenB),
            _amountA,
            _amountB,
            1, // TODO @thrilok209: check this
            1, // TODO @thrilok209: check this
            address(this),
            now + 1
        );

        require(_liquidity >= minUniAmount, "too much slippage");

        if (_amountA > _amtA) {
            convertWethToEth(_tokenA, _tokenA.balanceOf(address(this)));
        }

        if (_amountB > _amtB) {
            convertWethToEth(_tokenB, _tokenB.balanceOf(address(this)));
        }
    }

    function _swapSingleToken(
        IUniswapV2Router02 router,
        TokenInterface tokenA,
        TokenInterface tokenB,
        uint _amountA
    ) internal returns(uint256 amountA, uint256 amountB){
        IUniswapV2Factory factory = IUniswapV2Factory(router.factory());
        IUniswapV2Pair lpToken = IUniswapV2Pair(factory.getPair(address(tokenA), address(tokenB)));
        require(address(lpToken) != address(0), "No-exchange-address");
        
        (uint256 reserveA, uint256 reserveB, ) = lpToken.getReserves();
        uint256 reserveIn = lpToken.token0() == address(tokenA) ? reserveA : reserveB;
        uint256 swapAmtA = calculateSwapInAmount(reserveIn, _amountA);

        address[] memory paths = getPaths(address(tokenB), address(tokenA));

        tokenA.approve(address(router), swapAmtA);

        amountB = router.swapExactTokensForTokens(
            swapAmtA,
            1, // TODO @thrilok209: check this
            paths,
            address(this),
            now + 1
        )[1];

        amountA = sub(_amountA, swapAmtA);
    }

    function _removeLiquidity(
        address tokenA,
        address tokenB,
        uint _amt,
        uint unitAmtA,
        uint unitAmtB
    ) internal returns (uint _amtA, uint _amtB, uint _uniAmt) {
        IUniswapV2Router02 router;
        TokenInterface _tokenA;
        TokenInterface _tokenB;
        (router, _tokenA, _tokenB, _uniAmt) = _getRemoveLiquidityData(
            tokenA,
            tokenB,
            _amt
        );
        {
        uint minAmtA = convert18ToDec(_tokenA.decimals(), wmul(unitAmtA, _uniAmt));
        uint minAmtB = convert18ToDec(_tokenB.decimals(), wmul(unitAmtB, _uniAmt));
        (_amtA, _amtB) = router.removeLiquidity(
            address(_tokenA),
            address(_tokenB),
            _uniAmt,
            minAmtA,
            minAmtB,
            address(this),
            now + 1
        );
        }
        convertWethToEth(_tokenA, _amtA);
        convertWethToEth(_tokenB, _amtB);
    }

    function _getRemoveLiquidityData(
        address tokenA,
        address tokenB,
        uint _amt
    ) internal returns (IUniswapV2Router02 router, TokenInterface _tokenA, TokenInterface _tokenB, uint _uniAmt) {
        router = IUniswapV2Router02(getUniswapAddr());
        (_tokenA, _tokenB) = changeEthAddress(tokenA, tokenB);
        address exchangeAddr = IUniswapV2Factory(router.factory()).getPair(address(_tokenA), address(_tokenB));
        require(exchangeAddr != address(0), "pair-not-found.");

        TokenInterface uniToken = TokenInterface(exchangeAddr);
        _uniAmt = _amt == uint(-1) ? uniToken.balanceOf(address(this)) : _amt;
        uniToken.approve(address(router), _uniAmt);
    }
}

contract UniswapLiquidity is LiquidityHelpers {
    event LogDepositLiquidity(
        address indexed tokenA,
        address indexed tokenB,
        uint amtA,
        uint amtB,
        uint uniAmount,
        uint getIdA,
        uint getIdB,
        uint setId
    );

    event LogWithdrawLiquidity(
        address indexed tokenA,
        address indexed tokenB,
        uint amountA,
        uint amountB,
        uint uniAmount,
        uint getId,
        uint[] setId
    );


    /**
     * @dev Deposit Liquidity.
     * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param amountADesired tokenA amount.
     * @param amountBDesired tokenB amount.
     * @param slippage slippage for tokenA & tokenB.(For 1%: 1e16, 10%: 1e17)
     * @param getIdA Get tokenA amount at this ID from `InstaMemory` Contract.
     * @param getIdB Get tokenB amount at this ID from `InstaMemory` Contract.
     * @param setId Set token amount at this ID in `InstaMemory` Contract.
    */
    function deposit(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint slippage,
        uint getIdA,
        uint getIdB,
        uint setId
    ) external payable {
        uint _amtADesired = getUint(getIdA, amountADesired);
        uint _amtBDesired = getUint(getIdB, amountBDesired);

        (uint _amtA, uint _amtB, uint _uniAmt) = _addLiquidity(
                                            tokenA,
                                            tokenB,
                                            _amtADesired,
                                            _amtBDesired,
                                            slippage
                                        );
        setUint(setId, _uniAmt);

        emit LogDepositLiquidity(
            tokenA,
            tokenB,
            _amtA,
            _amtB,
            _uniAmt,
            getIdA,
            getIdB,
            setId
        );

    }


     /**
     * @dev Deposit Liquidity using Single token.
     * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param amountA tokenA amount.
     * @param minUniAmount min uni token amount.
     * @param getId Get tokenA amount at this ID from `InstaMemory` Contract.
     * @param setId Set token amount at this ID in `InstaMemory` Contract.
    */
    function singleDeposit(
        address tokenA,
        address tokenB,
        uint amountA,
        uint minUniAmount,
        uint getId,
        uint setId
    ) external payable {
        uint _amt = getUint(getId, amountA);

        (uint _amtA, uint _amtB, uint _uniAmt) = _addSingleLiquidity(
                                            tokenA,
                                            tokenB,
                                            _amt,
                                            minUniAmount
                                        );
        setUint(setId, _uniAmt);

        emit LogDepositLiquidity(
            tokenA,
            tokenB,
            _amtA,
            _amtB,
            _uniAmt,
            getId,
            0,
            setId
        );
    }

       

    /**
     * @dev Withdraw Liquidity.
     * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param uniAmt uni token amount.
     * @param unitAmtA unit amount of amtA/uniAmt with slippage.
     * @param unitAmtB unit amount of amtB/uniAmt with slippage.
     * @param getId Get token amount at this ID from `InstaMemory` Contract.
     * @param setIds Set token amounts at this IDs in `InstaMemory` Contract.
    */
    function withdraw(
        address tokenA,
        address tokenB,
        uint uniAmt,
        uint unitAmtA,
        uint unitAmtB,
        uint getId,
        uint[] calldata setIds
    ) external payable {
        uint _amt = getUint(getId, uniAmt);

        (uint _amtA, uint _amtB, uint _uniAmt) = _removeLiquidity(
            tokenA,
            tokenB,
            _amt,
            unitAmtA,
            unitAmtB
        );

        setUint(setIds[0], _amtA);
        setUint(setIds[1], _amtB);

         emit LogWithdrawLiquidity(
            tokenA,
            tokenB,
            _amtA,
            _amtB,
            _uniAmt,
            getId,
            setIds
        );
    }
}

contract UniswapResolver is UniswapLiquidity {
    event LogBuy(
        address indexed buyToken,
        address indexed sellToken,
        uint256 buyAmt,
        uint256 sellAmt,
        uint256 getId,
        uint256 setId
    );

    event LogSell(
        address indexed buyToken,
        address indexed sellToken,
        uint256 buyAmt,
        uint256 sellAmt,
        uint256 getId,
        uint256 setId
    );

    /**
     * @dev Buy ETH/ERC20_Token.
     * @param buyAddr buying token address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param sellAddr selling token amount.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param buyAmt buying token amount.
     * @param unitAmt unit amount of sellAmt/buyAmt with slippage.
     * @param getId Get token amount at this ID from `InstaMemory` Contract.
     * @param setId Set token amount at this ID in `InstaMemory` Contract.
    */
    function buy(
        address buyAddr,
        address sellAddr,
        uint buyAmt,
        uint unitAmt,
        uint getId,
        uint setId
    ) external payable {
        uint _buyAmt = getUint(getId, buyAmt);
        (TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
        address[] memory paths = getPaths(address(_buyAddr), address(_sellAddr));

        uint _slippageAmt = convert18ToDec(_sellAddr.decimals(),
            wmul(unitAmt, convertTo18(_buyAddr.decimals(), _buyAmt)));

        IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());

        checkPair(router, paths);
        uint _expectedAmt = getExpectedSellAmt(router, paths, _buyAmt);
        require(_slippageAmt >= _expectedAmt, "Too much slippage");

        convertEthToWeth(_sellAddr, _expectedAmt);
        _sellAddr.approve(address(router), _expectedAmt);

        uint _sellAmt = router.swapTokensForExactTokens(
            _buyAmt,
            _expectedAmt,
            paths,
            address(this),
            now + 1
        )[0];

        convertWethToEth(_buyAddr, _buyAmt);

        setUint(setId, _sellAmt);

        emit LogBuy(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId);
    }

    /**
     * @dev Sell ETH/ERC20_Token.
     * @param buyAddr buying token address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param sellAddr selling token amount.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE)
     * @param sellAmt selling token amount.
     * @param unitAmt unit amount of buyAmt/sellAmt with slippage.
     * @param getId Get token amount at this ID from `InstaMemory` Contract.
     * @param setId Set token amount at this ID in `InstaMemory` Contract.
    */
    function sell(
        address buyAddr,
        address sellAddr,
        uint sellAmt,
        uint unitAmt,
        uint getId,
        uint setId
    ) external payable {
        uint _sellAmt = getUint(getId, sellAmt);
        (TokenInterface _buyAddr, TokenInterface _sellAddr) = changeEthAddress(buyAddr, sellAddr);
        address[] memory paths = getPaths(address(_buyAddr), address(_sellAddr));

        if (_sellAmt == uint(-1)) {
            _sellAmt = sellAddr == getEthAddr() ? address(this).balance : _sellAddr.balanceOf(address(this));
        }

        uint _slippageAmt = convert18ToDec(_buyAddr.decimals(),
            wmul(unitAmt, convertTo18(_sellAddr.decimals(), _sellAmt)));

        IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr());

        checkPair(router, paths);
        uint _expectedAmt = getExpectedBuyAmt(router, paths, _sellAmt);
        require(_slippageAmt <= _expectedAmt, "Too much slippage");

        convertEthToWeth(_sellAddr, _sellAmt);
        _sellAddr.approve(address(router), _sellAmt);

        uint _buyAmt = router.swapExactTokensForTokens(
            _sellAmt,
            _expectedAmt,
            paths,
            address(this),
            now + 1
        )[1];

        convertWethToEth(_buyAddr, _buyAmt);

        setUint(setId, _buyAmt);

        emit LogSell(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId);
    }
}


contract ConnectUniswapV2 is UniswapResolver {
    string public name = "UniswapV2-v1.1";
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyToken","type":"address"},{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"setId","type":"uint256"}],"name":"LogBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amtA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uniAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getIdA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getIdB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"setId","type":"uint256"}],"name":"LogDepositLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyToken","type":"address"},{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"buyAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"setId","type":"uint256"}],"name":"LogSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenA","type":"address"},{"indexed":true,"internalType":"address","name":"tokenB","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountA","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"uniAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"setId","type":"uint256[]"}],"name":"LogWithdrawLiquidity","type":"event"},{"inputs":[{"internalType":"address","name":"buyAddr","type":"address"},{"internalType":"address","name":"sellAddr","type":"address"},{"internalType":"uint256","name":"buyAmt","type":"uint256"},{"internalType":"uint256","name":"unitAmt","type":"uint256"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"connectorID","outputs":[{"internalType":"uint256","name":"model","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"slippage","type":"uint256"},{"internalType":"uint256","name":"getIdA","type":"uint256"},{"internalType":"uint256","name":"getIdB","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyAddr","type":"address"},{"internalType":"address","name":"sellAddr","type":"address"},{"internalType":"uint256","name":"sellAmt","type":"uint256"},{"internalType":"uint256","name":"unitAmt","type":"uint256"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"minUniAmount","type":"uint256"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"singleDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"uniAmt","type":"uint256"},{"internalType":"uint256","name":"unitAmtA","type":"uint256"},{"internalType":"uint256","name":"unitAmtB","type":"uint256"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256[]","name":"setIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600e81526020017f556e697377617056322d76312e31000000000000000000000000000000000000815250600090805190602001906200005192919062000066565b503480156200005f57600080fd5b5062000115565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000a957805160ff1916838001178555620000da565b82800160010185558215620000da579182015b82811115620000d9578251825591602001919060010190620000bc565b5b509050620000e99190620000ed565b5090565b6200011291905b808211156200010e576000816000905550600101620000f4565b5090565b90565b613cca80620001256000396000f3fe6080604052600436106100705760003560e01c8063848d8f281161004e578063848d8f2814610232578063af7c9c75146102be578063c78078681461034a578063eb15f7811461042b57610070565b806306fdde031461007557806321e74bf61461010557806345c9acfe146101a6575b600080fd5b34801561008157600080fd5b5061008a61045d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100ca5780820151818401526020810190506100af565b50505050905090810190601f1680156100f75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101a4600480360361010081101561011c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506104fb565b005b610230600480360360c08110156101bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506105d5565b005b6102bc600480360360c081101561024857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610bfb565b005b610348600480360360c08110156102d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506110fd565b005b610429600480360360e081101561036057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184602083028401116401000000008311171561041957600080fd5b90919293919293905050506111c6565b005b34801561043757600080fd5b506104406112e8565b604051808381526020018281526020019250505060405180910390f35b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104f35780601f106104c8576101008083540402835291602001916104f3565b820191906000526020600020905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b60006105078488611301565b905060006105158488611301565b905060008060006105298d8d87878d6113ae565b92509250925061053986826119b0565b8b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f98446d47f482c993d2f97a98ef5d5e5353a7bdc8aaee667ec7bf97925d629f7b8585858d8d8d60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050505050565b60006105e18386611301565b90506000806105f08989611a37565b9150915060606106008383611ad7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141561072657610632611ba2565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610721578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156106e157600080fd5b505afa1580156106f5573d6000803e3d6000fd5b505050506040513d602081101561070b57600080fd5b8101908080519060200190929190505050610723565b475b93505b60006108448473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077157600080fd5b505afa158015610785573d6000803e3d6000fd5b505050506040513d602081101561079b57600080fd5b810190808051906020019092919050505061083f8a61083a8773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156107f957600080fd5b505afa15801561080d573d6000803e3d6000fd5b505050506040513d602081101561082357600080fd5b81019080805190602001909291905050508a611bbe565b611bd8565b611c18565b90506000610850611c32565b905061085c8184611c4e565b6000610869828589611e8e565b9050808311156108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b6108eb8588612022565b8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff166338ed173989848830600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610a46578082015181840152602081019050610a2b565b505050509050019650505050505050600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610aad57600080fd5b8101908080516040519392919084640100000000821115610acd57600080fd5b83820191506020820185811115610ae357600080fd5b8251866020820283011164010000000082111715610b0057600080fd5b8083526020830192505050908051906020019060200280838360005b83811015610b37578082015181840152602081019050610b1c565b50505050905001604052505050600181518110610b5057fe5b60200260200101519050610b6487826120c3565b610b6e89826119b0565b8c73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f1cfcd3047f831e194b89f1ca8957ba1aa919764f692e915eef67b5e7a3e71acb838b8e8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050505050565b6000610c078386611301565b9050600080610c168989611a37565b915091506060610c268383611ad7565b90506000610d468373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7357600080fd5b505afa158015610c87573d6000803e3d6000fd5b505050506040513d6020811015610c9d57600080fd5b8101908080519060200190929190505050610d418a610d3c8873ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d6020811015610d2557600080fd5b81019080805190602001909291905050508a611bbe565b611bd8565b611c18565b90506000610d52611c32565b9050610d5e8184611c4e565b6000610d6b828589612214565b905080831015610de3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b610ded8582612022565b8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610e7457600080fd5b505af1158015610e88573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff16638803dbee89848830600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610f48578082015181840152602081019050610f2d565b505050509050019650505050505050600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610faf57600080fd5b8101908080516040519392919084640100000000821115610fcf57600080fd5b83820191506020820185811115610fe557600080fd5b825186602082028301116401000000008211171561100257600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561103957808201518184015260208101905061101e565b5050505090500160405250505060008151811061105257fe5b6020026020010151905061106687896120c3565b61107089826119b0565b8c73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f1c35239455616e5d56d6e721c41fe501666f6d3f292e87e7c20f6d08dcb0b44b8a848e8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050505050565b60006111098386611301565b9050600080600061111c8a8a868a6123a8565b92509250925061112c85826119b0565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f98446d47f482c993d2f97a98ef5d5e5353a7bdc8aaee667ec7bf97925d629f7b8585858b60008c60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050565b60006111d28488611301565b905060008060006111e68c8c868c8c612b17565b925092509250611209868660008181106111fc57fe5b90506020020135846119b0565b6112268686600181811061121957fe5b90506020020135836119b0565b8a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f43f0c8ec69d4b420508325850527c82aaa490daf01006b263b7e034035a234598585858c8c8c60405180878152602001868152602001858152602001848152602001806020018281038252848482818152602001925060200280828437600081840152601f19601f82011690508083019250505097505050505050505060405180910390a3505050505050505050505050565b6000806001604781915080905080925081935050509091565b60008083146113a457611312612de3565b73ffffffffffffffffffffffffffffffffffffffff1663a9c70eaa846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b81019080805190602001909291905050506113a6565b815b905092915050565b6000806000806113bc611c32565b90506000806113cb8b8b611a37565b915091506113d9828a612022565b6113e38189612022565b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b38460006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561150a57600080fd5b505af115801561151e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b38460006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156115aa57600080fd5b505af11580156115be573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561164957600080fd5b505af115801561165d573d6000803e3d6000fd5b50505050600061167e611678670de0b6b3a76400008a612dff565b8b611bd8565b9050600061169d611697670de0b6b3a76400008b612dff565b8b611bd8565b90508473ffffffffffffffffffffffffffffffffffffffff1663e8e3370085858e8e878730600142016040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b1580156117b157600080fd5b505af11580156117c5573d6000803e3d6000fd5b505050506040513d60608110156117db57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050809850819950829a505050508a8810156118d6576118d5848573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189557600080fd5b505afa1580156118a9573d6000803e3d6000fd5b505050506040513d60208110156118bf57600080fd5b81019080805190602001909291905050506120c3565b5b898710156119a05761199f838473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b81019080805190602001909291905050506120c3565b5b5050505050955095509592505050565b60008214611a33576119c0612de3565b73ffffffffffffffffffffffffffffffffffffffff166361e3c94483836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050505b5050565b600080611a42611ba2565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a7a5783611a83565b611a82612e13565b5b9150611a8d611ba2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ac55782611ace565b611acd612e13565b5b90509250929050565b60606002604051908082528060200260200182016040528015611b095781602001602082028038833980820191505090505b5090508181600081518110611b1a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281600181518110611b6257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505092915050565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee905090565b6000611bd08284601203600a0a612e2f565b905092915050565b6000670de0b6b3a7640000611c08611bf08585612e43565b6002670de0b6b3a764000081611c0257fe5b04612ec9565b81611c0f57fe5b04905092915050565b600082601203600a0a8281611c2957fe5b04905092915050565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905090565b60008273ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611c9657600080fd5b505afa158015611caa573d6000803e3d6000fd5b505050506040513d6020811015611cc057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e6a4390583600081518110611cf957fe5b602002602001015184600181518110611d0e57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611da957600080fd5b505afa158015611dbd573d6000803e3d6000fd5b505050506040513d6020811015611dd357600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f2d65786368616e67652d616464726573730000000000000000000000000081525060200191505060405180910390fd5b505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611f08578082015181840152602081019050611eed565b50505050905001935050505060006040518083038186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611f6a57600080fd5b8101908080516040519392919084640100000000821115611f8a57600080fd5b83820191506020820185811115611fa057600080fd5b8251866020820283011164010000000082111715611fbd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611ff4578082015181840152602081019050611fd9565b5050505090500160405250505090508060018151811061201057fe5b60200260200101519150509392505050565b61202a612e13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120bf578173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b50505050505b5050565b6120cb612e13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612210578173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3612122612e13565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561218c57600080fd5b505af11580156121a0573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121f757600080fd5b505af115801561220b573d6000803e3d6000fd5b505050505b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff16631f00ca7484866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561228e578082015181840152602081019050612273565b50505050905001935050505060006040518083038186803b1580156122b257600080fd5b505afa1580156122c6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156122f057600080fd5b810190808051604051939291908464010000000082111561231057600080fd5b8382019150602082018581111561232657600080fd5b825186602082028301116401000000008211171561234357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561237a57808201518184015260208101905061235f565b5050505090500160405250505090508060008151811061239657fe5b60200260200101519150509392505050565b6000806000806123b6611c32565b90506000806123c58a8a611a37565b9150915060008890507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8914156124f2576123fe611ba2565b73ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16146124ed578273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124ad57600080fd5b505afa1580156124c1573d6000803e3d6000fd5b505050506040513d60208110156124d757600080fd5b81019080805190602001909291905050506124ef565b475b90505b6124fc8382612022565b600061250a85858585612f51565b80925081935050508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b38660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561259a57600080fd5b505af11580156125ae573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b386846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b38660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b386836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561277857600080fd5b505af115801561278c573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff1663e8e337008585858560018030600142016040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b1580156128a357600080fd5b505af11580156128b7573d6000803e3d6000fd5b505050506040513d60608110156128cd57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050809850819950829a5050505088861015612974576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b87821115612a3e57612a3d848573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156129fd57600080fd5b505afa158015612a11573d6000803e3d6000fd5b505050506040513d6020811015612a2757600080fd5b81019080805190602001909291905050506120c3565b5b86811115612b0857612b07838473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ac757600080fd5b505afa158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b81019080805190602001909291905050506120c3565b5b50505050509450945094915050565b600080600080600080612b2b8b8b8b61358e565b809750819450829550839650505050506000612bd08373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8657600080fd5b505afa158015612b9a573d6000803e3d6000fd5b505050506040513d6020811015612bb057600080fd5b8101908080519060200190929190505050612bcb8b88611bd8565b611c18565b90506000612c678373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1d57600080fd5b505afa158015612c31573d6000803e3d6000fd5b505050506040513d6020811015612c4757600080fd5b8101908080519060200190929190505050612c628b89611bd8565b611c18565b90508473ffffffffffffffffffffffffffffffffffffffff1663baa2abde858589868630600142016040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b158015612d7257600080fd5b505af1158015612d86573d6000803e3d6000fd5b505050506040513d6040811015612d9c57600080fd5b81019080805190602001909291908051906020019092919050505080985081995050505050612dcb82876120c3565b612dd581866120c3565b505050955095509592505050565b6000738a5419cfc711b2343c17a6abf4b2bafabb06957f905090565b6000612e0b838361395a565b905092915050565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2905090565b6000612e3b8383612e43565b905092915050565b600080831415612e565760009050612ec3565b6000828402905082848281612e6757fe5b0414612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c746021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015612f47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008060008673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612f9c57600080fd5b505afa158015612fb0573d6000803e3d6000fd5b505050506040513d6020811015612fc657600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff1663e6a4390588886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561308c57600080fd5b505afa1580156130a0573d6000803e3d6000fd5b505050506040513d60208110156130b657600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f2d65786368616e67652d616464726573730000000000000000000000000081525060200191505060405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d60608110156131df57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008973ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561328857600080fd5b505afa15801561329c573d6000803e3d6000fd5b505050506040513d60208110156132b257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146132e457816132e6565b825b905060006132f4828a6139a4565b905060606133028b8d611ad7565b90508b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b38e846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561338b57600080fd5b505af115801561339f573d6000803e3d6000fd5b505050508c73ffffffffffffffffffffffffffffffffffffffff166338ed17398360018430600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561345e578082015181840152602081019050613443565b505050509050019650505050505050600060405180830381600087803b15801561348757600080fd5b505af115801561349b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156134c557600080fd5b81019080805160405193929190846401000000008211156134e557600080fd5b838201915060208201858111156134fb57600080fd5b825186602082028301116401000000008211171561351857600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561354f578082015181840152602081019050613534565b5050505090500160405250505060018151811061356857fe5b6020026020010151975061357c8a83612dff565b98505050505050505094509492505050565b60008060008061359c611c32565b93506135a88787611a37565b809350819450505060008473ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156135f857600080fd5b505afa15801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d602081101561370d57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156137c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f706169722d6e6f742d666f756e642e000000000000000000000000000000000081525060200191505060405180910390fd5b60008190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87146137f557866138ae565b8073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561387257600080fd5b505afa158015613886573d6000803e3d6000fd5b505050506040513d602081101561389c57600080fd5b81019080805190602001909291905050505b92508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b387856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561393757600080fd5b505af115801561394b573d6000803e3d6000fd5b50505050505093509350935093565b600061399c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a36565b905092915050565b60006107ca613a266139c16107cd86612e4390919063ffffffff16565b613a18613a13613a046139e0623cda298a612e4390919063ffffffff16565b6139f6623cda208a612e4390919063ffffffff16565b612ec990919063ffffffff16565b88612e4390919063ffffffff16565b613af6565b61395a90919063ffffffff16565b81613a2d57fe5b04905092915050565b6000838311158290613ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aa8578082015181840152602081019050613a8d565b50505050905090810190601f168015613ad55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080821415613b095760009050613c6e565b60008290506000600190507001000000000000000000000000000000008210613b3b57608082901c9150604081901b90505b680100000000000000008210613b5a57604082901c9150602081901b90505b6401000000008210613b7557602082901c9150601081901b90505b620100008210613b8e57601082901c9150600881901b90505b6101008210613ba657600882901c9150600481901b90505b60108210613bbd57600482901c9150600281901b90505b60088210613bcd57600181901b90505b6001818581613bd857fe5b048201901c90506001818581613bea57fe5b048201901c90506001818581613bfc57fe5b048201901c90506001818581613c0e57fe5b048201901c90506001818581613c2057fe5b048201901c90506001818581613c3257fe5b048201901c90506001818581613c4457fe5b048201901c90506000818581613c5657fe5b049050808210613c665780613c68565b815b93505050505b91905056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220431c1c456e00b34f5c9def14904897c77af3467afbf6d57643ca29f8ba35317b64736f6c63430006000033

Deployed Bytecode

0x6080604052600436106100705760003560e01c8063848d8f281161004e578063848d8f2814610232578063af7c9c75146102be578063c78078681461034a578063eb15f7811461042b57610070565b806306fdde031461007557806321e74bf61461010557806345c9acfe146101a6575b600080fd5b34801561008157600080fd5b5061008a61045d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100ca5780820151818401526020810190506100af565b50505050905090810190601f1680156100f75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101a4600480360361010081101561011c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506104fb565b005b610230600480360360c08110156101bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506105d5565b005b6102bc600480360360c081101561024857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610bfb565b005b610348600480360360c08110156102d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506110fd565b005b610429600480360360e081101561036057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001906401000000008111156103e557600080fd5b8201836020820111156103f757600080fd5b8035906020019184602083028401116401000000008311171561041957600080fd5b90919293919293905050506111c6565b005b34801561043757600080fd5b506104406112e8565b604051808381526020018281526020019250505060405180910390f35b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104f35780601f106104c8576101008083540402835291602001916104f3565b820191906000526020600020905b8154815290600101906020018083116104d657829003601f168201915b505050505081565b60006105078488611301565b905060006105158488611301565b905060008060006105298d8d87878d6113ae565b92509250925061053986826119b0565b8b73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f98446d47f482c993d2f97a98ef5d5e5353a7bdc8aaee667ec7bf97925d629f7b8585858d8d8d60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050505050565b60006105e18386611301565b90506000806105f08989611a37565b9150915060606106008383611ad7565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84141561072657610632611ba2565b73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610721578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156106e157600080fd5b505afa1580156106f5573d6000803e3d6000fd5b505050506040513d602081101561070b57600080fd5b8101908080519060200190929190505050610723565b475b93505b60006108448473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077157600080fd5b505afa158015610785573d6000803e3d6000fd5b505050506040513d602081101561079b57600080fd5b810190808051906020019092919050505061083f8a61083a8773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156107f957600080fd5b505afa15801561080d573d6000803e3d6000fd5b505050506040513d602081101561082357600080fd5b81019080805190602001909291905050508a611bbe565b611bd8565b611c18565b90506000610850611c32565b905061085c8184611c4e565b6000610869828589611e8e565b9050808311156108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b6108eb8588612022565b8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561097257600080fd5b505af1158015610986573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff166338ed173989848830600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610a46578082015181840152602081019050610a2b565b505050509050019650505050505050600060405180830381600087803b158015610a6f57600080fd5b505af1158015610a83573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610aad57600080fd5b8101908080516040519392919084640100000000821115610acd57600080fd5b83820191506020820185811115610ae357600080fd5b8251866020820283011164010000000082111715610b0057600080fd5b8083526020830192505050908051906020019060200280838360005b83811015610b37578082015181840152602081019050610b1c565b50505050905001604052505050600181518110610b5057fe5b60200260200101519050610b6487826120c3565b610b6e89826119b0565b8c73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f1cfcd3047f831e194b89f1ca8957ba1aa919764f692e915eef67b5e7a3e71acb838b8e8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050505050565b6000610c078386611301565b9050600080610c168989611a37565b915091506060610c268383611ad7565b90506000610d468373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c7357600080fd5b505afa158015610c87573d6000803e3d6000fd5b505050506040513d6020811015610c9d57600080fd5b8101908080519060200190929190505050610d418a610d3c8873ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d6020811015610d2557600080fd5b81019080805190602001909291905050508a611bbe565b611bd8565b611c18565b90506000610d52611c32565b9050610d5e8184611c4e565b6000610d6b828589612214565b905080831015610de3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b610ded8582612022565b8473ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610e7457600080fd5b505af1158015610e88573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff16638803dbee89848830600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015610f48578082015181840152602081019050610f2d565b505050509050019650505050505050600060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610faf57600080fd5b8101908080516040519392919084640100000000821115610fcf57600080fd5b83820191506020820185811115610fe557600080fd5b825186602082028301116401000000008211171561100257600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561103957808201518184015260208101905061101e565b5050505090500160405250505060008151811061105257fe5b6020026020010151905061106687896120c3565b61107089826119b0565b8c73ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff167f1c35239455616e5d56d6e721c41fe501666f6d3f292e87e7c20f6d08dcb0b44b8a848e8e6040518085815260200184815260200183815260200182815260200194505050505060405180910390a35050505050505050505050505050565b60006111098386611301565b9050600080600061111c8a8a868a6123a8565b92509250925061112c85826119b0565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f98446d47f482c993d2f97a98ef5d5e5353a7bdc8aaee667ec7bf97925d629f7b8585858b60008c60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a350505050505050505050565b60006111d28488611301565b905060008060006111e68c8c868c8c612b17565b925092509250611209868660008181106111fc57fe5b90506020020135846119b0565b6112268686600181811061121957fe5b90506020020135836119b0565b8a73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f43f0c8ec69d4b420508325850527c82aaa490daf01006b263b7e034035a234598585858c8c8c60405180878152602001868152602001858152602001848152602001806020018281038252848482818152602001925060200280828437600081840152601f19601f82011690508083019250505097505050505050505060405180910390a3505050505050505050505050565b6000806001604781915080905080925081935050509091565b60008083146113a457611312612de3565b73ffffffffffffffffffffffffffffffffffffffff1663a9c70eaa846040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561136457600080fd5b505af1158015611378573d6000803e3d6000fd5b505050506040513d602081101561138e57600080fd5b81019080805190602001909291905050506113a6565b815b905092915050565b6000806000806113bc611c32565b90506000806113cb8b8b611a37565b915091506113d9828a612022565b6113e38189612022565b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b38460006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561150a57600080fd5b505af115801561151e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b38460006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156115aa57600080fd5b505af11580156115be573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3848a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561164957600080fd5b505af115801561165d573d6000803e3d6000fd5b50505050600061167e611678670de0b6b3a76400008a612dff565b8b611bd8565b9050600061169d611697670de0b6b3a76400008b612dff565b8b611bd8565b90508473ffffffffffffffffffffffffffffffffffffffff1663e8e3370085858e8e878730600142016040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b1580156117b157600080fd5b505af11580156117c5573d6000803e3d6000fd5b505050506040513d60608110156117db57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050809850819950829a505050508a8810156118d6576118d5848573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189557600080fd5b505afa1580156118a9573d6000803e3d6000fd5b505050506040513d60208110156118bf57600080fd5b81019080805190602001909291905050506120c3565b5b898710156119a05761199f838473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561195f57600080fd5b505afa158015611973573d6000803e3d6000fd5b505050506040513d602081101561198957600080fd5b81019080805190602001909291905050506120c3565b5b5050505050955095509592505050565b60008214611a33576119c0612de3565b73ffffffffffffffffffffffffffffffffffffffff166361e3c94483836040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050505b5050565b600080611a42611ba2565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611a7a5783611a83565b611a82612e13565b5b9150611a8d611ba2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611ac55782611ace565b611acd612e13565b5b90509250929050565b60606002604051908082528060200260200182016040528015611b095781602001602082028038833980820191505090505b5090508181600081518110611b1a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281600181518110611b6257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505092915050565b600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee905090565b6000611bd08284601203600a0a612e2f565b905092915050565b6000670de0b6b3a7640000611c08611bf08585612e43565b6002670de0b6b3a764000081611c0257fe5b04612ec9565b81611c0f57fe5b04905092915050565b600082601203600a0a8281611c2957fe5b04905092915050565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d905090565b60008273ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015611c9657600080fd5b505afa158015611caa573d6000803e3d6000fd5b505050506040513d6020811015611cc057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e6a4390583600081518110611cf957fe5b602002602001015184600181518110611d0e57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611da957600080fd5b505afa158015611dbd573d6000803e3d6000fd5b505050506040513d6020811015611dd357600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e89576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f2d65786368616e67652d616464726573730000000000000000000000000081525060200191505060405180910390fd5b505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663d06ca61f84866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611f08578082015181840152602081019050611eed565b50505050905001935050505060006040518083038186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611f6a57600080fd5b8101908080516040519392919084640100000000821115611f8a57600080fd5b83820191506020820185811115611fa057600080fd5b8251866020820283011164010000000082111715611fbd57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611ff4578082015181840152602081019050611fd9565b5050505090500160405250505090508060018151811061201057fe5b60200260200101519150509392505050565b61202a612e13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120bf578173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120a557600080fd5b505af11580156120b9573d6000803e3d6000fd5b50505050505b5050565b6120cb612e13565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612210578173ffffffffffffffffffffffffffffffffffffffff1663095ea7b3612122612e13565b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561218c57600080fd5b505af11580156121a0573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121f757600080fd5b505af115801561220b573d6000803e3d6000fd5b505050505b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff16631f00ca7484866040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561228e578082015181840152602081019050612273565b50505050905001935050505060006040518083038186803b1580156122b257600080fd5b505afa1580156122c6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156122f057600080fd5b810190808051604051939291908464010000000082111561231057600080fd5b8382019150602082018581111561232657600080fd5b825186602082028301116401000000008211171561234357600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561237a57808201518184015260208101905061235f565b5050505090500160405250505090508060008151811061239657fe5b60200260200101519150509392505050565b6000806000806123b6611c32565b90506000806123c58a8a611a37565b9150915060008890507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8914156124f2576123fe611ba2565b73ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16146124ed578273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156124ad57600080fd5b505afa1580156124c1573d6000803e3d6000fd5b505050506040513d60208110156124d757600080fd5b81019080805190602001909291905050506124ef565b475b90505b6124fc8382612022565b600061250a85858585612f51565b80925081935050508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b38660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561259a57600080fd5b505af11580156125ae573d6000803e3d6000fd5b505050508373ffffffffffffffffffffffffffffffffffffffff1663095ea7b386846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561263957600080fd5b505af115801561264d573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b38660006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156126d957600080fd5b505af11580156126ed573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b386836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561277857600080fd5b505af115801561278c573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff1663e8e337008585858560018030600142016040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b1580156128a357600080fd5b505af11580156128b7573d6000803e3d6000fd5b505050506040513d60608110156128cd57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050809850819950829a5050505088861015612974576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f746f6f206d75636820736c69707061676500000000000000000000000000000081525060200191505060405180910390fd5b87821115612a3e57612a3d848573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156129fd57600080fd5b505afa158015612a11573d6000803e3d6000fd5b505050506040513d6020811015612a2757600080fd5b81019080805190602001909291905050506120c3565b5b86811115612b0857612b07838473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ac757600080fd5b505afa158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b81019080805190602001909291905050506120c3565b5b50505050509450945094915050565b600080600080600080612b2b8b8b8b61358e565b809750819450829550839650505050506000612bd08373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8657600080fd5b505afa158015612b9a573d6000803e3d6000fd5b505050506040513d6020811015612bb057600080fd5b8101908080519060200190929190505050612bcb8b88611bd8565b611c18565b90506000612c678373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1d57600080fd5b505afa158015612c31573d6000803e3d6000fd5b505050506040513d6020811015612c4757600080fd5b8101908080519060200190929190505050612c628b89611bd8565b611c18565b90508473ffffffffffffffffffffffffffffffffffffffff1663baa2abde858589868630600142016040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b158015612d7257600080fd5b505af1158015612d86573d6000803e3d6000fd5b505050506040513d6040811015612d9c57600080fd5b81019080805190602001909291908051906020019092919050505080985081995050505050612dcb82876120c3565b612dd581866120c3565b505050955095509592505050565b6000738a5419cfc711b2343c17a6abf4b2bafabb06957f905090565b6000612e0b838361395a565b905092915050565b600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2905090565b6000612e3b8383612e43565b905092915050565b600080831415612e565760009050612ec3565b6000828402905082848281612e6757fe5b0414612ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c746021913960400191505060405180910390fd5b809150505b92915050565b600080828401905083811015612f47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008060008673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612f9c57600080fd5b505afa158015612fb0573d6000803e3d6000fd5b505050506040513d6020811015612fc657600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff1663e6a4390588886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561308c57600080fd5b505afa1580156130a0573d6000803e3d6000fd5b505050506040513d60208110156130b657600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561316c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4e6f2d65786368616e67652d616464726573730000000000000000000000000081525060200191505060405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131b557600080fd5b505afa1580156131c9573d6000803e3d6000fd5b505050506040513d60608110156131df57600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff16915060008973ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561328857600080fd5b505afa15801561329c573d6000803e3d6000fd5b505050506040513d60208110156132b257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146132e457816132e6565b825b905060006132f4828a6139a4565b905060606133028b8d611ad7565b90508b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b38e846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561338b57600080fd5b505af115801561339f573d6000803e3d6000fd5b505050508c73ffffffffffffffffffffffffffffffffffffffff166338ed17398360018430600142016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561345e578082015181840152602081019050613443565b505050509050019650505050505050600060405180830381600087803b15801561348757600080fd5b505af115801561349b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156134c557600080fd5b81019080805160405193929190846401000000008211156134e557600080fd5b838201915060208201858111156134fb57600080fd5b825186602082028301116401000000008211171561351857600080fd5b8083526020830192505050908051906020019060200280838360005b8381101561354f578082015181840152602081019050613534565b5050505090500160405250505060018151811061356857fe5b6020026020010151975061357c8a83612dff565b98505050505050505094509492505050565b60008060008061359c611c32565b93506135a88787611a37565b809350819450505060008473ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156135f857600080fd5b505afa15801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663e6a4390585856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156136e357600080fd5b505afa1580156136f7573d6000803e3d6000fd5b505050506040513d602081101561370d57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156137c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f706169722d6e6f742d666f756e642e000000000000000000000000000000000081525060200191505060405180910390fd5b60008190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff87146137f557866138ae565b8073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561387257600080fd5b505afa158015613886573d6000803e3d6000fd5b505050506040513d602081101561389c57600080fd5b81019080805190602001909291905050505b92508073ffffffffffffffffffffffffffffffffffffffff1663095ea7b387856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561393757600080fd5b505af115801561394b573d6000803e3d6000fd5b50505050505093509350935093565b600061399c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a36565b905092915050565b60006107ca613a266139c16107cd86612e4390919063ffffffff16565b613a18613a13613a046139e0623cda298a612e4390919063ffffffff16565b6139f6623cda208a612e4390919063ffffffff16565b612ec990919063ffffffff16565b88612e4390919063ffffffff16565b613af6565b61395a90919063ffffffff16565b81613a2d57fe5b04905092915050565b6000838311158290613ae3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aa8578082015181840152602081019050613a8d565b50505050905090810190601f168015613ad55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080821415613b095760009050613c6e565b60008290506000600190507001000000000000000000000000000000008210613b3b57608082901c9150604081901b90505b680100000000000000008210613b5a57604082901c9150602081901b90505b6401000000008210613b7557602082901c9150601081901b90505b620100008210613b8e57601082901c9150600881901b90505b6101008210613ba657600882901c9150600481901b90505b60108210613bbd57600482901c9150600281901b90505b60088210613bcd57600181901b90505b6001818581613bd857fe5b048201901c90506001818581613bea57fe5b048201901c90506001818581613bfc57fe5b048201901c90506001818581613c0e57fe5b048201901c90506001818581613c2057fe5b048201901c90506001818581613c3257fe5b048201901c90506001818581613c4457fe5b048201901c90506000818581613c5657fe5b049050808210613c665780613c68565b815b93505050505b91905056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220431c1c456e00b34f5c9def14904897c77af3467afbf6d57643ca29f8ba35317b64736f6c63430006000033

Deployed Bytecode Sourcemap

31591:93:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31643:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31643:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31643:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23734:1011;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;23734:1011:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30145:1437;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;30145:1437:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28342:1279;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;28342:1279:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25249:818;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;25249:818:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26647:726;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;26647:726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;26647:726:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26647:726:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26647:726:0;;;;;;;;;;;;:::i;:::-;;2076:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2076:98:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31643:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23734:1011::-;23985:17;24005:31;24013:6;24021:14;24005:7;:31::i;:::-;23985:51;;24047:17;24067:31;24075:6;24083:14;24067:7;:31::i;:::-;24047:51;;24112:10;24124;24136:12;24152:335;24212:6;24265;24318:12;24377;24436:8;24152:13;:335::i;:::-;24111:376;;;;;;24498:23;24506:5;24513:7;24498;:23::i;:::-;24594:6;24539:196;;24573:6;24539:196;;;24615:5;24635;24655:7;24677:6;24698;24719:5;24539:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23734:1011;;;;;;;;;;;;;:::o;30145:1437::-;30335:13;30351:23;30359:5;30366:7;30351;:23::i;:::-;30335:39;;30386:23;30411:24;30439:35;30456:7;30465:8;30439:16;:35::i;:::-;30385:89;;;;30485:22;30510:47;30527:8;30546:9;30510:8;:47::i;:::-;30485:72;;30591:2;30574:8;:20;30570:149;;;30634:12;:10;:12::i;:::-;30622:24;;:8;:24;;;:85;;30673:9;:19;;;30701:4;30673:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30673:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30673:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30673:34:0;;;;;;;;;;;;;;;;30622:85;;;30649:21;30622:85;30611:96;;30570:149;30731:17;30751:108;30766:8;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30766:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30766:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30766:19:0;;;;;;;;;;;;;;;;30800:58;30805:7;30814:43;30826:9;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30826:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30826:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30826:20:0;;;;;;;;;;;;;;;;30848:8;30814:11;:43::i;:::-;30800:4;:58::i;:::-;30751:14;:108::i;:::-;30731:128;;30872:25;30919:16;:14;:16::i;:::-;30872:64;;30949:24;30959:6;30967:5;30949:9;:24::i;:::-;30984:17;31004:42;31022:6;31030:5;31037:8;31004:17;:42::i;:::-;30984:62;;31081:12;31065;:28;;31057:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31128:37;31145:9;31156:8;31128:16;:37::i;:::-;31176:9;:17;;;31202:6;31211:8;31176:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31176:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31176:44:0;;;;31233:12;31248:6;:31;;;31294:8;31317:12;31344:5;31372:4;31398:1;31392:3;:7;31248:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31248:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31248:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31248:162:0;;;;;;39:16:-1;36:1;17:17;2:54;31248:162:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31248:162:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;31248:162:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;31248:162:0;;;;;;;;;;;31411:1;31248:165;;;;;;;;;;;;;;31233:180;;31426:35;31443:8;31453:7;31426:16;:35::i;:::-;31474:23;31482:5;31489:7;31474;:23::i;:::-;31532:8;31515:59;;31523:7;31515:59;;;31542:7;31551:8;31561:5;31568;31515:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30145:1437;;;;;;;;;;;;;;:::o;28342:1279::-;28530:12;28545:22;28553:5;28560:6;28545:7;:22::i;:::-;28530:37;;28579:23;28604:24;28632:35;28649:7;28658:8;28632:16;:35::i;:::-;28578:89;;;;28678:22;28703:47;28720:8;28739:9;28703:8;:47::i;:::-;28678:72;;28763:17;28783:107;28798:9;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28798:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28798:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28798:20:0;;;;;;;;;;;;;;;;28833:56;28838:7;28847:41;28859:8;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28859:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28859:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28859:19:0;;;;;;;;;;;;;;;;28880:7;28847:11;:41::i;:::-;28833:4;:56::i;:::-;28783:14;:107::i;:::-;28763:127;;28903:25;28950:16;:14;:16::i;:::-;28903:64;;28980:24;28990:6;28998:5;28980:9;:24::i;:::-;29015:17;29035:42;29054:6;29062:5;29069:7;29035:18;:42::i;:::-;29015:62;;29112:12;29096;:28;;29088:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29159:41;29176:9;29187:12;29159:16;:41::i;:::-;29211:9;:17;;;29237:6;29246:12;29211:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29211:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29211:48:0;;;;29272:13;29288:6;:31;;;29334:7;29356:12;29383:5;29411:4;29437:1;29431:3;:7;29288:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29288:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29288:161:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29288:161:0;;;;;;39:16:-1;36:1;17:17;2:54;29288:161:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29288:161:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;29288:161:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29288:161:0;;;;;;;;;;;29450:1;29288:164;;;;;;;;;;;;;;29272:180;;29465:35;29482:8;29492:7;29465:16;:35::i;:::-;29513:24;29521:5;29528:8;29513:7;:24::i;:::-;29571:8;29555:58;;29562:7;29555:58;;;29581:7;29590:8;29600:5;29607;29555:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28342:1279;;;;;;;;;;;;;;:::o;25249:818::-;25450:9;25462:23;25470:5;25477:7;25462;:23::i;:::-;25450:35;;25499:10;25511;25523:12;25539:278;25605:6;25658;25711:4;25762:12;25539:19;:278::i;:::-;25498:319;;;;;;25828:23;25836:5;25843:7;25828;:23::i;:::-;25924:6;25869:190;;25903:6;25869:190;;;25945:5;25965;25985:7;26007:5;26027:1;26043:5;25869:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25249:818;;;;;;;;;;:::o;26647:726::-;26874:9;26886:22;26894:5;26901:6;26886:7;:22::i;:::-;26874:34;;26922:10;26934;26946:12;26962:134;26993:6;27014;27035:4;27054:8;27077;26962:16;:134::i;:::-;26921:175;;;;;;27109:25;27117:6;;27124:1;27117:9;;;;;;;;;;;;;27128:5;27109:7;:25::i;:::-;27145;27153:6;;27160:1;27153:9;;;;;;;;;;;;;27164:5;27145:7;:25::i;:::-;27245:6;27189:176;;27224:6;27189:176;;;27266:5;27286;27306:7;27328:5;27348:6;;27189:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;27189:176:0;;;;;;;;;;;;;;;;;;26647:726;;;;;;;;;;;;:::o;2076:98::-;2119:10;2131:7;2162:1;2165:2;2147:21;;;;;;;;;;;;;;2076:98;;:::o;1391:164::-;1448:14;1492:1;1483:5;:10;:66;;1518:15;:13;:15::i;:::-;1502:40;;;1543:5;1502:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1502:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1502:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1502:47:0;;;;;;;;;;;;;;;;1483:66;;;1496:3;1483:66;1471:78;;1391:164;;;;:::o;16765:1388::-;16947:10;16959;16971:15;16999:25;17046:16;:14;:16::i;:::-;16999:64;;17075:22;17099;17125:32;17142:6;17150;17125:16;:32::i;:::-;17074:83;;;;17170:41;17187:7;17196:14;17170:16;:41::i;:::-;17222;17239:7;17248:14;17222:16;:41::i;:::-;17274:7;:15;;;17298:6;17307:1;17274:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17274:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17274:35:0;;;;17320:7;:15;;;17344:6;17353:14;17320:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17320:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17320:48:0;;;;17381:7;:15;;;17405:6;17414:1;17381:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17381:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17381:35:0;;;;17427:7;:15;;;17451:6;17460:14;17427:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17427:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17427:48:0;;;;17487:12;17502:40;17507:18;7524:8;17516;17507:3;:18::i;:::-;17527:14;17502:4;:40::i;:::-;17487:55;;17553:12;17568:40;17573:18;7524:8;17582;17573:3;:18::i;:::-;17593:14;17568:4;:40::i;:::-;17553:55;;17649:6;:19;;;17691:7;17722;17745:14;17774;17803:7;17825;17855:4;17881:1;17875:3;:7;17649:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17649:244:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17649:244:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17649:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17620:273;;;;;;;;;;;;17918:14;17910:5;:22;17906:114;;;17949:59;17966:7;17975;:17;;;18001:4;17975:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17975:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17975:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17975:32:0;;;;;;;;;;;;;;;;17949:16;:59::i;:::-;17906:114;18044:14;18036:5;:22;18032:114;;;18075:59;18092:7;18101;:17;;;18127:4;18101:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18101:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18101:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18101:32:0;;;;;;;;;;;;;;;;18075:16;:59::i;:::-;18032:114;16765:1388;;;;;;;;;;;;;;:::o;1624:137::-;1700:1;1691:5;:10;1687:68;;1719:15;:13;:15::i;:::-;1703:40;;;1744:5;1751:3;1703:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1703:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1703:52:0;;;;1687:68;1624:137;;:::o;14044:316::-;14119:19;14140:20;14186:12;:10;:12::i;:::-;14179:19;;:3;:19;;;:76;;14251:3;14179:76;;;14216:16;:14;:16::i;:::-;14179:76;14172:83;;14282:12;:10;:12::i;:::-;14274:20;;:4;:20;;;:78;;14347:4;14274:78;;;14312:16;:14;:16::i;:::-;14274:78;14266:86;;14044:316;;;;;:::o;15663:244::-;15763:22;15820:1;15806:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;15806:16:0;;;;15798:24;;15852:8;15833:5;15839:1;15833:8;;;;;;;;;;;;;:28;;;;;;;;;;;15891:7;15872:5;15878:1;15872:8;;;;;;;;;;;;;:27;;;;;;;;;;;15663:244;;;;:::o;785:131::-;830:7;853:42;846:49;;785:131;:::o;13699:135::-;13768:11;13798:28;13802:4;13820;13815:2;:9;13808:2;:17;13798:3;:28::i;:::-;13792:34;;13699:135;;;;:::o;7984:125::-;8037:6;7524:8;8056:41;8069:18;8082:1;8085;8069:12;:18::i;:::-;8095:1;7524:8;8089:7;;;;;;8056:12;:41::i;:::-;:47;;;;;;8052:51;;7984:125;;;;:::o;13555:136::-;13627:11;13677:4;13672:2;:9;13665:2;:17;13658:4;:24;;;;;;13651:32;;13555:136;;;;:::o;13421:126::-;13470:7;13497:42;13490:49;;13421:126;:::o;15388:267::-;15508:12;15541:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15541:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15541:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15541:16:0;;;;;;;;;;;;;;;;15523:43;;;15567:5;15573:1;15567:8;;;;;;;;;;;;;;15577:5;15583:1;15577:8;;;;;;;;;;;;;;15523:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15523:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15523:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15523:63:0;;;;;;;;;;;;;;;;15508:78;;15621:1;15605:18;;:4;:18;;;;15597:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15388:267;;;:::o;14770:301::-;14918:11;14942:18;14963:6;:20;;;14998:7;15020:5;14963:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14963:73:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14963:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14963:73:0;;;;;;39:16:-1;36:1;17:17;2:54;14963:73:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14963:73:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;14963:73:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14963:73:0;;;;;;;;;;;14942:94;;15056:4;15061:1;15056:7;;;;;;;;;;;;;;15047:16;;14770:301;;;;;;:::o;14368:157::-;14470:16;:14;:16::i;:::-;14452:34;;14460:5;14452:34;;;14449:68;;;14488:5;:13;;;14508:6;14488:29;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14488:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14488:29:0;;;;;14449:68;14368:157;;:::o;14533:229::-;14634:16;:14;:16::i;:::-;14616:34;;14624:5;14616:34;;;14613:142;;;14667:5;:13;;;14681:16;:14;:16::i;:::-;14699:6;14667:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14667:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14667:39:0;;;;14721:5;:14;;;14736:6;14721:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14721:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14721:22:0;;;;14613:142;14533:229;;:::o;15079:301::-;15227:12;15252:18;15273:6;:19;;;15307:6;15328:5;15273:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15273:71:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15273:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15273:71:0;;;;;;39:16:-1;36:1;17:17;2:54;15273:71:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15273:71:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;15273:71:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15273:71:0;;;;;;;;;;;15252:92;;15365:4;15370:1;15365:7;;;;;;;;;;;;;;15355:17;;15079:301;;;;;;:::o;18161:1595::-;18316:10;18328;18340:15;18368:25;18415:16;:14;:16::i;:::-;18368:64;;18444:22;18468;18494:32;18511:6;18519;18494:16;:32::i;:::-;18443:83;;;;18547:16;18566:7;18547:26;;18614:2;18598:7;:19;18594:144;;;18655:12;:10;:12::i;:::-;18645:22;;:6;:22;;;:81;;18694:7;:17;;;18720:4;18694:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18694:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18694:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18694:32:0;;;;;;;;;;;;;;;;18645:81;;;18670:21;18645:81;18634:92;;18594:144;18750:35;18767:7;18776:8;18750:16;:35::i;:::-;18800:16;18860:52;18877:6;18885:7;18894;18903:8;18860:16;:52::i;:::-;18838:74;;;;;;;;18925:7;:15;;;18949:6;18958:1;18925:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18925:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18925:35:0;;;;18971:7;:15;;;18995:6;19004:8;18971:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18971:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18971:42:0;;;;19026:7;:15;;;19050:6;19059:1;19026:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19026:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19026:35:0;;;;19072:7;:15;;;19096:6;19105:8;19072:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19072:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19072:42:0;;;;19155:6;:19;;;19197:7;19228;19251:8;19274;19297:1;19345;19401:4;19427:1;19421:3;:7;19155:284;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19155:284:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19155:284:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19155:284:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19126:313;;;;;;;;;;;;19474:12;19460:10;:26;;19452:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19536:5;19525:8;:16;19521:108;;;19558:59;19575:7;19584;:17;;;19610:4;19584:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19584:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19584:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19584:32:0;;;;;;;;;;;;;;;;19558:16;:59::i;:::-;19521:108;19656:5;19645:8;:16;19641:108;;;19678:59;19695:7;19704;:17;;;19730:4;19704:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19704:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19704:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19704:32:0;;;;;;;;;;;;;;;;19678:16;:59::i;:::-;19641:108;18161:1595;;;;;;;;;;;;;:::o;20867:978::-;21036:10;21048;21060:12;21085:25;21121:22;21154;21225:95;21263:6;21284;21305:4;21225:23;:95::i;:::-;21187:133;;;;;;;;;;;;;;;;21342:12;21357:59;21372:7;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21372:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21372:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21372:18:0;;;;;;;;;;;;;;;;21392:23;21397:8;21407:7;21392:4;:23::i;:::-;21357:14;:59::i;:::-;21342:74;;21427:12;21442:59;21457:7;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21457:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21457:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21457:18:0;;;;;;;;;;;;;;;;21477:23;21482:8;21492:7;21477:4;:23::i;:::-;21442:14;:59::i;:::-;21427:74;;21529:6;:22;;;21574:7;21605;21628;21650;21672;21702:4;21728:1;21722:3;:7;21529:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21529:211:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21529:211:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21529:211:0;;;;;;;;;;;;;;;;;;;;;;;;;21512:228;;;;;;;;20867:978;;21762:32;21779:7;21788:5;21762:16;:32::i;:::-;21805;21822:7;21831:5;21805:16;:32::i;:::-;20867:978;;;;;;;;;;;;:::o;978:142::-;1026:7;1049:42;1042:49;;978:142;:::o;7673:103::-;7733:6;7752:18;7765:1;7768;7752:12;:18::i;:::-;7748:22;;7673:103;;;;:::o;13138:209::-;13187:7;13214:42;13207:49;;13138:209;:::o;7782:95::-;7834:6;7853:18;7866:1;7869;7853:12;:18::i;:::-;7849:22;;7782:95;;;;:::o;4377:471::-;4435:7;4685:1;4680;:6;4676:47;;;4710:1;4703:8;;;;4676:47;4735:9;4751:1;4747;:5;4735:17;;4780:1;4775;4771;:5;;;;;;:10;4763:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4839:1;4832:8;;;4377:471;;;;;:::o;3023:181::-;3081:7;3101:9;3117:1;3113;:5;3101:17;;3142:1;3137;:6;;3129:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3195:1;3188:8;;;3023:181;;;;:::o;19764:1095::-;19938:15;19955;19982:25;20028:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20028:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20028:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20028:16:0;;;;;;;;;;;;;;;;19982:63;;20056:22;20096:7;:15;;;20120:6;20137;20096:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20096:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20096:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20096:49:0;;;;;;;;;;;;;;;;20056:90;;20193:1;20165:30;;20173:7;20165:30;;;;20157:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20241:16;20259;20281:7;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20281:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20281:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20281:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20240:62;;;;;;;;;20313:17;20361:6;20333:35;;:7;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20333:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20333:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20333:16:0;;;;;;;;;;;;;;;;:35;;;:57;;20382:8;20333:57;;;20371:8;20333:57;20313:77;;20401:16;20420:42;20442:9;20453:8;20420:21;:42::i;:::-;20401:61;;20475:22;20500:42;20517:6;20534;20500:8;:42::i;:::-;20475:67;;20555:6;:14;;;20578:6;20587:8;20555:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20555:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20555:41:0;;;;20619:6;:31;;;20665:8;20688:1;20736:5;20764:4;20790:1;20784:3;:7;20619:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20619:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20619:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20619:183:0;;;;;;39:16:-1;36:1;17:17;2:54;20619:183:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;20619:183:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;385:12;380:3;373:25;421:4;416:3;412:14;405:21;;0:433;;20619:183:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;20619:183:0;;;;;;;;;;;20803:1;20619:186;;;;;;;;;;;;;;20609:196;;20828:23;20832:8;20842;20828:3;:23::i;:::-;20818:33;;19764:1095;;;;;;;;;;;;;;:::o;21853:723::-;21981:25;22008:22;22032;22056:12;22109:16;:14;:16::i;:::-;22081:45;;22158:32;22175:6;22183;22158:16;:32::i;:::-;22137:53;;;;;;;;22201:20;22242:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22242:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22242:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22242:16:0;;;;;;;;;;;;;;;;22224:43;;;22276:7;22294;22224:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22224:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22224:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22224:79:0;;;;;;;;;;;;;;;;22201:102;;22346:1;22322:26;;:12;:26;;;;22314:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22381:23;22422:12;22381:54;;22469:2;22456:4;:16;:59;;22511:4;22456:59;;;22475:8;:18;;;22502:4;22475:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22475:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22475:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22475:33:0;;;;;;;;;;;;;;;;22456:59;22446:69;;22526:8;:16;;;22551:6;22560:7;22526:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22526:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22526:42:0;;;;21853:723;;;;;;;;;:::o;3487:136::-;3545:7;3572:43;3576:1;3579;3572:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3565:50;;3487:136;;;;:::o;16320:387::-;16436:7;16695:4;16482:210;16672:19;16686:4;16672:9;:13;;:19;;;;:::i;:::-;16482:185;16538:110;16578:47;16602:22;16616:7;16602:9;:13;;:22;;;;:::i;:::-;16578:19;16589:7;16578:6;:10;;:19;;;;:::i;:::-;:23;;:47;;;;:::i;:::-;16538:9;:13;;:110;;;;:::i;:::-;16482:33;:185::i;:::-;:189;;:210;;;;:::i;:::-;:217;;;;;;16462:237;;16320:387;;;;:::o;3926:192::-;4012:7;4045:1;4040;:6;;4048:12;4032:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4032:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4072:9;4088:1;4084;:5;4072:17;;4109:1;4102:8;;;3926:192;;;;;:::o;8850:1239::-;8898:7;8927:1;8922;:6;8918:20;;;8937:1;8930:8;;;;8918:20;9103:10;9116:1;9103:14;;9128:9;9140:1;9128:13;;9162:35;9156:2;:41;9152:107;;9221:3;9214:10;;;;;9245:2;9239:8;;;;;9152:107;9279:19;9273:2;:25;9269:90;;9322:2;9315:9;;;;;9345:2;9339:8;;;;;9269:90;9379:11;9373:2;:17;9369:82;;9414:2;9407:9;;;;;9437:2;9431:8;;;;;9369:82;9471:7;9465:2;:13;9461:77;;9502:2;9495:9;;;;;9525:1;9519:7;;;;;9461:77;9558:5;9552:2;:11;9548:74;;9587:1;9580:8;;;;;9609:1;9603:7;;;;;9548:74;9642:4;9636:2;:10;9632:73;;9670:1;9663:8;;;;;9692:1;9686:7;;;;;9632:73;9725:3;9719:2;:9;9715:49;;9751:1;9745:7;;;;;9715:49;9793:1;9787;9783;:5;;;;;;9779:1;:9;9778:16;;9774:20;;9824:1;9818;9814;:5;;;;;;9810:1;:9;9809:16;;9805:20;;9855:1;9849;9845;:5;;;;;;9841:1;:9;9840:16;;9836:20;;9886:1;9880;9876;:5;;;;;;9872:1;:9;9871:16;;9867:20;;9917:1;9911;9907;:5;;;;;;9903:1;:9;9902:16;;9898:20;;9948:1;9942;9938;:5;;;;;;9934:1;:9;9933:16;;9929:20;;9979:1;9973;9969;:5;;;;;;9965:1;:9;9964:16;;9960:20;;10028:10;10045:1;10041;:5;;;;;;10028:18;;10069:2;10065:1;:6;:15;;10078:2;10065:15;;;10074:1;10065:15;10057:24;;;;;8850:1239;;;;:::o

Swarm Source

ipfs://431c1c456e00b34f5c9def14904897c77af3467afbf6d57643ca29f8ba35317b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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