Contract 0x1b02da8cb0d097eb8d57a175b88c7d8b47997506 18

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x54193872bdf3d1281f3767ed96fe078ae1a70ad63e5778f2744283c8c45e2f15Swap Exact ETH F...50182432022-01-25 11:36:542 mins ago0x144ae423aeb55901d01d14bacdcbf835e1209cd7 IN  SushiSwap: Router30 ETH0.000786137176 ETH
0x321759344292e261728ed85cc6745976947c5f0df5638d41417551d8a31ac175Swap Exact ETH F...50182402022-01-25 11:36:542 mins ago0x899aaf08ef2ab872daf6283a90654ad82eb3becc IN  SushiSwap: Router0.9 ETH0.000782990963 ETH
0xdb09b688d3e8329807b1173099bd00d0c9ced98345f93312da5b4040ab31bab6Swap Exact Token...50182382022-01-25 11:36:542 mins ago0x39fc4cdaa0e79efe7687822f1c0bacc87e1deede IN  SushiSwap: Router0 ETH0.000981711932 ETH
0x53a4f306ce37f57cbc8d3f03bc3f0a6a4be7b979212a9b2fc1fb7009742926bcSwap Exact Token...50182312022-01-25 11:36:542 mins ago0xea3871fcdd47c06095b7ade579e8365083dbb871 IN  SushiSwap: Router0 ETH0.000812470751 ETH
0x876135a6d9877ff9ee0fa36f8af2deb02b9548c05d21ecc06eeefdad76b366f5Swap Exact Token...50182292022-01-25 11:36:542 mins ago0x1d6ab0c5bd6bfaf9712ab6f8647c49cc72021b01 IN  SushiSwap: Router0 ETH0.000805848885 ETH
0xcfc04658ee77d5d185ff656e7fc2bc0890385b0c1fae50334b956ec0b2f86fb4Swap Exact Token...50182072022-01-25 11:36:122 mins ago0x27ff5b2cd7eebd8e3646cac4ed2217576567b3f0 IN  SushiSwap: Router0 ETH0.000982544083 ETH
0xb5ff61287960d111704d72a4187f454319ea895770e72d52b7d22704962c8e76Swap Exact Token...50181922022-01-25 11:34:514 mins ago0x0ed49ef50af7549e2cc6c6d97d4253addf80e8e0 IN  SushiSwap: Router0 ETH0.000804105928 ETH
0xfddc8ac4fb15ecac84efc98da5b1d82e3e5828cefd7039a718eb3404a4f077ecSwap Exact Token...50181812022-01-25 11:34:025 mins ago0x88b0ea576428da635d0fa9deb686765c90cfde2e IN  SushiSwap: Router0 ETH0.00081416469 ETH
0x669764b2fa446a49402aaaae579fb01c3f4941a1181bc340250645bdb865e95aSwap Exact Token...50181682022-01-25 11:34:025 mins ago0xc21f1912218ca827dbcb3404d8191656776a8bc5 IN  SushiSwap: Router0 ETH0.000982302417 ETH
0x213d87f311afb2ebc74826c1362d2e66eb1c542c4d5782f85faf4bb8bbce0a11Swap Exact ETH F...50181562022-01-25 11:34:025 mins ago0x81a1fb1ad6f19237f3af5afa43eec2e83871ac48 IN  SushiSwap: Router0.42 ETH0.000843219283 ETH
0x99e1d19dbca006067df45e668924bf881f7c2de215951ce0060686389cd07359Swap Exact Token...50181492022-01-25 11:34:025 mins ago0x179873a1e788b11761ecb5cbe022796f51dd32c3 IN  SushiSwap: Router0 ETH0.000815601005 ETH
0xfa8b6f39b8663ad555593b1519092ec1a704d4615c4b41e7a77009ac183a8abbSwap Tokens For ...50181452022-01-25 11:33:315 mins ago0x9734223269742c4c683c93a507cfb5a97252023a IN  SushiSwap: Router0 ETH0.000812781952 ETH
0x67fc31d69f754bf87b78d3288e12aa62870bfd9b4660f891bf6c7551534b842eSwap Exact Token...50181422022-01-25 11:33:315 mins ago0x13144fb7f0bd0fec1629945b556118e09e10bb02 IN  SushiSwap: Router0 ETH0.00080743111 ETH
0x396236a5c5ace220001851639c1535f42f45224fa2ce01d9dec4221f0c801dfdSwap ETH For Exa...50181412022-01-25 11:33:315 mins ago0x03c2a1f9d098aeeea6676fefb959362ec5d65ab3 IN  SushiSwap: Router1.985152978571563 ETH0.000857529993 ETH
0x7d27b8ab831a58d10cda963ae97d1381f4cb091e2dd4e57e07524428de1eef96Swap Exact ETH F...50181312022-01-25 11:32:596 mins ago0x0f113303a71d2e4f287dc3aedc95df311410f766 IN  SushiSwap: Router0.173 ETH0.000788234651 ETH
0xc03c54cab923798e988085e1595f744b55dd082d0f5f31cbecf003b6ace404d0Swap Exact Token...50181292022-01-25 11:32:596 mins ago0x284942a930a3902043c296479d90c1bb731a9646 IN  SushiSwap: Router0 ETH0.000922481053 ETH
0x9c444d07db771807d110b7c78b6f6276208fb99c87bb994c1de840e8136b3242Swap Tokens For ...50181262022-01-25 11:32:596 mins ago0x39fc4cdaa0e79efe7687822f1c0bacc87e1deede IN  SushiSwap: Router0 ETH0.000980864963 ETH
0xe7ad13b2104f12a9450d867f4c6319870455562fe69114b4a1c327541b11e21bSwap Exact Token...50181172022-01-25 11:31:597 mins ago0x35eb9860cc25f683d2717508c7d5225a630b3eed IN  SushiSwap: Router0 ETH0.000807404892 ETH
0xdf08c11bf8d5974b11c9eba398d1f63fdba77fdd865411804791bee1bb77198aSwap Exact ETH F...50181002022-01-25 11:31:327 mins ago0xd3641067c20a5e97afa4b26238f22941c6961c49 IN  SushiSwap: Router0.005 ETH0.000845948281 ETH
0x92639dcae37404e16eef9fb07308ed0c155c43a2ef6caeebf260c6c820608ddeSwap Exact Token...50180982022-01-25 11:31:327 mins ago0xd027e3bc1b4be983002119583d9453f7389d61fd IN  SushiSwap: Router0 ETH0.000922665722 ETH
0xd09b2f282f2ff80529f2e55cf48ea042a4b0ab515a9a63042316261c7a5d2472Swap Exact Token...50180742022-01-25 11:29:399 mins ago0x4026b3da349c2952255ca9db4f055ea57f4e037c IN  SushiSwap: Router0 ETH0.000818238808 ETH
0x19d3e3d3b7de4fd235c3d32fc787aeca94387e7f0536d065449ec5e14cb6c0aeSwap Exact ETH F...50180702022-01-25 11:29:399 mins ago0x5bb0240dd04606d71f82979ed2329803104a9814 IN  SushiSwap: Router0.0002 ETH0.000846098752 ETH
0xf6b98f54c9d61a0efffaa82fa622931f0abc4fa05c5744242f3e468b86c5c01eSwap Exact Token...50180572022-01-25 11:28:3910 mins ago0x0682b693583885fb67169e893881e3f71339c913 IN  SushiSwap: Router0 ETH0.000812234785 ETH
0xe0313545317c775bf8dde7cadc79c532749e88255a7788fe70384f1bbd480ce6Swap Exact Token...50180422022-01-25 11:28:3910 mins ago0x5329e1d89bd9ce1c9bd78ab3565bb1ad594aa887 IN  SushiSwap: Router0 ETH0.000804047792 ETH
0x0c94b1dc919fe85e05af010fe3a24c9c0a2489fe185d6ba9ffbdb61fd3cda58cSwap Exact ETH F...50180392022-01-25 11:28:3910 mins ago0x6669c804c4672feb70197da26aed7064b5f57275 IN  SushiSwap: Router5.05 ETH0.000790568093 ETH
[ Download CSV Export 
Parent Txn Hash Block From To Value
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, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at arbiscan.io on 2021-08-31
*/

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

// File: contracts/uniswapv2/interfaces/IUniswapV2Pair.sol

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: contracts/uniswapv2/libraries/SafeMath.sol

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: contracts/uniswapv2/libraries/UniswapV2Library.sol

pragma solidity >=0.5.0;



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'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // 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(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).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(1000);
        uint denominator = reserveOut.sub(amountOut).mul(997);
        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);
        }
    }
}

// File: contracts/uniswapv2/libraries/TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

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: contracts/uniswapv2/interfaces/IUniswapV2Router01.sol

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: contracts/uniswapv2/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

// File: contracts/uniswapv2/interfaces/IUniswapV2Factory.sol

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: contracts/uniswapv2/interfaces/IERC20.sol

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: contracts/uniswapv2/interfaces/IWETH.sol

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: contracts/uniswapv2/UniswapV2Router02.sol

pragma solidity =0.6.12;








contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMathUniswap 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);
    }
}

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"}]

60c060405234801561001057600080fd5b50604051620046e7380380620046e78339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614562620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118d352806119ae5280611a885280611b565280611c9c5280611d245280611f605280611fdb528061208f528061215b52806121f05280612264528061274752806129b15280612a075280612a3b5280612aaf5280612c3d5280612d805280612e08525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611be95280611d565280611eb0528061229652806124d452806126cc52806126f55280612725528061289252806129e55280612cd05280612e3a52806136c0528061370352806139dd5280613b535280613f445280613ffd52806140b052506145626000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b038135169060200135611885565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b0e565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e58565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e65565b34801561088157600080fd5b5061088a611f5e565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f82565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611f8f565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612115565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612486565b348015610a1c57600080fd5b5061088a6126ca565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506126ee945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561271b565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561282f565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612962565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612bf5565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612486565b9093509150610d1d898685612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da585836130d8565b50965096945050505050565b6000610dbe8484846131d0565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b610efd7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b03166133f4565b85600081518110610fe657fe5b60200260200101516134b4565b61103282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b60200260200101516130d8565b509695505050505050565b60606111207f0000000000000000000000000000000000000000000000000000000000000000848461384e565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f6133f4565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f612486565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6112c77f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b6114a57f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611f8f565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a6134b4565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561172f57600080fd5b505afa158015611743573d6000803e3d6000fd5b505050506040513d602081101561175957600080fd5b5051604080516020888102828101820190935288825292935061179b929091899189918291850190849080828437600092019190915250889250613986915050565b8661183e82888860001981018181106117b057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d602081101561183657600080fd5b505190613c88565b101561187b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b5050505050505050565b80428110156118c9576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061190357fe5b905060200201356001600160a01b03166001600160a01b03161461195c576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b61196c8585600081811061165c57fe5b6119aa858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613986915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a1957600080fd5b505afa158015611a2d573d6000803e3d6000fd5b505050506040513d6020811015611a4357600080fd5b5051905086811015611a865760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aec57600080fd5b505af1158015611b00573d6000803e3d6000fd5b5050505061187b84826130d8565b60608142811015611b54576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b8b57fe5b905060200201356001600160a01b03166001600160a01b031614611be4576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b611c427f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506132a892505050565b91508682600184510381518110611c5557fe5b60200260200101511015611c9a5760405162461bcd60e51b815260040180806020018281038252602b815260200180614493602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611cd657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d0957600080fd5b505af1158015611d1d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d827f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611d8f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b5051611e0f57fe5b611e4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b5095945050505050565b6000610dbe848484613cd8565b60608142811015611eab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b611f097f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91508682600081518110611f1957fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613db0565b60008142811015611fd5576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b612004887f00000000000000000000000000000000000000000000000000000000000000008989893089612486565b90508092505061208d88858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d602081101561208657600080fd5b5051612f6e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120f357600080fd5b505af1158015612107573d6000803e3d6000fd5b505050506110e884836130d8565b8042811015612159576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061219057fe5b905060200201356001600160a01b03166001600160a01b0316146121e9576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561224957600080fd5b505af115801561225d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122c27f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561230957600080fd5b505af115801561231d573d6000803e3d6000fd5b505050506040513d602081101561233357600080fd5b505161233b57fe5b60008686600019810181811061234d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123a957600080fd5b505afa1580156123bd573d6000803e3d6000fd5b505050506040513d60208110156123d357600080fd5b505160408051602089810282810182019093528982529293506124159290918a918a918291850190849080828437600092019190915250899250613986915050565b8761183e828989600019810181811061242a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b60008082428110156124cd576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b60006124fa7f00000000000000000000000000000000000000000000000000000000000000008c8c6133f4565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561255557600080fd5b505af1158015612569573d6000803e3d6000fd5b505050506040513d602081101561257f57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125cc57600080fd5b505af11580156125e0573d6000803e3d6000fd5b505050506040513d60408110156125f657600080fd5b508051602090910151909250905060006126108e8e613e56565b509050806001600160a01b03168e6001600160a01b031614612633578183612636565b82825b90975095508a87101561267a5760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b898610156126b95760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846132a8565b600080600061276b7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006133f4565b905060008761277a578c61277e565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156127f457600080fd5b505af1158015612808573d6000803e3d6000fd5b5050505061281a8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b60008060008342811015612878576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6128868c8c8c8c8c8c613f34565b909450925060006128b87f00000000000000000000000000000000000000000000000000000000000000008e8e6133f4565b90506128c68d3383886134b4565b6128d28c3383876134b4565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b505050506040513d602081101561294b57600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129ab576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b6129d98a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613f34565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006133f4565b9050612a398b3383886134b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a9457600080fd5b505af1158015612aa8573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6020811015612b4e57600080fd5b5051612b5657fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612ba557600080fd5b505af1158015612bb9573d6000803e3d6000fd5b505050506040513d6020811015612bcf57600080fd5b5051925034841015612be757612be7338534036130d8565b505096509650969350505050565b60608142811015612c3b576040805162461bcd60e51b8152602060048201526018602482015260008051602061450d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c7257fe5b905060200201356001600160a01b03166001600160a01b031614612ccb576040805162461bcd60e51b815260206004820152601d602482015260008051602061442a833981519152604482015290519081900360640190fd5b612d297f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061384e92505050565b91503482600081518110612d3957fe5b60200260200101511115612d7e5760405162461bcd60e51b81526004018080602001828103825260278152602001806144036027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612dba57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612ded57600080fd5b505af1158015612e01573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612e667f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612e7357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ec157600080fd5b505af1158015612ed5573d6000803e3d6000fd5b505050506040513d6020811015612eeb57600080fd5b5051612ef357fe5b612f3282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b81600081518110612f3f57fe5b6020026020010151341115611e4e57611e4e3383600081518110612f5f57fe5b602002602001015134036130d8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612feb5780518252601f199092019160209182019101612fcc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b5091509150818015613080575080511580613080575080806020019051602081101561307d57600080fd5b50515b6130d1576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131245780518252601f199092019160209182019101613105565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613186576040519150601f19603f3d011682016040523d82523d6000602084013e61318b565b606091505b50509050806131cb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144706023913960400191505060405180910390fd5b505050565b60008084116132105760405162461bcd60e51b815260040180806020018281038252602b8152602001806144e2602b913960400191505060405180910390fd5b6000831180156132205750600082115b61325b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613269856103e56141c5565b9050600061327782856141c5565b905060006132918361328b886103e86141c5565b90614228565b905080828161329c57fe5b04979650505050505050565b6060600282511015613301576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561331957600080fd5b50604051908082528060200260200182016040528015613343578160200160208202803683370190505b509050828160008151811061335457fe5b60200260200101818152505060005b60018351038110156133ec576000806133a68786858151811061338257fe5b602002602001015187866001018151811061339957fe5b6020026020010151614277565b915091506133c88484815181106133b957fe5b602002602001015183836131d0565b8484600101815181106133d757fe5b60209081029190910101525050600101613363565b509392505050565b60008060006134038585613e56565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fe18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135395780518252601f19909201916020918201910161351a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461359b576040519150601f19603f3d011682016040523d82523d6000602084013e6135a0565b606091505b50915091508180156135ce5750805115806135ce57508080602001905160208110156135cb57600080fd5b50515b6136095760405162461bcd60e51b81526004018080602001828103825260248152602001806144be6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138485760008084838151811061362f57fe5b602002602001015185846001018151811061364657fe5b602002602001015191509150600061365e8383613e56565b509050600087856001018151811061367257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146136a0578260006136a4565b6000835b91509150600060028a510388106136bb57886136fc565b6136fc7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106136ef57fe5b60200260200101516133f4565b90506137297f000000000000000000000000000000000000000000000000000000000000000088886133f4565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613766576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156137ce5781810151838201526020016137b6565b50505050905090810190601f1680156137fb5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561381d57600080fd5b505af1158015613831573d6000803e3d6000fd5b505060019099019850613614975050505050505050565b50505050565b60606002825110156138a7576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156138bf57600080fd5b506040519080825280602002602001820160405280156138e9578160200160208202803683370190505b50905082816001835103815181106138fd57fe5b60209081029190910101528151600019015b80156133ec5760008061393f8786600186038151811061392b57fe5b602002602001015187868151811061339957fe5b9150915061396184848151811061395257fe5b60200260200101518383613cd8565b84600185038151811061397057fe5b602090810291909101015250506000190161390f565b60005b60018351038110156131cb576000808483815181106139a457fe5b60200260200101518584600101815181106139bb57fe5b60200260200101519150915060006139d38383613e56565b5090506000613a037f000000000000000000000000000000000000000000000000000000000000000085856133f4565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613a4457600080fd5b505afa158015613a58573d6000803e3d6000fd5b505050506040513d6060811015613a6e57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613aa4578284613aa7565b83835b91509150613afc828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561180c57600080fd5b9550613b098683836131d0565b945050505050600080856001600160a01b0316886001600160a01b031614613b3357826000613b37565b6000835b91509150600060028c51038a10613b4e578a613b82565b613b827f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106136ef57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c0c578181015183820152602001613bf4565b50505050905090810190601f168015613c395780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613c5b57600080fd5b505af1158015613c6f573d6000803e3d6000fd5b50506001909b019a506139899950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d185760405162461bcd60e51b815260040180806020018281038252602c81526020018061433f602c913960400191505060405180910390fd5b600083118015613d285750600082115b613d635760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b6000613d7b6103e8613d7586886141c5565b906141c5565b90506000613d8f6103e5613d758689613c88565b9050613da66001828481613d9f57fe5b0490614228565b9695505050505050565b6000808411613df05760405162461bcd60e51b81526004018080602001828103825260258152602001806143de6025913960400191505060405180910390fd5b600083118015613e005750600082115b613e3b5760405162461bcd60e51b81526004018080602001828103825260288152602001806143b66028913960400191505060405180910390fd5b82613e4685846141c5565b81613e4d57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613eaa5760405162461bcd60e51b815260040180806020018281038252602581526020018061436b6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613eca578284613ecd565b83835b90925090506001600160a01b038216613f2d576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613fc057600080fd5b505afa158015613fd4573d6000803e3d6000fd5b505050506040513d6020811015613fea57600080fd5b50516001600160a01b031614156140a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561407b57600080fd5b505af115801561408f573d6000803e3d6000fd5b505050506040513d60208110156140a557600080fd5b50505b6000806140d67f00000000000000000000000000000000000000000000000000000000000000008b8b614277565b915091508160001480156140e8575080155b156140f8578793508692506141b8565b6000614105898484613db0565b9050878111614158578581101561414d5760405162461bcd60e51b81526004018080602001828103825260268152602001806143906026913960400191505060405180910390fd5b8894509250826141b6565b6000614165898486613db0565b90508981111561417157fe5b878110156141b05760405162461bcd60e51b815260040180806020018281038252602681526020018061444a6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806141e0575050808202828282816141dd57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142868585613e56565b5090506000806142978888886133f4565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156142cf57600080fd5b505afa1580156142e3573d6000803e3d6000fd5b505050506040513d60608110156142f957600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461432c57808261432f565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212201046181566cf8a35bd60f7e94b82dcde5a31b9e46aa697f15b739ad658b7871164736f6c634300060c0033000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c400000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

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

000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c400000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1

-----Decoded View---------------
Arg [0] : _factory (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
Arg [1] : _WETH (address): 0x82af49447d8a07e3bd95bd0d56f35241523fbab1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Arg [1] : 00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1


Deployed ByteCode Sourcemap

16554:18605:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17043:10;-1:-1:-1;;;;;17057:4:0;17043:18;;17036:26;;;;16554:18605;;;;;21193:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21193:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34103:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34103:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28369:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28369:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28369:850:0;;;;;;;;;;;;-1:-1:-1;28369:850:0;-1:-1:-1;;;;;;28369:850:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34903:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34903:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34903:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34903:253:0;;-1:-1:-1;34903:253:0;;-1:-1:-1;;;;;34903:253:0:i;21872:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21872:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25586:628::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25586:628:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25586:628:0;;;;;;;;;;;;-1:-1:-1;25586:628:0;-1:-1:-1;;;;;;25586:628:0;;;;;;;;:::i;27535:828::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27535:828:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27535:828:0;;;;;;;;;;;;-1:-1:-1;27535:828:0;-1:-1:-1;;;;;;27535:828:0;;;;;;;;:::i;24016:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24016:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31409:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31409:728:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31409:728:0;;;;;;;;;;;;-1:-1:-1;31409:728:0;-1:-1:-1;;;;;;31409:728:0;;;;;;;;:::i;33013:850::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33013:850:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33013:850:0;;;;;;;;;;;;-1:-1:-1;33013:850:0;-1:-1:-1;;;;;;33013:850:0;;;;;;;;:::i;26832:697::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26832:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26832:697:0;;;;;;;;;;;;-1:-1:-1;26832:697:0;-1:-1:-1;;;;;;26832:697:0;;;;;;;;:::i;34373:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34373:261:0;;;;;;;;;;;;:::i;26220:606::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26220:606:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26220:606:0;;;;;;;;;;;;-1:-1:-1;26220:606:0;-1:-1:-1;;;;;;26220:606:0;;;;;;;;:::i;16697:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;16697:38:0;;;;;;;;;;;;;;33907:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33907:188:0;;;;;;;;;;;;:::i;23303:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23303:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32143:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32143:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32143:864:0;;;;;;;;;;;;-1:-1:-1;32143:864:0;-1:-1:-1;;;;;;32143:864:0;;;;;;;;:::i;20322:865::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20322:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16649:41::-;;;;;;;;;;;;;:::i;34642:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34642:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34642:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34642:253:0;;-1:-1:-1;34642:253:0;;-1:-1:-1;;;;;34642:253:0:i;22555:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22555:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18561:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18561:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19305:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19305:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29225:810::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29225:810:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29225:810:0;;;;;;;;;;;;-1:-1:-1;29225:810:0;-1:-1:-1;;;;;;29225:810:0;;;;;;;;:::i;21193:673::-;21430:16;21448:14;21411:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;21502:196:::1;21532:5;21552:4;21571:9;21595:14;21624:12;21659:4;21679:8;21502:15;:196::i;:::-;21475:223:::0;;-1:-1:-1;21475:223:0;-1:-1:-1;21709:51:0::1;21737:5:::0;21744:2;21475:223;21709:27:::1;:51::i;:::-;21777:4;-1:-1:-1::0;;;;;21771:20:0::1;;21792:9;21771:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;21813:45;21844:2;21848:9;21813:30;:45::i;:::-;21193:673:::0;;;;;;;;;;:::o;34103:262::-;34256:14;34295:62;34325:8;34335:9;34346:10;34295:29;:62::i;:::-;34288:69;34103:262;-1:-1:-1;;;;34103:262:0:o;28369:850::-;28583:21;28555:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28655:4:0::1;28630:29;:4:::0;;-1:-1:-1;;28635:15:0;;28630:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28630:21:0::1;-1:-1:-1::0;;;;;28630:29:0::1;;28622:71;;;::::0;;-1:-1:-1;;;28622:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28622:71:0;;;;;;;;;;;;;::::1;;28714:55;28745:7;28754:8;28764:4;;28714:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28714:30:0::1;::::0;-1:-1:-1;;;28714:55:0:i:1;:::-;28704:65;;28819:12;28788:7;28813:1;28796:7;:14;:18;28788:27;;;;;;;;;;;;;;:43;;28780:99;;;;-1:-1:-1::0;;;28780:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28890:141;28936:4;;28941:1;28936:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28936:7:0::1;28945:10;28957:51;28982:7;28991:4;;28996:1;28991:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28991:7:0::1;29000:4;;29005:1;29000:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29000:7:0::1;28957:24;:51::i;:::-;29010:7;29018:1;29010:10;;;;;;;;;;;;;;28890:31;:141::i;:::-;29042:35;29048:7;29057:4;;29042:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29071:4:0::1;::::0;-1:-1:-1;29042:5:0::1;::::0;-1:-1:-1;;29042:35:0:i:1;:::-;29094:4;-1:-1:-1::0;;;;;29088:20:0::1;;29109:7;29134:1;29117:7;:14;:18;29109:27;;;;;;;;;;;;;;29088:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29148:63;29179:2;29183:7;29208:1;29191:7;:14;:18;29183:27;;;;;;;;;;;;;;29148:30;:63::i;:::-;28369:850:::0;;;;;;;;;:::o;34903:253::-;35047:21;35093:55;35123:7;35132:9;35143:4;35093:29;:55::i;:::-;35086:62;;34903:253;;;;;:::o;21872:677::-;22178:12;22192;22217;22232:49;22257:7;22266:6;22274;22232:24;:49::i;:::-;22217:64;;22292:10;22305;:33;;22329:9;22305:33;;;-1:-1:-1;;22305:33:0;22349:80;;;-1:-1:-1;;;22349:80:0;;22377:10;22349:80;;;;22397:4;22349:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22292:46;;-1:-1:-1;;;;;;22349:27:0;;;;;:80;;;;;-1:-1:-1;;22349:80:0;;;;;;;;-1:-1:-1;22349:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22461;22477:6;22485;22493:9;22504:10;22516;22528:2;22532:8;22461:15;:80::i;:::-;22440:101;;;;;;;;21872:677;;;;;;;;;;;;;;;;:::o;25586:628::-;25810:21;25791:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;25854:55:::1;25885:7;25894:8;25904:4;;25854:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25854:30:0::1;::::0;-1:-1:-1;;;25854:55:0:i:1;:::-;25844:65;;25959:12;25928:7;25953:1;25936:7;:14;:18;25928:27;;;;;;;;;;;;;;:43;;25920:99;;;;-1:-1:-1::0;;;25920:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26030:141;26076:4;;26081:1;26076:7;;;;;;26030:141;26182:24;26188:7;26197:4;;26182:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26203:2:0;;-1:-1:-1;26182:5:0::1;::::0;-1:-1:-1;;26182:24:0:i:1;27535:828::-:0;27749:21;27721:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27821:4:0::1;27796:29;:4:::0;;-1:-1:-1;;27801:15:0;;27796:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27796:21:0::1;-1:-1:-1::0;;;;;27796:29:0::1;;27788:71;;;::::0;;-1:-1:-1;;;27788:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27788:71:0;;;;;;;;;;;;;::::1;;27880:55;27910:7;27919:9;27930:4;;27880:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27880:29:0::1;::::0;-1:-1:-1;;;27880:55:0:i:1;:::-;27870:65;;27968:11;27954:7;27962:1;27954:10;;;;;;;;;;;;;;:25;;27946:77;;;;-1:-1:-1::0;;;27946:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24016:718:::0;24334:14;24361:12;24376:46;24401:7;24410:5;24417:4;24376:24;:46::i;:::-;24361:61;;24433:10;24446;:33;;24470:9;24446:33;;;-1:-1:-1;;24446:33:0;24490:80;;;-1:-1:-1;;;24490:80:0;;24518:10;24490:80;;;;24538:4;24490:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24433:46;;-1:-1:-1;;;;;;24490:27:0;;;;;:80;;;;;-1:-1:-1;;24490:80:0;;;;;;;;-1:-1:-1;24490:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24593:133;24655:5;24662:9;24673:14;24689:12;24703:2;24707:8;24593:47;:133::i;:::-;24581:145;24016:718;-1:-1:-1;;;;;;;;;;;;;24016:718:0:o;31409:728::-;31643:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;31664:139:::1;31710:4;;31715:1;31710:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31710:7:0::1;31719:10;31731:51;31756:7;31765:4;;31770:1;31765:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31765:7:0::1;31774:4;;31779:1;31774:7;;;;;;31731:51;31784:8;31664:31;:139::i;:::-;31814:18;31849:4:::0;;-1:-1:-1;;31854:15:0;;31849:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31849:21:0::1;-1:-1:-1::0;;;;;31835:46:0::1;;31882:2;31835:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31835:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31835:50:0;31896:44:::1;::::0;;31835:50:::1;31896:44:::0;;::::1;::::0;;;;;;;;;;;31835:50;;-1:-1:-1;31896:44:0::1;::::0;;;31931:4;;;;;;31896:44;::::1;::::0;31931:4;;31896:44;31931:4;31896:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31937:2:0;;-1:-1:-1;31896:34:0::1;::::0;-1:-1:-1;;31896:44:0:i:1;:::-;32046:12:::0;31973:69:::1;32028:13:::0;31987:4;;-1:-1:-1;;31992:15:0;;31987:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31987:21:0::1;-1:-1:-1::0;;;;;31973:46:0::1;;32020:2;31973:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;31973:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31973:50:0;;:54:::1;:69::i;:::-;:85;;31951:178;;;;-1:-1:-1::0;;;31951:178:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16861:1;31409:728:::0;;;;;;;:::o;33013:850::-;33280:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33339:4:0::1;33314:29;:4:::0;;-1:-1:-1;;33319:15:0;;33314:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33314:21:0::1;-1:-1:-1::0;;;;;33314:29:0::1;;33306:71;;;::::0;;-1:-1:-1;;;33306:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;33306:71:0;;;;;;;;;;;;;::::1;;33388:139;33434:4;;33439:1;33434:7;;;;;;33388:139;33538:55;33573:4;;33538:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33587:4:0::1;::::0;-1:-1:-1;33538:34:0::1;::::0;-1:-1:-1;;33538:55:0:i:1;:::-;33604:14;33635:4;-1:-1:-1::0;;;;;33621:29:0::1;;33659:4;33621:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;33621:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33621:44:0;;-1:-1:-1;33684:25:0;;::::1;;33676:81;;;;-1:-1:-1::0;;;33676:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33774:4;-1:-1:-1::0;;;;;33768:20:0::1;;33789:9;33768:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33810:45;33841:2;33845:9;33810:30;:45::i;26832:697::-:0;27048:21;27020:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;27106:4:::1;-1:-1:-1::0;;;;;27095:15:0::1;:4;;27100:1;27095:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;27095:7:0::1;-1:-1:-1::0;;;;;27095:15:0::1;;27087:57;;;::::0;;-1:-1:-1;;;27087:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27087:57:0;;;;;;;;;;;;;::::1;;27165:56;27196:7;27205:9;27216:4;;27165:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27165:30:0::1;::::0;-1:-1:-1;;;27165:56:0:i:1;:::-;27155:66;;27271:12;27240:7;27265:1;27248:7;:14;:18;27240:27;;;;;;;;;;;;;;:43;;27232:99;;;;-1:-1:-1::0;;;27232:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27348:4;-1:-1:-1::0;;;;;27342:19:0::1;;27369:7;27377:1;27369:10;;;;;;;;;;;;;;27342:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;27406:4;-1:-1:-1::0;;;;;27400:20:0::1;;27421:51;27446:7;27455:4;;27460:1;27455:7;;;;;;27421:51;27474:7;27482:1;27474:10;;;;;;;;;;;;;;27400:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;27400:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27400:85:0;27393:93:::1;;;;27497:24;27503:7;27512:4;;27497:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27518:2:0;;-1:-1:-1;27497:5:0::1;::::0;-1:-1:-1;;27497:24:0:i:1;:::-;26832:697:::0;;;;;;;;:::o;34373:261::-;34526:13;34564:62;34593:9;34604;34615:10;34564:28;:62::i;26220:606::-;26444:21;26425:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;26488:55:::1;26518:7;26527:9;26538:4;;26488:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26488:29:0::1;::::0;-1:-1:-1;;;26488:55:0:i:1;:::-;26478:65;;26576:11;26562:7;26570:1;26562:10;;;;;;;;;;;;;;:25;;26554:77;;;;-1:-1:-1::0;;;26554:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16697:38:::0;;;:::o;33907:188::-;34004:12;34036:51;34059:7;34068:8;34078;34036:22;:51::i;23303:707::-;23569:14;23550:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;23612:196:::1;23642:5;23662:4;23681:9;23705:14;23734:12;23769:4;23789:8;23612:15;:196::i;:::-;23596:212;;;;;;23819:85;23847:5;23854:2;23872:5;-1:-1:-1::0;;;;;23858:30:0::1;;23897:4;23858:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;23858:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23858:45:0;23819:27:::1;:85::i;:::-;23921:4;-1:-1:-1::0;;;;;23915:20:0::1;;23936:9;23915:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23957:45;23988:2;23992:9;23957:30;:45::i;32143:864::-:0;32403:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;32448:4:::1;-1:-1:-1::0;;;;;32437:15:0::1;:4;;32442:1;32437:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;32437:7:0::1;-1:-1:-1::0;;;;;32437:15:0::1;;32429:57;;;::::0;;-1:-1:-1;;;32429:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32429:57:0;;;;;;;;;;;;;::::1;;32497:13;32513:9;32497:25;;32539:4;-1:-1:-1::0;;;;;32533:19:0::1;;32560:8;32533:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;32595:4;-1:-1:-1::0;;;;;32589:20:0::1;;32610:51;32635:7;32644:4;;32649:1;32644:7;;;;;;32610:51;32663:8;32589:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;32589:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32589:83:0;32582:91:::1;;;;32684:18;32719:4:::0;;-1:-1:-1;;32724:15:0;;32719:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32719:21:0::1;-1:-1:-1::0;;;;;32705:46:0::1;;32752:2;32705:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32705:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32705:50:0;32766:44:::1;::::0;;32705:50:::1;32766:44:::0;;::::1;::::0;;;;;;;;;;;32705:50;;-1:-1:-1;32766:44:0::1;::::0;;;32801:4;;;;;;32766:44;::::1;::::0;32801:4;;32766:44;32801:4;32766:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32807:2:0;;-1:-1:-1;32766:34:0::1;::::0;-1:-1:-1;;32766:44:0:i:1;:::-;32916:12:::0;32843:69:::1;32898:13:::0;32857:4;;-1:-1:-1;;32862:15:0;;32857:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32857:21:0::1;-1:-1:-1::0;;;;;32843:46:0::1;;32890:2;32843:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;32843:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20322:865:::0;20576:12;20590;20557:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;20615:12:::1;20630:49;20655:7;20664:6;20672;20630:24;:49::i;:::-;20690:62;::::0;;-1:-1:-1;;;20690:62:0;;20724:10:::1;20690:62;::::0;::::1;::::0;-1:-1:-1;;;;;20690:33:0;::::1;:62:::0;;;;;;;;;;;;;;20615:64;;-1:-1:-1;20690:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20690:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;20820:29:0::1;::::0;;-1:-1:-1;;;20820:29:0;;-1:-1:-1;;;;;20820:29:0;;::::1;;::::0;::::1;::::0;;;20790:12:::1;::::0;;;20820:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;20790:12;20820:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20820:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20820:29:0;-1:-1:-1;20861:14:0::1;20880:43;20908:6:::0;20916;20880:27:::1;:43::i;:::-;20860:63;;;20965:6;-1:-1:-1::0;;;;;20955:16:0::1;:6;-1:-1:-1::0;;;;;20955:16:0::1;;:58;;20996:7;21005;20955:58;;;20975:7;20984;20955:58;20934:79:::0;;-1:-1:-1;20934:79:0;-1:-1:-1;21032:21:0;;::::1;;21024:72;;;;-1:-1:-1::0;;;21024:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21126:10;21115:7;:21;;21107:72;;;;-1:-1:-1::0;;;21107:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16861:1;;;;20322:865:::0;;;;;;;;;;;:::o;16649:41::-;;;:::o;34642:253::-;34786:21;34832:55;34863:7;34872:8;34882:4;34832:30;:55::i;22555:669::-;22844:16;22862:14;22889:12;22904:46;22929:7;22938:5;22945:4;22904:24;:46::i;:::-;22889:61;;22961:10;22974;:33;;22998:9;22974:33;;;-1:-1:-1;;22974:33:0;23018:80;;;-1:-1:-1;;;23018:80:0;;23046:10;23018:80;;;;23066:4;23018:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22961:46;;-1:-1:-1;;;;;;23018:27:0;;;;;:80;;;;;-1:-1:-1;;23018:80:0;;;;;;;;-1:-1:-1;23018:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23136;23155:5;23162:9;23173:14;23189:12;23203:2;23207:8;23136:18;:80::i;:::-;23109:107;;;;-1:-1:-1;22555:669:0;-1:-1:-1;;;;;;;;;;;;;22555:669:0:o;18561:738::-;18849:12;18863;18877:14;18830:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;18925:85:::1;18939:6;18947;18955:14;18971;18987:10;18999;18925:13;:85::i;:::-;18904:106:::0;;-1:-1:-1;18904:106:0;-1:-1:-1;19021:12:0::1;19036:49;19061:7;19070:6:::0;19078;19036:24:::1;:49::i;:::-;19021:64;;19096:66;19128:6;19136:10;19148:4;19154:7;19096:31;:66::i;:::-;19173;19205:6;19213:10;19225:4;19231:7;19173:31;:66::i;:::-;19277:4;-1:-1:-1::0;;;;;19262:25:0::1;;19288:2;19262:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19262:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19262:29:0;18561:738;;;;-1:-1:-1;19262:29:0;;-1:-1:-1;18561:738:0;;-1:-1:-1;;;;;;;;;18561:738:0:o;19305:974::-;19558:16;19576:14;19592;19539:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;19646:176:::1;19674:5;19694:4;19713:18;19746:9;19770:14;19799:12;19646:13;:176::i;:::-;19619:203:::0;;-1:-1:-1;19619:203:0;-1:-1:-1;19833:12:0::1;19848:46;19873:7;19882:5:::0;19889:4:::1;19848:24;:46::i;:::-;19833:61;;19905:69;19937:5;19944:10;19956:4;19962:11;19905:31;:69::i;:::-;19991:4;-1:-1:-1::0;;;;;19985:19:0::1;;20012:9;19985:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20048:4;-1:-1:-1::0;;;;;20042:20:0::1;;20063:4;20069:9;20042:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20042:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20042:37:0;20035:45:::1;;;;20118:4;-1:-1:-1::0;;;;;20103:25:0::1;;20129:2;20103:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20103:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20103:29:0;;-1:-1:-1;20183:9:0::1;:21:::0;-1:-1:-1;20179:92:0::1;;;20206:65;20237:10;20261:9;20249;:21;20206:30;:65::i;:::-;16861:1;19305:974:::0;;;;;;;;;;;:::o;29225:810::-;29438:21;29410:8;16806:15;16794:8;:27;;16786:64;;;;;-1:-1:-1;;;16786:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16786:64:0;;;;;;;;;;;;;;;29496:4:::1;-1:-1:-1::0;;;;;29485:15:0::1;:4;;29490:1;29485:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29485:7:0::1;-1:-1:-1::0;;;;;29485:15:0::1;;29477:57;;;::::0;;-1:-1:-1;;;29477:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;29477:57:0;;;;;;;;;;;;;::::1;;29555:55;29585:7;29594:9;29605:4;;29555:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29555:29:0::1;::::0;-1:-1:-1;;;29555:55:0:i:1;:::-;29545:65;;29643:9;29629:7;29637:1;29629:10;;;;;;;;;;;;;;:23;;29621:75;;;;-1:-1:-1::0;;;29621:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29713:4;-1:-1:-1::0;;;;;29707:19:0::1;;29734:7;29742:1;29734:10;;;;;;;;;;;;;;29707:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29771:4;-1:-1:-1::0;;;;;29765:20:0::1;;29786:51;29811:7;29820:4;;29825:1;29820:7;;;;;;29786:51;29839:7;29847:1;29839:10;;;;;;;;;;;;;;29765:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;29765:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;29765:85:0;29758:93:::1;;;;29862:24;29868:7;29877:4;;29862:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29883:2:0;;-1:-1:-1;29862:5:0::1;::::0;-1:-1:-1;;29862:24:0:i:1;:::-;29949:7;29957:1;29949:10;;;;;;;;;;;;;;29937:9;:22;29933:94;;;29961:66;29992:10;30016:7;30024:1;30016:10;;;;;;;;;;;;;;30004:9;:22;29961:30;:66::i;8417:361::-:0;8612:45;;;-1:-1:-1;;;;;8612:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8612:45:0;-1:-1:-1;;;8612:45:0;;;8601:57;;;;8566:12;;8580:17;;8601:10;;;;8612:45;8601:57;;;8612:45;8601:57;;8612:45;8601:57;;;;;;;;;;-1:-1:-1;;8601:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:93;;;;8677:7;:57;;;;-1:-1:-1;8689:11:0;;:16;;:44;;;8720:4;8709:24;;;;;;;;;;;;;;;-1:-1:-1;8709:24:0;8689:44;8669:101;;;;;-1:-1:-1;;;8669:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8417:361;;;;;:::o;9196:195::-;9304:12;;;9266;9304;;;;;;;;;-1:-1:-1;;;;;9283:7:0;;;9297:5;;9283:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9283:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9265:52;;;9336:7;9328:55;;;;-1:-1:-1;;;9328:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9196:195;;;:::o;5449:517::-;5542:14;5588:1;5577:8;:12;5569:68;;;;-1:-1:-1;;;5569:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5668:1;5656:9;:13;:31;;;;;5686:1;5673:10;:14;5656:31;5648:84;;;;-1:-1:-1;;;5648:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5743:20;5766:17;:8;5779:3;5766:12;:17::i;:::-;5743:40;-1:-1:-1;5794:14:0;5811:31;5743:40;5831:10;5811:19;:31::i;:::-;5794:48;-1:-1:-1;5853:16:0;5872:40;5896:15;5872:19;:9;5886:4;5872:13;:19::i;:::-;:23;;:40::i;:::-;5853:59;;5947:11;5935:9;:23;;;;;;;5449:517;-1:-1:-1;;;;;;;5449:517:0:o;6641:511::-;6742:21;6799:1;6784:4;:11;:16;;6776:59;;;;;-1:-1:-1;;;6776:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:4;:11;6856:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6856:23:0;;6846:33;;6903:8;6890:7;6898:1;6890:10;;;;;;;;;;;;;:21;;;;;6927:6;6922:223;6953:1;6939:4;:11;:15;6935:1;:19;6922:223;;;6977:14;6993:15;7012:42;7024:7;7033:4;7038:1;7033:7;;;;;;;;;;;;;;7042:4;7047:1;7051;7047:5;7042:11;;;;;;;;;;;;;;7012;:42::i;:::-;6976:78;;;;7086:47;7099:7;7107:1;7099:10;;;;;;;;;;;;;;7111:9;7122:10;7086:12;:47::i;:::-;7069:7;7077:1;7081;7077:5;7069:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6956:3:0;;6922:223;;;;6641:511;;;;;:::o;3966:478::-;4055:12;4081:14;4097;4115:26;4126:6;4134;4115:10;:26::i;:::-;4279:32;;;-1:-1:-1;;4279:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4269:43;;;;;;-1:-1:-1;;;;;;4182:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4172:262;;;;;;;;;3966:478;-1:-1:-1;;;;;3966:478:0:o;8786:402::-;9011:51;;;-1:-1:-1;;;;;9011:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9011:51:0;-1:-1:-1;;;9011:51:0;;;9000:63;;;;8965:12;;8979:17;;9000:10;;;;9011:51;9000:63;;;9011:51;9000:63;;9011:51;9000:63;;;;;;;;;;-1:-1:-1;;9000:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8964:99;;;;9082:7;:57;;;;-1:-1:-1;9094:11:0;;:16;;:44;;;9125:4;9114:24;;;;;;;;;;;;;;;-1:-1:-1;9114:24:0;9094:44;9074:106;;;;-1:-1:-1;;;9074:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8786:402;;;;;;:::o;24845:735::-;24952:6;24947:626;24978:1;24964:4;:11;:15;24960:1;:19;24947:626;;;25002:13;25017:14;25036:4;25041:1;25036:7;;;;;;;;;;;;;;25045:4;25050:1;25054;25050:5;25045:11;;;;;;;;;;;;;;25001:56;;;;25073:14;25092:42;25120:5;25127:6;25092:27;:42::i;:::-;25072:62;;;25149:14;25166:7;25174:1;25178;25174:5;25166:14;;;;;;;;;;;;;;25149:31;;25196:15;25213;25241:6;-1:-1:-1;;;;;25232:15:0;:5;-1:-1:-1;;;;;25232:15:0;;:61;;25274:9;25290:1;25232:61;;;25256:1;25260:9;25232:61;25195:98;;;;25308:10;25339:1;25325:4;:11;:15;25321:1;:19;:82;;25400:3;25321:82;;;25343:54;25368:7;25377:6;25385:4;25390:1;25394;25390:5;25385:11;;;;;;;;;;;;;;25343:24;:54::i;:::-;25308:95;;25433:48;25458:7;25467:5;25474:6;25433:24;:48::i;:::-;-1:-1:-1;;;;;25418:69:0;;25506:10;25518;25530:2;25544:1;25534:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25534:12:0;;25418:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25418:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24981:3:0;;;;;-1:-1:-1;24947:626:0;;-1:-1:-1;;;;;;;;24947:626:0;;;24845:735;;;:::o;7233:532::-;7334:21;7391:1;7376:4;:11;:16;;7368:59;;;;;-1:-1:-1;;;7368:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7459:4;:11;7448:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7448:23:0;;7438:33;;7512:9;7482:7;7507:1;7490:7;:14;:18;7482:27;;;;;;;;;;;;;;;;;:39;7546:11;;-1:-1:-1;;7546:15:0;7532:226;7563:5;;7532:226;;7591:14;7607:15;7626:42;7638:7;7647:4;7656:1;7652;:5;7647:11;;;;;;;;;;;;;;7660:4;7665:1;7660:7;;;;;;;7626:42;7590:78;;;;7700:46;7712:7;7720:1;7712:10;;;;;;;;;;;;;;7724:9;7735:10;7700:11;:46::i;:::-;7683:7;7695:1;7691;:5;7683:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7570:3:0;7532:226;;30182:1221;30295:6;30290:1106;30321:1;30307:4;:11;:15;30303:1;:19;30290:1106;;;30345:13;30360:14;30379:4;30384:1;30379:7;;;;;;;;;;;;;;30388:4;30393:1;30397;30393:5;30388:11;;;;;;;;;;;;;;30344:56;;;;30416:14;30435:42;30463:5;30470:6;30435:27;:42::i;:::-;30415:62;;;30492:19;30529:48;30554:7;30563:5;30570:6;30529:24;:48::i;:::-;30492:86;;30593:16;30624:17;30712:13;30727;30745:4;-1:-1:-1;;;;;30745:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30745:18:0;;;;;;;-1:-1:-1;;;;;30711:52:0;;;;-1:-1:-1;30711:52:0;;-1:-1:-1;30779:17:0;;-1:-1:-1;;;;;30820:15:0;;;;;;;:61;;30862:8;30872;30820:61;;;30839:8;30849;30820:61;30778:103;;;;30910:63;30960:12;30924:5;-1:-1:-1;;;;;30910:30:0;;30949:4;30910:45;;;;;;;;;;;;;-1:-1:-1;;;;;30910:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;30896:77;;31003:71;31033:11;31046:12;31060:13;31003:29;:71::i;:::-;30988:86;;30290:1106;;;;31105:15;31122;31150:6;-1:-1:-1;;;;;31141:15:0;:5;-1:-1:-1;;;;;31141:15:0;;:67;;31186:12;31205:1;31141:67;;;31165:1;31169:12;31141:67;31104:104;;;;31223:10;31254:1;31240:4;:11;:15;31236:1;:19;:82;;31315:3;31236:82;;;31258:54;31283:7;31292:6;31300:4;31305:1;31309;31305:5;31300:11;;;;;;;31258:54;31371:12;;;31381:1;31371:12;;;;;;;;;;-1:-1:-1;;;31333:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;31333:51:0;;;;;;;;;;;;;;;;;;;;;;31223:95;;-1:-1:-1;31333:9:0;;;;;;31343:10;;31355;;31223:95;;31371:12;;31333:51;;;;;;;;31371:12;;31333:51;;;;31371:12;;31333:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30324:3:0;;;;;-1:-1:-1;30290:1106:0;;-1:-1:-1;;;;;;;;;;30290:1106:0;2972:129;3056:5;;;3051:16;;;;3043:50;;;;;-1:-1:-1;;;3043:50:0;;;;;;;;;;;;-1:-1:-1;;;3043:50:0;;;;;;;;;;;;;;6087:472;6180:13;6226:1;6214:9;:13;6206:70;;;;-1:-1:-1;;;6206:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6307:1;6295:9;:13;:31;;;;;6325:1;6312:10;:14;6295:31;6287:84;;;;-1:-1:-1;;;6287:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6382:14;6399:34;6428:4;6399:24;:9;6413;6399:13;:24::i;:::-;:28;;:34::i;:::-;6382:51;-1:-1:-1;6444:16:0;6463:34;6493:3;6463:25;:10;6478:9;6463:14;:25::i;:34::-;6444:53;;6519:32;6549:1;6532:11;6520:9;:23;;;;;;;6519:29;:32::i;:::-;6508:43;6087:472;-1:-1:-1;;;;;;6087:472:0:o;5006:321::-;5088:12;5131:1;5121:7;:11;5113:61;;;;-1:-1:-1;;;5113:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5204:1;5193:8;:12;:28;;;;;5220:1;5209:8;:12;5193:28;5185:81;;;;-1:-1:-1;;;5185:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5311:8;5287:21;:7;5299:8;5287:11;:21::i;:::-;:32;;;;;;;5006:321;-1:-1:-1;;;;5006:321:0:o;3525:349::-;3600:14;3616;3661:6;-1:-1:-1;;;;;3651:16:0;:6;-1:-1:-1;;;;;3651:16:0;;;3643:66;;;;-1:-1:-1;;;3643:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3748:6;-1:-1:-1;;;;;3739:15:0;:6;-1:-1:-1;;;;;3739:15:0;;:53;;3777:6;3785;3739:53;;;3758:6;3766;3739:53;3720:72;;-1:-1:-1;3720:72:0;-1:-1:-1;;;;;;3811:20:0;;3803:63;;;;;-1:-1:-1;;;3803:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3525:349;;;;;:::o;17165:1390::-;17383:12;17397;17540:1;-1:-1:-1;;;;;17478:64:0;17496:7;-1:-1:-1;;;;;17478:34:0;;17513:6;17521;17478:50;;;;;;;;;;;;;-1:-1:-1;;;;;17478:50:0;;;;;;-1:-1:-1;;;;;17478:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17478:50:0;-1:-1:-1;;;;;17478:64:0;;17474:150;;;17577:7;-1:-1:-1;;;;;17559:37:0;;17597:6;17605;17559:53;;;;;;;;;;;;;-1:-1:-1;;;;;17559:53:0;;;;;;-1:-1:-1;;;;;17559:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17474:150:0;17635:13;17650;17667:53;17696:7;17705:6;17713;17667:28;:53::i;:::-;17634:86;;;;17735:8;17747:1;17735:13;:30;;;;-1:-1:-1;17752:13:0;;17735:30;17731:817;;;17804:14;;-1:-1:-1;17820:14:0;;-1:-1:-1;17731:817:0;;;17868:19;17890:58;17913:14;17929:8;17939;17890:22;:58::i;:::-;17868:80;;17985:14;17967;:32;17963:574;;18046:10;18028:14;:28;;18020:79;;;;-1:-1:-1;;;18020:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18140:14;;-1:-1:-1;18156:14:0;-1:-1:-1;18156:14:0;17963:574;;;18212:19;18234:58;18257:14;18273:8;18283;18234:22;:58::i;:::-;18212:80;;18336:14;18318;:32;;18311:40;;;;18396:10;18378:14;:28;;18370:79;;;;-1:-1:-1;;;18370:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18490:14;-1:-1:-1;18506:14:0;;-1:-1:-1;17963:574:0;17731:817;;17165:1390;;;;;;;;;;;:::o;3109:142::-;3161:6;3188;;;:30;;-1:-1:-1;;3203:5:0;;;3217:1;3212;3203:5;3212:1;3198:15;;;;;:20;3188:30;3180:63;;;;;-1:-1:-1;;;3180:63:0;;;;;;;;;;;;-1:-1:-1;;;3180:63:0;;;;;;;;;;;;;;2836:128;2920:5;;;2915:16;;;;2907:49;;;;;-1:-1:-1;;;2907:49:0;;;;;;;;;;;;-1:-1:-1;;;2907:49:0;;;;;;;;;;;;;;4502:391;4595:13;4610;4637:14;4656:26;4667:6;4675;4656:10;:26::i;:::-;4636:46;;;4694:13;4709;4742:32;4750:7;4759:6;4767;4742:7;:32::i;:::-;-1:-1:-1;;;;;4727:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4727:62:0;;;;;;;-1:-1:-1;;;;;4693:96:0;;;;-1:-1:-1;4693:96:0;;-1:-1:-1;;;;;;4823:16:0;;;;;;;:62;;4866:8;4876;4823:62;;;4843:8;4853;4823:62;4800:85;;;;-1:-1:-1;4502:391:0;-1:-1:-1;;;;;;;4502:391:0:o

Swarm Source

ipfs://1046181566cf8a35bd60f7e94b82dcde5a31b9e46aa697f15b739ad658b78711
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.