Contract 0xb9799De71100e20aC1cdbCc63C69ddA2D0D81710 1

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7bb69844af8dcfa00c0702b033533b95acba549c50bf3d5c1debf093b9b7ce56Swap Exact Token...552134612023-02-06 19:00:072 hrs 53 mins ago0x631b82ddf9032dbd63ee4383b7c98a917415b08b IN  fBOMB Finance: Bomb Swap Router0 FTM0.011675174907
0xfa633ce30a699087bded1c02e1adae080cb7ae6f0bfc441d39f0766921e69ba1Swap Exact ETH F...552115602023-02-06 18:23:183 hrs 30 mins ago0x82a4b6e0b9931c17aa73c509a5dd4ee45104bce7 IN  fBOMB Finance: Bomb Swap Router350.134196991054392 FTM0.011401153412
0xd9a9cb5b2b67177ab940f122bfdc5b280c1f423137acfc91fd6822d52c570769Swap ETH For Exa...552113172023-02-06 18:17:203 hrs 36 mins ago0x631b82ddf9032dbd63ee4383b7c98a917415b08b IN  fBOMB Finance: Bomb Swap Router10.296496001259873 FTM0.012329337717
0x5b72ff5be39831e03b14073c0053250e6b48491ef466c228349d998e57b68e81Swap Exact ETH F...552105952023-02-06 18:02:123 hrs 51 mins ago0x631b82ddf9032dbd63ee4383b7c98a917415b08b IN  fBOMB Finance: Bomb Swap Router44 FTM0.013737443536
0x9087cde53dc76ef11ca6f81db108e2a4b950fac84c1be776fe937ca79cc7f927Add Liquidity ET...552089392023-02-06 17:28:464 hrs 25 mins ago0x434c6d609ca409c4301338d43a36710b874f192e IN  fBOMB Finance: Bomb Swap Router6.006553695290306 FTM0.020424483657
0x4cadbcef64b279c09f5c361c2248879aad39b5ecd2b6046306883f740230b859Swap Exact ETH F...552088992023-02-06 17:27:504 hrs 26 mins ago0x434c6d609ca409c4301338d43a36710b874f192e IN  fBOMB Finance: Bomb Swap Router6 FTM0.015171410745
0x3223a51620ec3fd94b9c4b48f810b9450ff36ba5835cc3f2f44a4dc98db53b51Swap Exact Token...552084912023-02-06 17:19:434 hrs 34 mins ago0xbacd5ba9511981c68641dd342a4a915ce3705b66 IN  fBOMB Finance: Bomb Swap Router0 FTM0.021963065173
0xa89f4e7e228361c4c17afbd7763d38e4f06da36bff60caf5c29b4e6da450f7b4Swap Exact Token...552084372023-02-06 17:18:484 hrs 35 mins ago0x7c29906676deec1b4f1a74acc1673b725ef45a87 IN  fBOMB Finance: Bomb Swap Router0 FTM0.015132505698
0xf46e33f3e484135c95baefd689c860fc8059216e67688e4612c4a2bf281ced63Swap Exact ETH F...552067182023-02-06 16:45:115 hrs 8 mins ago0xc6157e96d4cf27ac7d7a0dcbeb8aaf4f8aef380e IN  fBOMB Finance: Bomb Swap Router280.742412164064747 FTM0.018759832354
0x0a313fe011946aa7f758c60a035691dde71933e9062a35032da9630b3f876f66Swap Exact Token...552049452023-02-06 16:11:565 hrs 42 mins ago0x387a2fecf55acab96593c8ac1577e238d225e41a IN  fBOMB Finance: Bomb Swap Router0 FTM0.012537528019
0x914a572eabeff25fd112ae6d220250dc3b18baf4692cd60c5d0e29147ad60aa1Remove Liquidity...552048892023-02-06 16:10:445 hrs 43 mins ago0x387a2fecf55acab96593c8ac1577e238d225e41a IN  fBOMB Finance: Bomb Swap Router0 FTM0.017636302867
0x38e6ef42555a84775731dbbbd56c055bfec1c553966cf8ca2fae7b92ec059e30Remove Liquidity...552048612023-02-06 16:10:195 hrs 43 mins ago0x387a2fecf55acab96593c8ac1577e238d225e41a IN  fBOMB Finance: Bomb Swap Router0 FTM0.024744297206
0x4461ca1b3015e62b7c6df9e35f7c534c97c68625680b17a7200e337b95fd11c5Swap Exact ETH F...552016802023-02-06 15:00:106 hrs 53 mins ago0xd9fb3c9e4e4b2bfa4e97e8816cdff8d7caaac851 IN  fBOMB Finance: Bomb Swap Router890 FTM0.006937613568
0xdca61151be7d92dd7d5a557154a48f520fbf8578584a4887b10f724e956a156bSwap Exact ETH F...552015692023-02-06 14:58:026 hrs 55 mins ago0xd9fb3c9e4e4b2bfa4e97e8816cdff8d7caaac851 IN  fBOMB Finance: Bomb Swap Router1,000 FTM0.006963279671
0x153e512efa17f54367f3108cc25715fea99079e8eef2f08699bf021cba1d7e87Swap Exact ETH F...552014312023-02-06 14:55:116 hrs 58 mins ago0xd9fb3c9e4e4b2bfa4e97e8816cdff8d7caaac851 IN  fBOMB Finance: Bomb Swap Router1,000 FTM0.006963279671
0x3fac593cac80827168f696cabfc9f0d244c758a42fa1cdc89040a11a81992daaSwap Exact ETH F...552014132023-02-06 14:54:426 hrs 59 mins ago0xd9fb3c9e4e4b2bfa4e97e8816cdff8d7caaac851 IN  fBOMB Finance: Bomb Swap Router50 FTM0.007943502609
0xbb2e74b1c014c909565045c3b976043d40dcd48a545c8c04a8a45e525d6c84baAdd Liquidity ET...551953042023-02-06 12:42:239 hrs 11 mins ago0xc6fda9f22bcf28434773c7bb754a932a53fba9ce IN  fBOMB Finance: Bomb Swap Router15 FTM0.007982310851
0xd308a1c8f265009714b8305d5270f5cf85582ec25a8dc0cd905838bb0ed28b07Add Liquidity ET...551890322023-02-06 10:05:0911 hrs 48 mins ago0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad IN  fBOMB Finance: Bomb Swap Router24.821697572570187 FTM0.005733463378
0x39f28f11bcf20463387b16c1273c2964ed3c999650968b67a68c88557d826477Swap Exact ETH F...551889682023-02-06 10:03:4111 hrs 50 mins ago0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad IN  fBOMB Finance: Bomb Swap Router25 FTM0.006281386194
0x8aa124ae9fe3f1bd7f43fc0e0a46de7f55f3e5cb4140ea00c118fd899bd9ddbdAdd Liquidity ET...551879022023-02-06 9:35:2912 hrs 18 mins ago0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad IN  fBOMB Finance: Bomb Swap Router30 FTM0.005849741292
0x00b9966fea147d7ec37b7d5ea6ed1c4400c11b0396f313348af6443d831659deSwap Exact Token...551878692023-02-06 9:34:2912 hrs 19 mins ago0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad IN  fBOMB Finance: Bomb Swap Router0 FTM0.01851326569
0x5f89906b0b7b15518e8537c246efb1351475b493b92269fd329924cd93083cabSwap Exact Token...551877842023-02-06 9:31:5312 hrs 22 mins ago0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad IN  fBOMB Finance: Bomb Swap Router0 FTM0.006819274387
0x0301f1a1a93e1140dc9d23056933bc957e44df23e8f1e7f1d78a5696b7b9ef09Swap Exact ETH F...551748902023-02-06 1:31:5220 hrs 22 mins ago0x7737d3742ddc67f1443b40cbe6d401d649d3906a IN  fBOMB Finance: Bomb Swap Router791.250135439228702 FTM0.007353753475
0x9ce9d2651dad3be032311e5aae9decf732983ccad801d38c472e81db104b0376Swap Exact ETH F...551711192023-02-05 23:35:0822 hrs 18 mins ago0xc6157e96d4cf27ac7d7a0dcbeb8aaf4f8aef380e IN  fBOMB Finance: Bomb Swap Router0.4 FTM0.012837598592
0x65cff1ea596d08ba4c6128f3716b4d576d61dc0976b8f27c30854bb3dfc3f63eSwap Exact ETH F...551709532023-02-05 23:32:3322 hrs 21 mins ago0xc6157e96d4cf27ac7d7a0dcbeb8aaf4f8aef380e IN  fBOMB Finance: Bomb Swap Router0.4 FTM0.017697097196
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7bb69844af8dcfa00c0702b033533b95acba549c50bf3d5c1debf093b9b7ce56552134612023-02-06 19:00:072 hrs 53 mins ago fBOMB Finance: Bomb Swap Router0x631b82ddf9032dbd63ee4383b7c98a917415b08b53.624919954492168416 FTM
0x7bb69844af8dcfa00c0702b033533b95acba549c50bf3d5c1debf093b9b7ce56552134612023-02-06 19:00:072 hrs 53 mins ago Fantom Finance: Wrapped Fantom Token fBOMB Finance: Bomb Swap Router53.624919954492168416 FTM
0xfa633ce30a699087bded1c02e1adae080cb7ae6f0bfc441d39f0766921e69ba1552115602023-02-06 18:23:183 hrs 30 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token350.134196991054392798 FTM
0xd9a9cb5b2b67177ab940f122bfdc5b280c1f423137acfc91fd6822d52c570769552113172023-02-06 18:17:203 hrs 36 mins ago fBOMB Finance: Bomb Swap Router0x631b82ddf9032dbd63ee4383b7c98a917415b08b0.490309333393327313 FTM
0xd9a9cb5b2b67177ab940f122bfdc5b280c1f423137acfc91fd6822d52c570769552113172023-02-06 18:17:203 hrs 36 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token9.806186667866546271 FTM
0x5b72ff5be39831e03b14073c0053250e6b48491ef466c228349d998e57b68e81552105952023-02-06 18:02:123 hrs 51 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token44 FTM
0x9087cde53dc76ef11ca6f81db108e2a4b950fac84c1be776fe937ca79cc7f927552089392023-02-06 17:28:464 hrs 25 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token6.006553695290306689 FTM
0x4cadbcef64b279c09f5c361c2248879aad39b5ecd2b6046306883f740230b859552088992023-02-06 17:27:504 hrs 26 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token6 FTM
0xf46e33f3e484135c95baefd689c860fc8059216e67688e4612c4a2bf281ced63552067182023-02-06 16:45:115 hrs 8 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token280.742412164064747495 FTM
0x0a313fe011946aa7f758c60a035691dde71933e9062a35032da9630b3f876f66552049452023-02-06 16:11:565 hrs 42 mins ago fBOMB Finance: Bomb Swap Router0x387a2fecf55acab96593c8ac1577e238d225e41a481.426832105507031799 FTM
0x0a313fe011946aa7f758c60a035691dde71933e9062a35032da9630b3f876f66552049452023-02-06 16:11:565 hrs 42 mins ago Fantom Finance: Wrapped Fantom Token fBOMB Finance: Bomb Swap Router481.426832105507031799 FTM
0x38e6ef42555a84775731dbbbd56c055bfec1c553966cf8ca2fae7b92ec059e30552048612023-02-06 16:10:195 hrs 43 mins ago fBOMB Finance: Bomb Swap Router0x387a2fecf55acab96593c8ac1577e238d225e41a261.848795700064410138 FTM
0x38e6ef42555a84775731dbbbd56c055bfec1c553966cf8ca2fae7b92ec059e30552048612023-02-06 16:10:195 hrs 43 mins ago Fantom Finance: Wrapped Fantom Token fBOMB Finance: Bomb Swap Router261.848795700064410138 FTM
0x4461ca1b3015e62b7c6df9e35f7c534c97c68625680b17a7200e337b95fd11c5552016802023-02-06 15:00:106 hrs 53 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token890 FTM
0xdca61151be7d92dd7d5a557154a48f520fbf8578584a4887b10f724e956a156b552015692023-02-06 14:58:026 hrs 55 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token1,000 FTM
0x153e512efa17f54367f3108cc25715fea99079e8eef2f08699bf021cba1d7e87552014312023-02-06 14:55:116 hrs 58 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token1,000 FTM
0x3fac593cac80827168f696cabfc9f0d244c758a42fa1cdc89040a11a81992daa552014132023-02-06 14:54:426 hrs 59 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token50 FTM
0xbb2e74b1c014c909565045c3b976043d40dcd48a545c8c04a8a45e525d6c84ba551953042023-02-06 12:42:239 hrs 11 mins ago fBOMB Finance: Bomb Swap Router0xc6fda9f22bcf28434773c7bb754a932a53fba9ce0.003306956166928635 FTM
0xbb2e74b1c014c909565045c3b976043d40dcd48a545c8c04a8a45e525d6c84ba551953042023-02-06 12:42:239 hrs 11 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token14.996693043833071365 FTM
0xd308a1c8f265009714b8305d5270f5cf85582ec25a8dc0cd905838bb0ed28b07551890322023-02-06 10:05:0911 hrs 48 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token24.821697572570187029 FTM
0x39f28f11bcf20463387b16c1273c2964ed3c999650968b67a68c88557d826477551889682023-02-06 10:03:4111 hrs 50 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token25 FTM
0x8aa124ae9fe3f1bd7f43fc0e0a46de7f55f3e5cb4140ea00c118fd899bd9ddbd551879022023-02-06 9:35:2912 hrs 18 mins ago fBOMB Finance: Bomb Swap Router0x0d7bb20d1893dfd0319b3f2b479c1f3bb0e24bad15 wei
0x8aa124ae9fe3f1bd7f43fc0e0a46de7f55f3e5cb4140ea00c118fd899bd9ddbd551879022023-02-06 9:35:2912 hrs 18 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token29.999999999999999985 FTM
0x0301f1a1a93e1140dc9d23056933bc957e44df23e8f1e7f1d78a5696b7b9ef09551748902023-02-06 1:31:5220 hrs 22 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token791.250135439228702661 FTM
0x9ce9d2651dad3be032311e5aae9decf732983ccad801d38c472e81db104b0376551711192023-02-05 23:35:0822 hrs 18 mins ago fBOMB Finance: Bomb Swap Router Fantom Finance: Wrapped Fantom Token0.4 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 11 of 11: UniswapV2Router02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

import './UniswapV2Library.sol';
import './SafeMath.sol';
import './TransferHelper.sol';
import './IUniswapV2Router02.sol';
import './IUniswapV2Factory.sol';
import './IERC20.sol';
import './IWETH.sol';

contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMath for uint; 

    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
        _;
    }

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Uniswap(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return UniswapV2Library.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return UniswapV2Library.getAmountsIn(factory, amountOut, path);
    }
}

File 1 of 11: IERC20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

File 2 of 11: IUniswapV2Factory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

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

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

File 3 of 11: IUniswapV2Pair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 4 of 11: IUniswapV2Router01.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

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

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

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

File 5 of 11: IUniswapV2Router02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 6 of 11: IWETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 7 of 11: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

File 8 of 11: TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

File 9 of 11: UniSafeMath.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathUniswap {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

File 10 of 11: UniswapV2Library.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import './IUniswapV2Pair.sol';

import "./UniSafeMath.sol";

library UniswapV2Library {
    using SafeMathUniswap for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'9476448087fd2925ee480fcc3fa553599e51867ce016b987ecc6345b7da9b029' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9981);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9981);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051620047c0380380620047c08339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61463b620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f365280613fef52806140a2525061463b6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b81526020018061456c602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b81526020018061456c602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144dc6027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b81526020018061456c602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b81526020018061456c602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b81526020018061456c602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cca565b60608142811015611eab576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144dc6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613da2565b60008142811015611fd5576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e48565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b81526004018080602001828103825260268152602001806145236026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806144696026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f26565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f26565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b815260206004820152601860248201526000805160206145e6833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d6024820152600080516020614503833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144dc6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806145496023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806145bb602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b815260040180806020018281038252602881526020018061448f6028913960400191505060405180910390fd5b6000613269856126fd6141b7565b9050600061327782856141b7565b905060006132918361328b886127106141b7565b9061421a565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614269565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e48565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f9476448087fd2925ee480fcc3fa553599e51867ce016b987ecc6345b7da9b029609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806145976024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e48565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cca565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e48565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b600061112083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614330565b6000808411613d0a5760405162461bcd60e51b815260040180806020018281038252602c815260200180614418602c913960400191505060405180910390fd5b600083118015613d1a5750600082115b613d555760405162461bcd60e51b815260040180806020018281038252602881526020018061448f6028913960400191505060405180910390fd5b6000613d6d612710613d6786886141b7565b906141b7565b90506000613d816126fd613d6786896143c7565b9050613d986001828481613d9157fe5b049061421a565b9695505050505050565b6000808411613de25760405162461bcd60e51b81526004018080602001828103825260258152602001806144b76025913960400191505060405180910390fd5b600083118015613df25750600082115b613e2d5760405162461bcd60e51b815260040180806020018281038252602881526020018061448f6028913960400191505060405180910390fd5b82613e3885846141b7565b81613e3f57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613e9c5760405162461bcd60e51b81526004018080602001828103825260258152602001806144446025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613ebc578284613ebf565b83835b90925090506001600160a01b038216613f1f576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fb257600080fd5b505afa158015613fc6573d6000803e3d6000fd5b505050506040513d6020811015613fdc57600080fd5b50516001600160a01b0316141561409a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561406d57600080fd5b505af1158015614081573d6000803e3d6000fd5b505050506040513d602081101561409757600080fd5b50505b6000806140c87f00000000000000000000000000000000000000000000000000000000000000008b8b614269565b915091508160001480156140da575080155b156140ea578793508692506141aa565b60006140f7898484613da2565b905087811161414a578581101561413f5760405162461bcd60e51b81526004018080602001828103825260268152602001806144696026913960400191505060405180910390fd5b8894509250826141a8565b6000614157898486613da2565b90508981111561416357fe5b878110156141a25760405162461bcd60e51b81526004018080602001828103825260268152602001806145236026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141d2575050808202828282816141cf57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142788585613e48565b5090506000806142898888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142c157600080fd5b505afa1580156142d5573d6000803e3d6000fd5b505050506040513d60608110156142eb57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461431e578082614321565b81815b90999098509650505050505050565b600081848411156143bf5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561438457818101518382015260200161436c565b50505050905090810190601f1680156143b15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fdfe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a2646970667358221220a8a5b5d6578f47e8272e002874cb61307fa1ef4d466783fa29a88029a8d01ce064736f6c634300060c0033000000000000000000000000d9473a05b2edf4f614593ba5d1dbd3021d8e0ebe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d9473a05b2edf4f614593ba5d1dbd3021d8e0ebe00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0xd9473a05b2edf4f614593ba5d1dbd3021d8e0ebe
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d9473a05b2edf4f614593ba5d1dbd3021d8e0ebe
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Deployed ByteCode Sourcemap

279:18599:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;762:10;-1:-1:-1;;;;;776:4:10;762:18;;755:26;;;;279:18599;;;;;4912:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4912:673:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17822:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17822:262:10;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12088:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12088:850:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12088:850:10;;;;;;;;;;;;-1:-1:-1;12088:850:10;-1:-1:-1;;;;;;12088:850:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18622:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18622:253:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18622:253:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18622:253:10;;-1:-1:-1;18622:253:10;;-1:-1:-1;;;;;18622:253:10:i;5591:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;5591:677:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9305:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9305:628:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9305:628:10;;;;;;;;;;;;-1:-1:-1;9305:628:10;-1:-1:-1;;;;;;9305:628:10;;;;;;;;:::i;11254:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11254:828:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11254:828:10;;;;;;;;;;;;-1:-1:-1;11254:828:10;-1:-1:-1;;;;;;11254:828:10;;;;;;;;:::i;7735:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7735:718:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15128:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15128:728:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15128:728:10;;;;;;;;;;;;-1:-1:-1;15128:728:10;-1:-1:-1;;;;;;15128:728:10;;;;;;;;:::i;16732:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16732:850:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16732:850:10;;;;;;;;;;;;-1:-1:-1;16732:850:10;-1:-1:-1;;;;;;16732:850:10;;;;;;;;:::i;10551:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10551:697:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10551:697:10;;;;;;;;;;;;-1:-1:-1;10551:697:10;-1:-1:-1;;;;;;10551:697:10;;;;;;;;:::i;18092:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18092:261:10;;;;;;;;;;;;:::i;9939:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9939:606:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9939:606:10;;;;;;;;;;;;-1:-1:-1;9939:606:10;-1:-1:-1;;;;;;9939:606:10;;;;;;;;:::i;416:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;416:38:10;;;;;;;;;;;;;;17626:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17626:188:10;;;;;;;;;;;;:::i;7022:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7022:707:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15862:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15862:864:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15862:864:10;;;;;;;;;;;;-1:-1:-1;15862:864:10;-1:-1:-1;;;;;;15862:864:10;;;;;;;;:::i;4041:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4041:865:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;368:41::-;;;;;;;;;;;;;:::i;18361:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18361:253:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;18361:253:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18361:253:10;;-1:-1:-1;18361:253:10;;-1:-1:-1;;;;;18361:253:10:i;6274:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6274:669:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2280:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2280:738:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;3024:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3024:974:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12944:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12944:810:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12944:810:10;;;;;;;;;;;;-1:-1:-1;12944:810:10;-1:-1:-1;;;;;;12944:810:10;;;;;;;;:::i;4912:673::-;5149:16;5167:14;5130:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;5221:196:::1;5251:5;5271:4;5290:9;5314:14;5343:12;5378:4;5398:8;5221:15;:196::i;:::-;5194:223:::0;;-1:-1:-1;5194:223:10;-1:-1:-1;5428:51:10::1;5456:5:::0;5463:2;5194:223;5428:27:::1;:51::i;:::-;5496:4;-1:-1:-1::0;;;;;5490:20:10::1;;5511:9;5490:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5532:45;5563:2;5567:9;5532:30;:45::i;:::-;4912:673:::0;;;;;;;;;;:::o;17822:262::-;17975:14;18014:62;18044:8;18054:9;18065:10;18014:29;:62::i;:::-;18007:69;17822:262;-1:-1:-1;;;;17822:262:10:o;12088:850::-;12302:21;12274:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;-1:-1:-1;;;;;12374:4:10::1;12349:29;:4:::0;;-1:-1:-1;;12354:15:10;;12349:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;12349:21:10::1;-1:-1:-1::0;;;;;12349:29:10::1;;12341:71;;;::::0;;-1:-1:-1;;;12341:71:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;12341:71:10;;;;;;;;;;;;;::::1;;12433:55;12464:7;12473:8;12483:4;;12433:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12433:30:10::1;::::0;-1:-1:-1;;;12433:55:10:i:1;:::-;12423:65;;12538:12;12507:7;12532:1;12515:7;:14;:18;12507:27;;;;;;;;;;;;;;:43;;12499:99;;;;-1:-1:-1::0;;;12499:99:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12609:141;12655:4;;12660:1;12655:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12655:7:10::1;12664:10;12676:51;12701:7;12710:4;;12715:1;12710:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12710:7:10::1;12719:4;;12724:1;12719:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;12719:7:10::1;12676:24;:51::i;:::-;12729:7;12737:1;12729:10;;;;;;;;;;;;;;12609:31;:141::i;:::-;12761:35;12767:7;12776:4;;12761:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;12790:4:10::1;::::0;-1:-1:-1;12761:5:10::1;::::0;-1:-1:-1;;12761:35:10:i:1;:::-;12813:4;-1:-1:-1::0;;;;;12807:20:10::1;;12828:7;12853:1;12836:7;:14;:18;12828:27;;;;;;;;;;;;;;12807:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12867:63;12898:2;12902:7;12927:1;12910:7;:14;:18;12902:27;;;;;;;;;;;;;;12867:30;:63::i;:::-;12088:850:::0;;;;;;;;;:::o;18622:253::-;18766:21;18812:55;18842:7;18851:9;18862:4;18812:29;:55::i;:::-;18805:62;;18622:253;;;;;:::o;5591:677::-;5897:12;5911;5936;5951:49;5976:7;5985:6;5993;5951:24;:49::i;:::-;5936:64;;6011:10;6024;:33;;6048:9;6024:33;;;-1:-1:-1;;6024:33:10;6068:80;;;-1:-1:-1;;;6068:80:10;;6096:10;6068:80;;;;6116:4;6068:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6011:46;;-1:-1:-1;;;;;;6068:27:10;;;;;:80;;;;;-1:-1:-1;;6068:80:10;;;;;;;;-1:-1:-1;6068:27:10;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6180;6196:6;6204;6212:9;6223:10;6235;6247:2;6251:8;6180:15;:80::i;:::-;6159:101;;;;;;;;5591:677;;;;;;;;;;;;;;;;:::o;9305:628::-;9529:21;9510:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;9573:55:::1;9604:7;9613:8;9623:4;;9573:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9573:30:10::1;::::0;-1:-1:-1;;;9573:55:10:i:1;:::-;9563:65;;9678:12;9647:7;9672:1;9655:7;:14;:18;9647:27;;;;;;;;;;;;;;:43;;9639:99;;;;-1:-1:-1::0;;;9639:99:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9749:141;9795:4;;9800:1;9795:7;;;;;;9749:141;9901:24;9907:7;9916:4;;9901:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;9922:2:10;;-1:-1:-1;9901:5:10::1;::::0;-1:-1:-1;;9901:24:10:i:1;11254:828::-:0;11468:21;11440:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;-1:-1:-1;;;;;11540:4:10::1;11515:29;:4:::0;;-1:-1:-1;;11520:15:10;;11515:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;11515:21:10::1;-1:-1:-1::0;;;;;11515:29:10::1;;11507:71;;;::::0;;-1:-1:-1;;;11507:71:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11507:71:10;;;;;;;;;;;;;::::1;;11599:55;11629:7;11638:9;11649:4;;11599:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11599:29:10::1;::::0;-1:-1:-1;;;11599:55:10:i:1;:::-;11589:65;;11687:11;11673:7;11681:1;11673:10;;;;;;;;;;;;;;:25;;11665:77;;;;-1:-1:-1::0;;;11665:77:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7735:718:::0;8053:14;8080:12;8095:46;8120:7;8129:5;8136:4;8095:24;:46::i;:::-;8080:61;;8152:10;8165;:33;;8189:9;8165:33;;;-1:-1:-1;;8165:33:10;8209:80;;;-1:-1:-1;;;8209:80:10;;8237:10;8209:80;;;;8257:4;8209:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8152:46;;-1:-1:-1;;;;;;8209:27:10;;;;;:80;;;;;-1:-1:-1;;8209:80:10;;;;;;;;-1:-1:-1;8209:27:10;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8312:133;8374:5;8381:9;8392:14;8408:12;8422:2;8426:8;8312:47;:133::i;:::-;8300:145;7735:718;-1:-1:-1;;;;;;;;;;;;;7735:718:10:o;15128:728::-;15362:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;15383:139:::1;15429:4;;15434:1;15429:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15429:7:10::1;15438:10;15450:51;15475:7;15484:4;;15489:1;15484:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;15484:7:10::1;15493:4;;15498:1;15493:7;;;;;;15450:51;15503:8;15383:31;:139::i;:::-;15533:18;15568:4:::0;;-1:-1:-1;;15573:15:10;;15568:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15568:21:10::1;-1:-1:-1::0;;;;;15554:46:10::1;;15601:2;15554:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;15554:50:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15554:50:10;15615:44:::1;::::0;;15554:50:::1;15615:44:::0;;::::1;::::0;;;;;;;;;;;15554:50;;-1:-1:-1;15615:44:10::1;::::0;;;15650:4;;;;;;15615:44;::::1;::::0;15650:4;;15615:44;15650:4;15615:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;15656:2:10;;-1:-1:-1;15615:34:10::1;::::0;-1:-1:-1;;15615:44:10:i:1;:::-;15765:12:::0;15692:69:::1;15747:13:::0;15706:4;;-1:-1:-1;;15711:15:10;;15706:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;15706:21:10::1;-1:-1:-1::0;;;;;15692:46:10::1;;15739:2;15692:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;15692:50:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;15692:50:10;;:54:::1;:69::i;:::-;:85;;15670:178;;;;-1:-1:-1::0;;;15670:178:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;580:1;15128:728:::0;;;;;;;:::o;16732:850::-;16999:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;-1:-1:-1;;;;;17058:4:10::1;17033:29;:4:::0;;-1:-1:-1;;17038:15:10;;17033:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;17033:21:10::1;-1:-1:-1::0;;;;;17033:29:10::1;;17025:71;;;::::0;;-1:-1:-1;;;17025:71:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;17025:71:10;;;;;;;;;;;;;::::1;;17107:139;17153:4;;17158:1;17153:7;;;;;;17107:139;17257:55;17292:4;;17257:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;17306:4:10::1;::::0;-1:-1:-1;17257:34:10::1;::::0;-1:-1:-1;;17257:55:10:i:1;:::-;17323:14;17354:4;-1:-1:-1::0;;;;;17340:29:10::1;;17378:4;17340:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;17340:44:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17340:44:10;;-1:-1:-1;17403:25:10;;::::1;;17395:81;;;;-1:-1:-1::0;;;17395:81:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17493:4;-1:-1:-1::0;;;;;17487:20:10::1;;17508:9;17487:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17529:45;17560:2;17564:9;17529:30;:45::i;10551:697::-:0;10767:21;10739:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;10825:4:::1;-1:-1:-1::0;;;;;10814:15:10::1;:4;;10819:1;10814:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;10814:7:10::1;-1:-1:-1::0;;;;;10814:15:10::1;;10806:57;;;::::0;;-1:-1:-1;;;10806:57:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;10806:57:10;;;;;;;;;;;;;::::1;;10884:56;10915:7;10924:9;10935:4;;10884:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10884:30:10::1;::::0;-1:-1:-1;;;10884:56:10:i:1;:::-;10874:66;;10990:12;10959:7;10984:1;10967:7;:14;:18;10959:27;;;;;;;;;;;;;;:43;;10951:99;;;;-1:-1:-1::0;;;10951:99:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11067:4;-1:-1:-1::0;;;;;11061:19:10::1;;11088:7;11096:1;11088:10;;;;;;;;;;;;;;11061:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;11125:4;-1:-1:-1::0;;;;;11119:20:10::1;;11140:51;11165:7;11174:4;;11179:1;11174:7;;;;;;11140:51;11193:7;11201:1;11193:10;;;;;;;;;;;;;;11119:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;11119:85:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;11119:85:10;11112:93:::1;;;;11216:24;11222:7;11231:4;;11216:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;11237:2:10;;-1:-1:-1;11216:5:10::1;::::0;-1:-1:-1;;11216:24:10:i:1;:::-;10551:697:::0;;;;;;;;:::o;18092:261::-;18245:13;18283:62;18312:9;18323;18334:10;18283:28;:62::i;9939:606::-;10163:21;10144:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;10207:55:::1;10237:7;10246:9;10257:4;;10207:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;10207:29:10::1;::::0;-1:-1:-1;;;10207:55:10:i:1;:::-;10197:65;;10295:11;10281:7;10289:1;10281:10;;;;;;;;;;;;;;:25;;10273:77;;;;-1:-1:-1::0;;;10273:77:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;416:38:::0;;;:::o;17626:188::-;17723:12;17755:51;17778:7;17787:8;17797;17755:22;:51::i;7022:707::-;7288:14;7269:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;7331:196:::1;7361:5;7381:4;7400:9;7424:14;7453:12;7488:4;7508:8;7331:15;:196::i;:::-;7315:212;;;;;;7538:85;7566:5;7573:2;7591:5;-1:-1:-1::0;;;;;7577:30:10::1;;7616:4;7577:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;7577:45:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;7577:45:10;7538:27:::1;:85::i;:::-;7640:4;-1:-1:-1::0;;;;;7634:20:10::1;;7655:9;7634:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7676:45;7707:2;7711:9;7676:30;:45::i;15862:864::-:0;16122:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;16167:4:::1;-1:-1:-1::0;;;;;16156:15:10::1;:4;;16161:1;16156:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;16156:7:10::1;-1:-1:-1::0;;;;;16156:15:10::1;;16148:57;;;::::0;;-1:-1:-1;;;16148:57:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;16148:57:10;;;;;;;;;;;;;::::1;;16216:13;16232:9;16216:25;;16258:4;-1:-1:-1::0;;;;;16252:19:10::1;;16279:8;16252:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;16314:4;-1:-1:-1::0;;;;;16308:20:10::1;;16329:51;16354:7;16363:4;;16368:1;16363:7;;;;;;16329:51;16382:8;16308:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;16308:83:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16308:83:10;16301:91:::1;;;;16403:18;16438:4:::0;;-1:-1:-1;;16443:15:10;;16438:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;16438:21:10::1;-1:-1:-1::0;;;;;16424:46:10::1;;16471:2;16424:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;16424:50:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16424:50:10;16485:44:::1;::::0;;16424:50:::1;16485:44:::0;;::::1;::::0;;;;;;;;;;;16424:50;;-1:-1:-1;16485:44:10::1;::::0;;;16520:4;;;;;;16485:44;::::1;::::0;16520:4;;16485:44;16520:4;16485:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;16526:2:10;;-1:-1:-1;16485:34:10::1;::::0;-1:-1:-1;;16485:44:10:i:1;:::-;16635:12:::0;16562:69:::1;16617:13:::0;16576:4;;-1:-1:-1;;16581:15:10;;16576:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;16576:21:10::1;-1:-1:-1::0;;;;;16562:46:10::1;;16609:2;16562:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;16562:50:10::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;4041:865:::0;4295:12;4309;4276:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;4334:12:::1;4349:49;4374:7;4383:6;4391;4349:24;:49::i;:::-;4409:62;::::0;;-1:-1:-1;;;4409:62:10;;4443:10:::1;4409:62;::::0;::::1;::::0;-1:-1:-1;;;;;4409:33:10;::::1;:62:::0;;;;;;;;;;;;;;4334:64;;-1:-1:-1;4409:33:10;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;4409:33:10;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;4539:29:10::1;::::0;;-1:-1:-1;;;4539:29:10;;-1:-1:-1;;;;;4539:29:10;;::::1;;::::0;::::1;::::0;;;4509:12:::1;::::0;;;4539:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;4509:12;4539:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;4539:29:10;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;4539:29:10;-1:-1:-1;4580:14:10::1;4599:43;4627:6:::0;4635;4599:27:::1;:43::i;:::-;4579:63;;;4684:6;-1:-1:-1::0;;;;;4674:16:10::1;:6;-1:-1:-1::0;;;;;4674:16:10::1;;:58;;4715:7;4724;4674:58;;;4694:7;4703;4674:58;4653:79:::0;;-1:-1:-1;4653:79:10;-1:-1:-1;4751:21:10;;::::1;;4743:72;;;;-1:-1:-1::0;;;4743:72:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4845:10;4834:7;:21;;4826:72;;;;-1:-1:-1::0;;;4826:72:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;580:1;;;;4041:865:::0;;;;;;;;;;;:::o;368:41::-;;;:::o;18361:253::-;18505:21;18551:55;18582:7;18591:8;18601:4;18551:30;:55::i;6274:669::-;6563:16;6581:14;6608:12;6623:46;6648:7;6657:5;6664:4;6623:24;:46::i;:::-;6608:61;;6680:10;6693;:33;;6717:9;6693:33;;;-1:-1:-1;;6693:33:10;6737:80;;;-1:-1:-1;;;6737:80:10;;6765:10;6737:80;;;;6785:4;6737:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6680:46;;-1:-1:-1;;;;;;6737:27:10;;;;;:80;;;;;-1:-1:-1;;6737:80:10;;;;;;;;-1:-1:-1;6737:27:10;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6855;6874:5;6881:9;6892:14;6908:12;6922:2;6926:8;6855:18;:80::i;:::-;6828:107;;;;-1:-1:-1;6274:669:10;-1:-1:-1;;;;;;;;;;;;;6274:669:10:o;2280:738::-;2568:12;2582;2596:14;2549:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;2644:85:::1;2658:6;2666;2674:14;2690;2706:10;2718;2644:13;:85::i;:::-;2623:106:::0;;-1:-1:-1;2623:106:10;-1:-1:-1;2740:12:10::1;2755:49;2780:7;2789:6:::0;2797;2755:24:::1;:49::i;:::-;2740:64;;2815:66;2847:6;2855:10;2867:4;2873:7;2815:31;:66::i;:::-;2892;2924:6;2932:10;2944:4;2950:7;2892:31;:66::i;:::-;2996:4;-1:-1:-1::0;;;;;2981:25:10::1;;3007:2;2981:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;2981:29:10::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;2981:29:10;2280:738;;;;-1:-1:-1;2981:29:10;;-1:-1:-1;2280:738:10;;-1:-1:-1;;;;;;;;;2280:738:10:o;3024:974::-;3277:16;3295:14;3311;3258:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;3365:176:::1;3393:5;3413:4;3432:18;3465:9;3489:14;3518:12;3365:13;:176::i;:::-;3338:203:::0;;-1:-1:-1;3338:203:10;-1:-1:-1;3552:12:10::1;3567:46;3592:7;3601:5:::0;3608:4:::1;3567:24;:46::i;:::-;3552:61;;3624:69;3656:5;3663:10;3675:4;3681:11;3624:31;:69::i;:::-;3710:4;-1:-1:-1::0;;;;;3704:19:10::1;;3731:9;3704:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3767:4;-1:-1:-1::0;;;;;3761:20:10::1;;3782:4;3788:9;3761:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;3761:37:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3761:37:10;3754:45:::1;;;;3837:4;-1:-1:-1::0;;;;;3822:25:10::1;;3848:2;3822:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;3822:29:10::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;3822:29:10;;-1:-1:-1;3902:9:10::1;:21:::0;-1:-1:-1;3898:92:10::1;;;3925:65;3956:10;3980:9;3968;:21;3925:30;:65::i;:::-;580:1;3024:974:::0;;;;;;;;;;;:::o;12944:810::-;13157:21;13129:8;525:15;513:8;:27;;505:64;;;;;-1:-1:-1;;;505:64:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;505:64:10;;;;;;;;;;;;;;;13215:4:::1;-1:-1:-1::0;;;;;13204:15:10::1;:4;;13209:1;13204:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;13204:7:10::1;-1:-1:-1::0;;;;;13204:15:10::1;;13196:57;;;::::0;;-1:-1:-1;;;13196:57:10;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;13196:57:10;;;;;;;;;;;;;::::1;;13274:55;13304:7;13313:9;13324:4;;13274:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13274:29:10::1;::::0;-1:-1:-1;;;13274:55:10:i:1;:::-;13264:65;;13362:9;13348:7;13356:1;13348:10;;;;;;;;;;;;;;:23;;13340:75;;;;-1:-1:-1::0;;;13340:75:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13432:4;-1:-1:-1::0;;;;;13426:19:10::1;;13453:7;13461:1;13453:10;;;;;;;;;;;;;;13426:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;13490:4;-1:-1:-1::0;;;;;13484:20:10::1;;13505:51;13530:7;13539:4;;13544:1;13539:7;;;;;;13505:51;13558:7;13566:1;13558:10;;;;;;;;;;;;;;13484:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;13484:85:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;13484:85:10;13477:93:::1;;;;13581:24;13587:7;13596:4;;13581:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;13602:2:10;;-1:-1:-1;13581:5:10::1;::::0;-1:-1:-1;;13581:24:10:i:1;:::-;13668:7;13676:1;13668:10;;;;;;;;;;;;;;13656:9;:22;13652:94;;;13680:66;13711:10;13735:7;13743:1;13735:10;;;;;;;;;;;;;;13723:9;:22;13680:30;:66::i;575:361:7:-:0;770:45;;;-1:-1:-1;;;;;770:45:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;770:45:7;-1:-1:-1;;;770:45:7;;;759:57;;;;724:12;;738:17;;759:10;;;;770:45;759:57;;;770:45;759:57;;770:45;759:57;;;;;;;;;;-1:-1:-1;;759:57:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;723:93;;;;835:7;:57;;;;-1:-1:-1;847:11:7;;:16;;:44;;;878:4;867:24;;;;;;;;;;;;;;;-1:-1:-1;867:24:7;847:44;827:101;;;;;-1:-1:-1;;;827:101:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;575:361;;;;;:::o;1354:195::-;1462:12;;;1424;1462;;;;;;;;;-1:-1:-1;;;;;1441:7:7;;;1455:5;;1441:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1441:34:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1423:52;;;1494:7;1486:55;;;;-1:-1:-1;;;1486:55:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1354:195;;;:::o;2228:519:9:-;2321:14;2367:1;2356:8;:12;2348:68;;;;-1:-1:-1;;;2348:68:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2447:1;2435:9;:13;:31;;;;;2465:1;2452:10;:14;2435:31;2427:84;;;;-1:-1:-1;;;2427:84:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2522:20;2545:18;:8;2558:4;2545:12;:18::i;:::-;2522:41;-1:-1:-1;2574:14:9;2591:31;2522:41;2611:10;2591:19;:31::i;:::-;2574:48;-1:-1:-1;2633:16:9;2652:41;2677:15;2652:20;:9;2666:5;2652:13;:20::i;:::-;:24;;:41::i;:::-;2633:60;;2728:11;2716:9;:23;;;;;;;2228:519;-1:-1:-1;;;;;;;2228:519:9:o;3424:511::-;3525:21;3582:1;3567:4;:11;:16;;3559:59;;;;;-1:-1:-1;;;3559:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3650:4;:11;3639:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3639:23:9;;3629:33;;3686:8;3673:7;3681:1;3673:10;;;;;;;;;;;;;:21;;;;;3710:6;3705:223;3736:1;3722:4;:11;:15;3718:1;:19;3705:223;;;3760:14;3776:15;3795:42;3807:7;3816:4;3821:1;3816:7;;;;;;;;;;;;;;3825:4;3830:1;3834;3830:5;3825:11;;;;;;;;;;;;;;3795;:42::i;:::-;3759:78;;;;3869:47;3882:7;3890:1;3882:10;;;;;;;;;;;;;;3894:9;3905:10;3869:12;:47::i;:::-;3852:7;3860:1;3864;3860:5;3852:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;3739:3:9;;3705:223;;;;3424:511;;;;;:::o;745:478::-;834:12;860:14;876;894:26;905:6;913;894:10;:26::i;:::-;1058:32;;;-1:-1:-1;;1058:32:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1048:43;;;;;;-1:-1:-1;;;;;;961:251:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;951:262;;;;;;;;;745:478;-1:-1:-1;;;;;745:478:9:o;944:402:7:-;1169:51;;;-1:-1:-1;;;;;1169:51:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1169:51:7;-1:-1:-1;;;1169:51:7;;;1158:63;;;;1123:12;;1137:17;;1158:10;;;;1169:51;1158:63;;;1169:51;1158:63;;1169:51;1158:63;;;;;;;;;;-1:-1:-1;;1158:63:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1122:99;;;;1240:7;:57;;;;-1:-1:-1;1252:11:7;;:16;;:44;;;1283:4;1272:24;;;;;;;;;;;;;;;-1:-1:-1;1272:24:7;1252:44;1232:106;;;;-1:-1:-1;;;1232:106:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;944:402;;;;;;:::o;8564:735:10:-;8671:6;8666:626;8697:1;8683:4;:11;:15;8679:1;:19;8666:626;;;8721:13;8736:14;8755:4;8760:1;8755:7;;;;;;;;;;;;;;8764:4;8769:1;8773;8769:5;8764:11;;;;;;;;;;;;;;8720:56;;;;8792:14;8811:42;8839:5;8846:6;8811:27;:42::i;:::-;8791:62;;;8868:14;8885:7;8893:1;8897;8893:5;8885:14;;;;;;;;;;;;;;8868:31;;8915:15;8932;8960:6;-1:-1:-1;;;;;8951:15:10;:5;-1:-1:-1;;;;;8951:15:10;;:61;;8993:9;9009:1;8951:61;;;8975:1;8979:9;8951:61;8914:98;;;;9027:10;9058:1;9044:4;:11;:15;9040:1;:19;:82;;9119:3;9040:82;;;9062:54;9087:7;9096:6;9104:4;9109:1;9113;9109:5;9104:11;;;;;;;;;;;;;;9062:24;:54::i;:::-;9027:95;;9152:48;9177:7;9186:5;9193:6;9152:24;:48::i;:::-;-1:-1:-1;;;;;9137:69:10;;9225:10;9237;9249:2;9263:1;9253:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9253:12:10;;9137:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9137:143:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8700:3:10;;;;;-1:-1:-1;8666:626:10;;-1:-1:-1;;;;;;;;8666:626:10;;;8564:735;;;:::o;4016:532:9:-;4117:21;4174:1;4159:4;:11;:16;;4151:59;;;;;-1:-1:-1;;;4151:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4242:4;:11;4231:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4231:23:9;;4221:33;;4295:9;4265:7;4290:1;4273:7;:14;:18;4265:27;;;;;;;;;;;;;;;;;:39;4329:11;;-1:-1:-1;;4329:15:9;4315:226;4346:5;;4315:226;;4374:14;4390:15;4409:42;4421:7;4430:4;4439:1;4435;:5;4430:11;;;;;;;;;;;;;;4443:4;4448:1;4443:7;;;;;;;4409:42;4373:78;;;;4483:46;4495:7;4503:1;4495:10;;;;;;;;;;;;;;4507:9;4518:10;4483:11;:46::i;:::-;4466:7;4478:1;4474;:5;4466:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;4353:3:9;4315:226;;13901:1221:10;14014:6;14009:1106;14040:1;14026:4;:11;:15;14022:1;:19;14009:1106;;;14064:13;14079:14;14098:4;14103:1;14098:7;;;;;;;;;;;;;;14107:4;14112:1;14116;14112:5;14107:11;;;;;;;;;;;;;;14063:56;;;;14135:14;14154:42;14182:5;14189:6;14154:27;:42::i;:::-;14134:62;;;14211:19;14248:48;14273:7;14282:5;14289:6;14248:24;:48::i;:::-;14211:86;;14312:16;14343:17;14431:13;14446;14464:4;-1:-1:-1;;;;;14464:16:10;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14464:18:10;;;;;;;-1:-1:-1;;;;;14430:52:10;;;;-1:-1:-1;14430:52:10;;-1:-1:-1;14498:17:10;;-1:-1:-1;;;;;14539:15:10;;;;;;;:61;;14581:8;14591;14539:61;;;14558:8;14568;14539:61;14497:103;;;;14629:63;14679:12;14643:5;-1:-1:-1;;;;;14629:30:10;;14668:4;14629:45;;;;;;;;;;;;;-1:-1:-1;;;;;14629:45:10;;;;;;;;;;;;;;;;;;;;;;;;;;:63;14615:77;;14722:71;14752:11;14765:12;14779:13;14722:29;:71::i;:::-;14707:86;;14009:1106;;;;14824:15;14841;14869:6;-1:-1:-1;;;;;14860:15:10;:5;-1:-1:-1;;;;;14860:15:10;;:67;;14905:12;14924:1;14860:67;;;14884:1;14888:12;14860:67;14823:104;;;;14942:10;14973:1;14959:4;:11;:15;14955:1;:19;:82;;15034:3;14955:82;;;14977:54;15002:7;15011:6;15019:4;15024:1;15028;15024:5;15019:11;;;;;;;14977:54;15090:12;;;15100:1;15090:12;;;;;;;;;;-1:-1:-1;;;15052:51:10;;;;;;;;;;;;;;-1:-1:-1;;;;;15052:51:10;;;;;;;;;;;;;;;;;;;;;;14942:95;;-1:-1:-1;15052:9:10;;;;;;15062:10;;15074;;14942:95;;15090:12;;15052:51;;;;;;;;15090:12;;15052:51;;;;15090:12;;15052:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14043:3:10;;;;;-1:-1:-1;14009:1106:10;;-1:-1:-1;;;;;;;;;;14009:1106:10;1329:134:6;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;2868:474:9:-;2961:13;3007:1;2995:9;:13;2987:70;;;;-1:-1:-1;;;2987:70:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3088:1;3076:9;:13;:31;;;;;3106:1;3093:10;:14;3076:31;3068:84;;;;-1:-1:-1;;;3068:84:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3163:14;3180:35;3209:5;3180:24;:9;3194;3180:13;:24::i;:::-;:28;;:35::i;:::-;3163:52;-1:-1:-1;3226:16:9;3245:35;3275:4;3245:25;:10;3260:9;3245:14;:25::i;:35::-;3226:54;;3302:32;3332:1;3315:11;3303:9;:23;;;;;;;3302:29;:32::i;:::-;3291:43;2868:474;-1:-1:-1;;;;;;2868:474:9:o;1785:321::-;1867:12;1910:1;1900:7;:11;1892:61;;;;-1:-1:-1;;;1892:61:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1983:1;1972:8;:12;:28;;;;;1999:1;1988:8;:12;1972:28;1964:81;;;;-1:-1:-1;;;1964:81:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2090:8;2066:21;:7;2078:8;2066:11;:21::i;:::-;:32;;;;;;;1785:321;-1:-1:-1;;;;1785:321:9:o;304:349::-;379:14;395;440:6;-1:-1:-1;;;;;430:16:9;:6;-1:-1:-1;;;;;430:16:9;;;422:66;;;;-1:-1:-1;;;422:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;527:6;-1:-1:-1;;;;;518:15:9;:6;-1:-1:-1;;;;;518:15:9;;:53;;556:6;564;518:53;;;537:6;545;518:53;499:72;;-1:-1:-1;499:72:9;-1:-1:-1;;;;;;590:20:9;;582:63;;;;;-1:-1:-1;;;582:63:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;304:349;;;;;:::o;884:1390:10:-;1102:12;1116;1259:1;-1:-1:-1;;;;;1197:64:10;1215:7;-1:-1:-1;;;;;1197:34:10;;1232:6;1240;1197:50;;;;;;;;;;;;;-1:-1:-1;;;;;1197:50:10;;;;;;-1:-1:-1;;;;;1197:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1197:50:10;-1:-1:-1;;;;;1197:64:10;;1193:150;;;1296:7;-1:-1:-1;;;;;1278:37:10;;1316:6;1324;1278:53;;;;;;;;;;;;;-1:-1:-1;;;;;1278:53:10;;;;;;-1:-1:-1;;;;;1278:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1193:150:10;1354:13;1369;1386:53;1415:7;1424:6;1432;1386:28;:53::i;:::-;1353:86;;;;1454:8;1466:1;1454:13;:30;;;;-1:-1:-1;1471:13:10;;1454:30;1450:817;;;1523:14;;-1:-1:-1;1539:14:10;;-1:-1:-1;1450:817:10;;;1587:19;1609:58;1632:14;1648:8;1658;1609:22;:58::i;:::-;1587:80;;1704:14;1686;:32;1682:574;;1765:10;1747:14;:28;;1739:79;;;;-1:-1:-1;;;1739:79:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1859:14;;-1:-1:-1;1875:14:10;-1:-1:-1;1875:14:10;1682:574;;;1931:19;1953:58;1976:14;1992:8;2002;1953:22;:58::i;:::-;1931:80;;2055:14;2037;:32;;2030:40;;;;2115:10;2097:14;:28;;2089:79;;;;-1:-1:-1;;;2089:79:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2209:14;-1:-1:-1;2225:14:10;;-1:-1:-1;1682:574:10;1450:817;;884:1390;;;;;;;;;;;:::o;479:142:8:-;531:6;558;;;:30;;-1:-1:-1;;573:5:8;;;587:1;582;573:5;582:1;568:15;;;;;:20;558:30;550:63;;;;;-1:-1:-1;;;550:63:8;;;;;;;;;;;;-1:-1:-1;;;550:63:8;;;;;;;;;;;;;;206:128;290:5;;;285:16;;;;277:49;;;;;-1:-1:-1;;;277:49:8;;;;;;;;;;;;-1:-1:-1;;;277:49:8;;;;;;;;;;;;;;1281:391:9;1374:13;1389;1416:14;1435:26;1446:6;1454;1435:10;:26::i;:::-;1415:46;;;1473:13;1488;1521:32;1529:7;1538:6;1546;1521:7;:32::i;:::-;-1:-1:-1;;;;;1506:60:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1506:62:9;;;;;;;-1:-1:-1;;;;;1472:96:9;;;;-1:-1:-1;1472:96:9;;-1:-1:-1;;;;;;1602:16:9;;;;;;;:62;;1645:8;1655;1602:62;;;1622:8;1632;1602:62;1579:85;;;;-1:-1:-1;1281:391:9;-1:-1:-1;;;;;;;1281:391:9:o;1754:187:6:-;1840:7;1875:12;1867:6;;;;1859:29;;;;-1:-1:-1;;;1859:29:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1910:5:6;;;1754:187::o;342:129:8:-;426:5;;;421:16;;;;413:50;;;;;-1:-1:-1;;;413:50:8;;;;;;;;;;;;-1:-1:-1;;;413:50:8;;;;;;;;;;;;;

Swarm Source

ipfs://a8a5b5d6578f47e8272e002874cb61307fa1ef4d466783fa29a88029a8d01ce0
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.