Contract 0x57de98135e8287f163c59ca4ff45f1341b680248 2

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x7163be456ceec516dc5006e9cd0f27f1ca26a9bb68f82cb0bd230d301efd3ea8Swap Exact Token...409239132023-03-30 3:22:035 hrs 49 mins ago0xecd06e35e1ebd6651088ee565fa6238010aa8136 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.032279495867 153.418927986
0xdb7a9a29f214893a6bb31f9d98752450092aee0c6866c2fade522302fe47bda1Swap Exact Token...409132762023-03-29 20:46:3412 hrs 25 mins ago0x3de597068f83be9ec4eb2978289360fb1c1a45d3 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.019027693794 87.930782715
0x1b04296bb7803bfe8542811dfb0061dcb32043a02856b40ca2b6a36839eb168fSwap Exact Token...409060852023-03-29 16:23:4616 hrs 47 mins ago0xd3238b95f82f17dd48d8c7194caed0848cc95b08 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.108849044551 472.19735095
0x7fb683a3682cadfde6cf1cc80a4fb2511be60946cb475337fdf2f69b95176a65Swap Exact Token...408970652023-03-29 10:46:5822 hrs 24 mins ago0xd5422dd53e26b137ca26d26b08484b4f8a7dc476 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.028461547138 110.734547762
0xcd3a3c6ffca9d2def0a9653f6c7952f4529f7ef729de96e5b98a5296a3870b71Swap Exact Token...408915682023-03-29 7:12:561 day 1 hr ago0x74133f5884f9543d74442e4e62f9070cedc0f363 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.035586238456 127.583538431
0x2b1171dc9b0467694f79d74eecf12ea04bbaf4bf6d81a34956168dc1094cd34eAdd Liquidity408843892023-03-29 2:43:441 day 6 hrs ago0x7481ff5e6af1d240f6fc3448a9f4887d70fc95ed IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.029610845186 122.605595504
0x35d3632b839d5645b8d97e512805601ccfd143ed97a74a39092100c379ec1f71Swap Exact Token...408843662023-03-29 2:42:541 day 6 hrs ago0x7481ff5e6af1d240f6fc3448a9f4887d70fc95ed IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.039515026154 123.270274632
0x2bb51fd5808b814c3ec556131685f77accbdf2a8e9c87d2ceb90c0c0a3ebf258Swap Exact Token...408769312023-03-28 21:58:471 day 11 hrs ago0xd6cda3a2d59746a43903c371bd64a9fb943a136e IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.029326314756 101.488833291
0x707f42f149cdd07a0bbc4d9244bb3cccead452761c135197ae81f28b29acbf50Swap Exact Token...408650522023-03-28 14:14:551 day 18 hrs ago0x0648c4fb61e6d6946288198c7a31f32839811ee9 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.068404639045 243.969438287
0x49a8687dd0a6c0227c89543feefa4b99d14dd686b4caebdf5c9bf3b9f944d54dSwap Exact Token...408631002023-03-28 13:01:241 day 20 hrs ago0x349e5545a85a2d549e78ec5697f347abe514d3be IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.071896455922 272.994797742
0x0dda6af0c2e5d23d2b53e1569711dc024479b67ff3fd55c605244bbb705db532Swap Exact Token...408518512023-03-28 5:58:562 days 3 hrs ago wanonn.hi  IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.03420971991141.900763686
0x804b10b1ffbcffc06505349804ea51437b13d3f4922e0741cf7cf6d9efbd830bSwap Exact Token...408350652023-03-27 19:01:442 days 14 hrs ago0x984572bbe56c9ee793c9b5520a270f23a3ee79e7 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.041637982269 167.720606261
0xe68cc0e6286b8067c5cda0023b4fe4d41c25bd0f7419854d370f8997345d964bRemove Liquidity...408338682023-03-27 18:14:222 days 14 hrs ago0x8d5f29d21650ed81e52bd6d002e211503d5990f3 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.061575748557 251.602754654
0x7757eb4648ec36ccc462142d149a6b3ea7a133c07046c2ce247980cd7c0cbdcbRemove Liquidity...408338352023-03-27 18:13:122 days 14 hrs ago0x8d5f29d21650ed81e52bd6d002e211503d5990f3 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.053483445011 243.749179706
0xc0c17e1908a32f1df0adf7de15b32655802cd7ff1e4b658240911837756121ffRemove Liquidity...408338202023-03-27 18:12:402 days 14 hrs ago0x8d5f29d21650ed81e52bd6d002e211503d5990f3 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.058164253401 246.176015683
0x0bc61bfe227d3a6961fab0e186c1cfad37832aea22553bdd1204becb1ae48c1aSwap Exact Token...408333962023-03-27 17:55:422 days 15 hrs ago0x984572bbe56c9ee793c9b5520a270f23a3ee79e7 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.027533025492 113.574312226
0x4156b86cf55acd6d22a8bf237c2be5318600b64dbae770bcb84cef618ffbca9bSwap Exact Token...408332442023-03-27 17:50:082 days 15 hrs ago0x984572bbe56c9ee793c9b5520a270f23a3ee79e7 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.003736651174 117.217239945
0x7658eb0bdf802067916eb54be4fb6e6970ae38361f4be7d0a88ff7fbf9d88c3fSwap Exact Token...408331942023-03-27 17:48:222 days 15 hrs ago0xc4daaf17f9881151eeb68b6dcfe8b40550c315b0 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.033579497545 136.652006453
0x8082199c3fc21780abed3a80c6f1cb264a99f9762ad52a63a192cf7b46ef291eSwap Exact Token...408314892023-03-27 16:42:192 days 16 hrs ago0x0648c4fb61e6d6946288198c7a31f32839811ee9 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.040878553453 141.467372598
0x12bdc44b0a2d703827ddc1b716d8fd7ee5058abe721662b3441bb398b67ac1b9Swap Exact Token...408314012023-03-27 16:39:112 days 16 hrs ago0x0648c4fb61e6d6946288198c7a31f32839811ee9 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.032813076869 143.975099031
0xfa4ecf4496f7d214b9435c61d9cb48238d8be197e20d6a7ff6a423e5c1819003Swap Exact Token...408176662023-03-27 8:07:363 days 1 hr ago0x65b1343e455a35f6707815149239db788928b7ab IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.056500828441 237.105543746
0x4ab0469071e5c6426b34616c8de0ce4871ed69d818da4d98e73973e52d967c0fSwap Exact Token...408176502023-03-27 8:07:023 days 1 hr ago0x5a0344f8f7ca62a221d35cffcc3826eb316125e4 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.059574625424 250.004722842
0x8e513fea4fbb9acc9e7d11ce02025a9d6004e19601581a83c634a7b7e7566b07Swap Exact Token...408176322023-03-27 8:06:243 days 1 hr ago0x9ebf0c05ffa81b0bdd4c0d9bb261d3717ef02ae5 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.06668721537 279.852683535
0xefc4a7a8a83167752c46c8738ba86e7e612be41e72a7b6a4163c140c8f0f1020Swap Exact Token...408176082023-03-27 8:05:003 days 1 hr ago0x2317ea6a7df4e325df594f081d4db94b89b3d353 IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.0402709258 186.100011091
0x0ef40ea8bc03ac7c96ef93f53c2ffac6466050ff5a59d0d290b9c37b8dfc358fSwap Exact Token...408174112023-03-27 7:57:303 days 1 hr ago0x8f757a77e5fa08d2c0fae6049b285cf2852ee11f IN  0x57de98135e8287f163c59ca4ff45f1341b6802480 MATIC0.054282881752 245.408472892
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2bb51fd5808b814c3ec556131685f77accbdf2a8e9c87d2ceb90c0c0a3ebf258408769312023-03-28 21:58:471 day 11 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480xd6cda3a2d59746a43903c371bd64a9fb943a136e13.635035534610770073 MATIC
0x2bb51fd5808b814c3ec556131685f77accbdf2a8e9c87d2ceb90c0c0a3ebf258408769312023-03-28 21:58:471 day 11 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b68024813.635035534610770073 MATIC
0x707f42f149cdd07a0bbc4d9244bb3cccead452761c135197ae81f28b29acbf50408650522023-03-28 14:14:551 day 18 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x0648c4fb61e6d6946288198c7a31f32839811ee966.044643374517017021 MATIC
0x707f42f149cdd07a0bbc4d9244bb3cccead452761c135197ae81f28b29acbf50408650522023-03-28 14:14:551 day 18 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b68024866.044643374517017021 MATIC
0x8082199c3fc21780abed3a80c6f1cb264a99f9762ad52a63a192cf7b46ef291e408314892023-03-27 16:42:192 days 16 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x0648c4fb61e6d6946288198c7a31f32839811ee940.872003452053005087 MATIC
0x8082199c3fc21780abed3a80c6f1cb264a99f9762ad52a63a192cf7b46ef291e408314892023-03-27 16:42:192 days 16 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b68024840.872003452053005087 MATIC
0x12bdc44b0a2d703827ddc1b716d8fd7ee5058abe721662b3441bb398b67ac1b9408314012023-03-27 16:39:112 days 16 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x0648c4fb61e6d6946288198c7a31f32839811ee91.152764115250859704 MATIC
0x12bdc44b0a2d703827ddc1b716d8fd7ee5058abe721662b3441bb398b67ac1b9408314012023-03-27 16:39:112 days 16 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b6802481.152764115250859704 MATIC
0x1a91d7e3892d5cb998a0cef34c7f8bd01a0459c3b6d43f23828d1bd8e782d702407356322023-03-25 2:48:535 days 6 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token419.324298966291819685 MATIC
0x85dd5373970ae463e21fc2c3c36ab46deac77e426f497f3493e6613071a11539407097252023-03-24 10:05:295 days 23 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x2a7f7e2617df618adb65022fb4251a24ccda05ca936.086744495853258331 MATIC
0x85dd5373970ae463e21fc2c3c36ab46deac77e426f497f3493e6613071a11539407097252023-03-24 10:05:295 days 23 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b680248936.086744495853258331 MATIC
0x90b48baee1585b37f404818b1ed216f684b2cd581194ee37181f14876568c0d4407096752023-03-24 10:03:435 days 23 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x2a7f7e2617df618adb65022fb4251a24ccda05ca1,305.260681529009494554 MATIC
0x90b48baee1585b37f404818b1ed216f684b2cd581194ee37181f14876568c0d4407096752023-03-24 10:03:435 days 23 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b6802481,305.260681529009494554 MATIC
0xd5243c80299cb1924c11eecd1b7d71a8460b261fdeb17a3493f01ffae26f8522407037882023-03-24 6:31:516 days 2 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x68a9d0d3a90802a03e26c7cf3672b35962bf05400.024620250682645157 MATIC
0xd5243c80299cb1924c11eecd1b7d71a8460b261fdeb17a3493f01ffae26f8522407037882023-03-24 6:31:516 days 2 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token4.924050136529031557 MATIC
0xeb27b51cc3021fd4f530e378ed154900c5894ab61aedeef33ed9deed5b65dc54406646832023-03-23 6:13:197 days 2 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token0.1 MATIC
0xd2726aba47ccb851ee67a9bdb8a3ccf666d35982c71781f65c342c601c4ead0b406480682023-03-22 19:53:467 days 13 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token220 MATIC
0xa24f9af7c484f9b81f28d39e0da0202caac5cdbcbad866cb84139b5aa1fb22d8406431722023-03-22 16:50:527 days 16 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b6802480x80e208a172cd65419f5b13c106ec1bf8e8e874dc154.878614342178742709 MATIC
0xa24f9af7c484f9b81f28d39e0da0202caac5cdbcbad866cb84139b5aa1fb22d8406431722023-03-22 16:50:527 days 16 hrs ago Polygon: WMATIC Token 0x57de98135e8287f163c59ca4ff45f1341b680248154.878614342178742709 MATIC
0x16240c7bac46dde3c46125de9cb27f37978ccf78159cd918b941b5ebd8feeb74406237772023-03-22 3:59:148 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
0xc43ba126072fb3c341339ef38b21091f3f4ce259073f8cd4629886676749a7f2406235112023-03-22 3:49:168 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
0x42087ec8be870e02440fec104c1814de9b0959f1e2a70df9b93bfbde2d7c80c7406234932023-03-22 3:48:388 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
0x118fed95db88b2428762cda2f2e95b37e60479b97da6282f70a4173b7a48aaf8406234792023-03-22 3:48:088 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
0x66479a0b23c6aac5c3839e2c7f4e9de133cdcf4150b6e26b5c615b4882b1ff59406234312023-03-22 3:46:108 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
0x580a49085fd307953898d82f58e6643d96a318bf6fe19c4815dea040345e2bba406234072023-03-22 3:45:028 days 5 hrs ago 0x57de98135e8287f163c59ca4ff45f1341b680248 Polygon: WMATIC Token10 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-08-19
*/

// Sources flattened with hardhat v2.4.1 https://hardhat.org

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

// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

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 HOLDING_ADDRESS() external view returns (address);

    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 destroy(uint value) external returns(bool);

    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;

    function handleEarnings() external returns(uint amount);
}


// File contracts/DeFi/uniswapv2/libraries/SafeMath.sol


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


library UniswapV2Library {
    using SafeMathUniswap for uint;

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

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'59f0dd0ec2453a509915048cac1608e1a52938dbcdf6b4960b21592e7996743a' // 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/DeFi/uniswapv2/libraries/TransferHelper.sol


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


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


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

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


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


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

    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);
    function weth() external view returns (address);
    function wbtc() external view returns (address);
    function gfi() external view returns (address);
    function earningsManager() external view returns (address);
    function feeManager() external view returns (address);
    function dustPan() external view returns (address);
    function governor() external view returns (address);
    function priceOracle() external view returns (address);
    function pathOracle() external view returns (address);
    function router() external view returns (address);
    function paused() external view returns (bool);
    function slippage() external view returns (uint);


    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 setFeeToSetter(address) external;
    function setMigrator(address) external;
}


// File contracts/DeFi/uniswapv2/interfaces/IERC20.sol


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


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


// File contracts/DeFi/uniswapv2/UniswapV2Router02.sol









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, 'Gravity Finance Router: 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, 'Gravity Finance Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'Gravity Finance Router: 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, 'Gravity Finance Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'Gravity Finance Router: 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, 'Gravity Finance Router: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }
    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, 'Gravity Finance Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }
    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, 'Gravity Finance Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Gravity Finance Router: 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);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }
    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, 'Gravity Finance Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'Gravity Finance Router: 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]);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }
    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, 'Gravity Finance Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'Gravity Finance Router: 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]);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }
    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, 'Gravity Finance Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'Gravity Finance Router: 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]);
        amounts[amounts.length - 1] = amounts[amounts.length - 1] * 9995/10000; //Added this line to account for the 0.05% gov fee not being subtracted from the final output amount
    }

    // **** 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,
            'Gravity Finance Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'Gravity Finance Router: 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,
            'Gravity Finance Router: 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, 'Gravity Finance Router: 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, 'Gravity Finance Router: 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 Security Audit

Contract ABI

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

60c060405234801561001057600080fd5b5060405162004780380380620047808339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6145fb620001856000398061015f5280610ce45280610d1f5280610e16528061103052806113fd528061155f528061190e52806119e55280611abf5280611b8d5280611ccf5280611d575280611fd65280612051528061210552806121dc528061226d52806122e152806127c45280612a2e5280612a845280612ab85280612b2c5280612cba5280612df95280612e81525080610ea05280610f775280611139528061117252806112ad5280611487528061153d52806116ad5280611c1c5280611d895280611f26528061231352806125515280612749528061277252806127a2528061290f5280612a625280612d495280612eb35280613739528061377c5280613a565280613bcc5280613fbd5280614076528061412952506145fb6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611132945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611168565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611262565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b0381351690602001356113ad565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611535565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611643565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b0381351690602001356118c0565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b45565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611ece565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611edb565b34801561088157600080fd5b5061088a611fd4565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611ff8565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612005565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b038135169060200135612196565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612503565b348015610a1c57600080fd5b5061088a612747565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061276b945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612798565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128ac565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356129df565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c72565b6000808242811015610cde576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612503565b9093509150610d1d898685612fe7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da58583613151565b50965096945050505050565b6000610dbe848484613249565b949350505050565b60608142811015610e0c576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9b5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b610ef97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061332192505050565b91508682600184510381518110610f0c57fe5b60200260200101511015610f515760405162461bcd60e51b81526004018080602001828103825260328152602001806145186032913960400191505060405180910390fd5b610fef86866000818110610f6157fe5b905060200201356001600160a01b031633610fd57f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa357fe5b905060200201356001600160a01b03168b8b6001818110610fc057fe5b905060200201356001600160a01b031661346d565b85600081518110610fe257fe5b602002602001015161352d565b61102e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061368a915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061106d57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050506110e484836001855103815181106110d757fe5b6020026020010151613151565b612710826001845103815181106110f757fe5b602002602001015161270b028161110a57fe5b048260018451038151811061111b57fe5b602002602001018181525050509695505050505050565b606061115f7f000000000000000000000000000000000000000000000000000000000000000084846138c7565b90505b92915050565b60008060006111987f00000000000000000000000000000000000000000000000000000000000000008f8f61346d565b90506000876111a7578c6111ab565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561122157600080fd5b505af1158015611235573d6000803e3d6000fd5b505050506112488f8f8f8f8f8f8f612503565b809450819550505050509b509b9950505050505050505050565b606081428110156112a8576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6113067f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061332192505050565b9150868260018451038151811061131957fe5b6020026020010151101561135e5760405162461bcd60e51b81526004018080602001828103825260328152602001806145186032913960400191505060405180910390fd5b61136e86866000818110610f6157fe5b6110e48287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061368a915050565b606081428110156113f3576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061142d57fe5b905060200201356001600160a01b03166001600160a01b0316146114825760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b6114e07f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c792505050565b915086826000815181106114f057fe5b60200260200101511115610f515760405162461bcd60e51b815260040180806020018281038252602e81526020018061447e602e913960400191505060405180910390fd5b6000806115837f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061346d565b9050600086611592578b611596565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561160c57600080fd5b505af1158015611620573d6000803e3d6000fd5b505050506116328d8d8d8d8d8d612005565b9d9c50505050505050505050505050565b8042811015611687576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6116fc8585600081811061169757fe5b905060200201356001600160a01b0316336116f67f0000000000000000000000000000000000000000000000000000000000000000898960008181106116d957fe5b905060200201356001600160a01b03168a8a6001818110610fc057fe5b8a61352d565b60008585600019810181811061170e57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561176a57600080fd5b505afa15801561177e573d6000803e3d6000fd5b505050506040513d602081101561179457600080fd5b505160408051602088810282810182019093528882529293506117d69290918991899182918501908490808284376000920191909152508892506139ff915050565b8661187982888860001981018181106117eb57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561184757600080fd5b505afa15801561185b573d6000803e3d6000fd5b505050506040513d602081101561187157600080fd5b505190613d01565b10156118b65760405162461bcd60e51b81526004018080602001828103825260328152602001806145186032913960400191505060405180910390fd5b5050505050505050565b8042811015611904576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061193e57fe5b905060200201356001600160a01b03166001600160a01b0316146119935760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b6119a38585600081811061169757fe5b6119e18585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139ff915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6020811015611a7a57600080fd5b5051905086811015611abd5760405162461bcd60e51b81526004018080602001828103825260328152602001806145186032913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b2357600080fd5b505af1158015611b37573d6000803e3d6000fd5b505050506118b68482613151565b60608142811015611b8b576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611bc257fe5b905060200201356001600160a01b03166001600160a01b031614611c175760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b611c757f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061332192505050565b91508682600184510381518110611c8857fe5b60200260200101511015611ccd5760405162461bcd60e51b81526004018080602001828103825260328152602001806145186032913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d0957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3c57600080fd5b505af1158015611d50573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611db57f0000000000000000000000000000000000000000000000000000000000000000898960008181106116d957fe5b84600081518110611dc257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b505050506040513d6020811015611e3a57600080fd5b5051611e4257fe5b611e818287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061368a915050565b61271082600184510381518110611e9457fe5b602002602001015161270b0281611ea757fe5b0482600184510381518110611eb857fe5b6020026020010181815250505095945050505050565b6000610dbe848484613d51565b60608142811015611f21576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b611f7f7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c792505050565b91508682600081518110611f8f57fe5b6020026020010151111561135e5760405162461bcd60e51b815260040180806020018281038252602e81526020018061447e602e913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e29565b6000814281101561204b576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b61207a887f00000000000000000000000000000000000000000000000000000000000000008989893089612503565b90508092505061210388858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156120d257600080fd5b505afa1580156120e6573d6000803e3d6000fd5b505050506040513d60208110156120fc57600080fd5b5051612fe7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561216957600080fd5b505af115801561217d573d6000803e3d6000fd5b5050505061218b8483613151565b509695505050505050565b80428110156121da576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061221157fe5b905060200201356001600160a01b03166001600160a01b0316146122665760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122c657600080fd5b505af11580156122da573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61233f7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116d957fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561238657600080fd5b505af115801561239a573d6000803e3d6000fd5b505050506040513d60208110156123b057600080fd5b50516123b857fe5b6000868660001981018181106123ca57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561242657600080fd5b505afa15801561243a573d6000803e3d6000fd5b505050506040513d602081101561245057600080fd5b505160408051602089810282810182019093528982529293506124929290918a918a9182918501908490808284376000920191909152508992506139ff915050565b8761187982898960001981018181106124a757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561184757600080fd5b600080824281101561254a576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b60006125777f00000000000000000000000000000000000000000000000000000000000000008c8c61346d565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156125d257600080fd5b505af11580156125e6573d6000803e3d6000fd5b505050506040513d60208110156125fc57600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561264957600080fd5b505af115801561265d573d6000803e3d6000fd5b505050506040513d604081101561267357600080fd5b5080516020909101519092509050600061268d8e8e613ecf565b509050806001600160a01b03168e6001600160a01b0316146126b05781836126b3565b82825b90975095508a8710156126f75760405162461bcd60e51b815260040180806020018281038252602d81526020018061456e602d913960400191505060405180910390fd5b898610156127365760405162461bcd60e51b815260040180806020018281038252602d815260200180614451602d913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061115f7f00000000000000000000000000000000000000000000000000000000000000008484613321565b60008060006127e87f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061346d565b90506000876127f7578c6127fb565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561287157600080fd5b505af1158015612885573d6000803e3d6000fd5b505050506128978e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128f5576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b6129038c8c8c8c8c8c613fad565b909450925060006129357f00000000000000000000000000000000000000000000000000000000000000008e8e61346d565b90506129438d33838861352d565b61294f8c33838761352d565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561299e57600080fd5b505af11580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a28576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b612a568a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fad565b90945092506000612aa87f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061346d565b9050612ab68b33838861352d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b1157600080fd5b505af1158015612b25573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ba157600080fd5b505af1158015612bb5573d6000803e3d6000fd5b505050506040513d6020811015612bcb57600080fd5b5051612bd357fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612c2257600080fd5b505af1158015612c36573d6000803e3d6000fd5b505050506040513d6020811015612c4c57600080fd5b5051925034841015612c6457612c6433853403613151565b505096509650969350505050565b60608142811015612cb8576040805162461bcd60e51b815260206004820152601f60248201526000805160206143e4833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cef57fe5b905060200201356001600160a01b03166001600160a01b031614612d445760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612da27f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c792505050565b91503482600081518110612db257fe5b60200260200101511115612df75760405162461bcd60e51b815260040180806020018281038252602e81526020018061447e602e913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e3357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e6657600080fd5b505af1158015612e7a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612edf7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116d957fe5b84600081518110612eec57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f3a57600080fd5b505af1158015612f4e573d6000803e3d6000fd5b505050506040513d6020811015612f6457600080fd5b5051612f6c57fe5b612fab8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061368a915050565b81600081518110612fb857fe5b6020026020010151341115611e8157611e813383600081518110612fd857fe5b60200260200101513403613151565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130645780518252601f199092019160209182019101613045565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130c6576040519150601f19603f3d011682016040523d82523d6000602084013e6130cb565b606091505b50915091508180156130f95750805115806130f957508080602001905160208110156130f657600080fd5b50515b61314a576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061319d5780518252601f19909201916020918201910161317e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131ff576040519150601f19603f3d011682016040523d82523d6000602084013e613204565b606091505b50509050806132445760405162461bcd60e51b81526004018080602001828103825260238152602001806144f56023913960400191505060405180910390fd5b505050565b60008084116132895760405162461bcd60e51b815260040180806020018281038252602b81526020018061459b602b913960400191505060405180910390fd5b6000831180156132995750600082115b6132d45760405162461bcd60e51b81526004018080602001828103825260288152602001806144296028913960400191505060405180910390fd5b60006132e2856103e561423e565b905060006132f0828561423e565b9050600061330a83613304886103e861423e565b906142a1565b905080828161331557fe5b04979650505050505050565b606060028251101561337a576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561339257600080fd5b506040519080825280602002602001820160405280156133bc578160200160208202803683370190505b50905082816000815181106133cd57fe5b60200260200101818152505060005b60018351038110156134655760008061341f878685815181106133fb57fe5b602002602001015187866001018151811061341257fe5b60200260200101516142f0565b9150915061344184848151811061343257fe5b60200260200101518383613249565b84846001018151811061345057fe5b602090810291909101015250506001016133dc565b509392505050565b600080600061347c8585613ecf565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f59f0dd0ec2453a509915048cac1608e1a52938dbcdf6b4960b21592e7996743a609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135b25780518252601f199092019160209182019101613593565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613614576040519150601f19603f3d011682016040523d82523d6000602084013e613619565b606091505b5091509150818015613647575080511580613647575080806020019051602081101561364457600080fd5b50515b6136825760405162461bcd60e51b815260040180806020018281038252602481526020018061454a6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138c1576000808483815181106136a857fe5b60200260200101518584600101815181106136bf57fe5b60200260200101519150915060006136d78383613ecf565b50905060008785600101815181106136eb57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137195782600061371d565b6000835b91509150600060028a510388106137345788613775565b6137757f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061376857fe5b602002602001015161346d565b90506137a27f0000000000000000000000000000000000000000000000000000000000000000888861346d565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137df576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561384757818101518382015260200161382f565b50505050905090810190601f1680156138745780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561389657600080fd5b505af11580156138aa573d6000803e3d6000fd5b50506001909901985061368d975050505050505050565b50505050565b6060600282511015613920576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561393857600080fd5b50604051908082528060200260200182016040528015613962578160200160208202803683370190505b509050828160018351038151811061397657fe5b60209081029190910101528151600019015b8015613465576000806139b8878660018603815181106139a457fe5b602002602001015187868151811061341257fe5b915091506139da8484815181106139cb57fe5b60200260200101518383613d51565b8460018503815181106139e957fe5b6020908102919091010152505060001901613988565b60005b600183510381101561324457600080848381518110613a1d57fe5b6020026020010151858460010181518110613a3457fe5b6020026020010151915091506000613a4c8383613ecf565b5090506000613a7c7f0000000000000000000000000000000000000000000000000000000000000000858561346d565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613abd57600080fd5b505afa158015613ad1573d6000803e3d6000fd5b505050506040513d6060811015613ae757600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b1d578284613b20565b83835b91509150613b75828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561184757600080fd5b9550613b82868383613249565b945050505050600080856001600160a01b0316886001600160a01b031614613bac57826000613bb0565b6000835b91509150600060028c51038a10613bc7578a613bfb565b613bfb7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061376857fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c85578181015183820152602001613c6d565b50505050905090810190601f168015613cb25780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cd457600080fd5b505af1158015613ce8573d6000803e3d6000fd5b50506001909b019a50613a029950505050505050505050565b80820382811115611162576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d915760405162461bcd60e51b815260040180806020018281038252602c8152602001806143b8602c913960400191505060405180910390fd5b600083118015613da15750600082115b613ddc5760405162461bcd60e51b81526004018080602001828103825260288152602001806144296028913960400191505060405180910390fd5b6000613df46103e8613dee868861423e565b9061423e565b90506000613e086103e5613dee8689613d01565b9050613e1f6001828481613e1857fe5b04906142a1565b9695505050505050565b6000808411613e695760405162461bcd60e51b81526004018080602001828103825260258152602001806144ac6025913960400191505060405180910390fd5b600083118015613e795750600082115b613eb45760405162461bcd60e51b81526004018080602001828103825260288152602001806144296028913960400191505060405180910390fd5b82613ebf858461423e565b81613ec657fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f235760405162461bcd60e51b81526004018080602001828103825260258152602001806144046025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f43578284613f46565b83835b90925090506001600160a01b038216613fa6576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561403957600080fd5b505afa15801561404d573d6000803e3d6000fd5b505050506040513d602081101561406357600080fd5b50516001600160a01b03161415614121577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b1580156140f457600080fd5b505af1158015614108573d6000803e3d6000fd5b505050506040513d602081101561411e57600080fd5b50505b60008061414f7f00000000000000000000000000000000000000000000000000000000000000008b8b6142f0565b91509150816000148015614161575080155b1561417157879350869250614231565b600061417e898484613e29565b90508781116141d157858110156141c65760405162461bcd60e51b815260040180806020018281038252602d815260200180614451602d913960400191505060405180910390fd5b88945092508261422f565b60006141de898486613e29565b9050898111156141ea57fe5b878110156142295760405162461bcd60e51b815260040180806020018281038252602d81526020018061456e602d913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806142595750508082028282828161425657fe5b04145b611162576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611162576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006142ff8585613ecf565b50905060008061431088888861346d565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561434857600080fd5b505afa15801561435c573d6000803e3d6000fd5b505050506040513d606081101561437257600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143a55780826143a8565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54477261766974792046696e616e636520526f757465723a204558504952454400556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459477261766974792046696e616e636520526f757465723a20494e53554646494349454e545f425f414d4f554e54477261766974792046696e616e636520526f757465723a204558434553534956455f494e5055545f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54477261766974792046696e616e636520526f757465723a20494e56414c49445f504154485472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544477261766974792046696e616e636520526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544477261766974792046696e616e636520526f757465723a20494e53554646494349454e545f415f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220b320048d8fc7bbfffc0013501deac9c69749e27e0c3053f671801b1c7de20fd764736f6c634300060c00330000000000000000000000003ed75aff4094d2aaa38fafca64ef1c152ec1cf200000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

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

0000000000000000000000003ed75aff4094d2aaa38fafca64ef1c152ec1cf200000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _factory (address): 0x3ed75aff4094d2aaa38fafca64ef1c152ec1cf20
Arg [1] : _WETH (address): 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ed75aff4094d2aaa38fafca64ef1c152ec1cf20
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Deployed ByteCode Sourcemap

17131:19837:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17627:10;-1:-1:-1;;;;;17641:4:0;17627:18;;17620:26;;;;17131:19837;;;;;21805:673;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21805:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35912:262;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35912:262:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29751:1046;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29751:1046:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29751:1046:0;;;;;;;;;;;;-1:-1:-1;29751:1046:0;-1:-1:-1;;;;;;29751:1046:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36712:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36712:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36712:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36712:253:0;;-1:-1:-1;36712:253:0;;-1:-1:-1;;;;;36712:253:0:i;22484:677::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22484:677:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26198:817::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26198:817:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26198:817:0;;;;;;;;;;;;-1:-1:-1;26198:817:0;-1:-1:-1;;;;;;26198:817:0;;;;;;;;:::i;28721:1024::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28721:1024:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28721:1024:0;;;;;;;;;;;;-1:-1:-1;28721:1024:0;-1:-1:-1;;;;;;28721:1024:0;;;;;;;;:::i;24628:718::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24628:718:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33183:735::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33183:735:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33183:735:0;;;;;;;;;;;;-1:-1:-1;33183:735:0;-1:-1:-1;;;;;;33183:735:0;;;;;;;;:::i;34808:864::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34808:864:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34808:864:0;;;;;;;;;;;;-1:-1:-1;34808:864:0;-1:-1:-1;;;;;;34808:864:0;;;;;;;;:::i;27822:893::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27822:893:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27822:893:0;;;;;;;;;;;;-1:-1:-1;27822:893:0;-1:-1:-1;;;;;;27822:893:0;;;;;;;;:::i;36182:261::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36182:261:0;;;;;;;;;;;;:::i;27021:795::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27021:795:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27021:795:0;;;;;;;;;;;;-1:-1:-1;27021:795:0;-1:-1:-1;;;;;;27021:795:0;;;;;;;;:::i;17274:38::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;17274:38:0;;;;;;;;;;;;;;35716:188;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35716:188:0;;;;;;;;;;;;:::i;23915:707::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23915:707:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33924:878::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33924:878:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33924:878:0;;;;;;;;;;;;-1:-1:-1;33924:878:0;-1:-1:-1;;;;;;33924:878:0;;;;;;;;:::i;20920:879::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20920:879:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17226:41::-;;;;;;;;;;;;;:::i;36451:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36451:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36451:253:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36451:253:0;;-1:-1:-1;36451:253:0;;-1:-1:-1;;;;;36451:253:0:i;23167:669::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23167:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19159:738::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19159:738:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19903:974;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19903:974:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30803:1006::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30803:1006:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30803:1006:0;;;;;;;;;;;;-1:-1:-1;30803:1006:0;-1:-1:-1;;;;;;30803:1006:0;;;;;;;;:::i;21805:673::-;22042:16;22060:14;22023:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;22114:196:::1;22144:5;22164:4;22183:9;22207:14;22236:12;22271:4;22291:8;22114:15;:196::i;:::-;22087:223:::0;;-1:-1:-1;22087:223:0;-1:-1:-1;22321:51:0::1;22349:5:::0;22356:2;22087:223;22321:27:::1;:51::i;:::-;22389:4;-1:-1:-1::0;;;;;22383:20:0::1;;22404:9;22383:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22425:45;22456:2;22460:9;22425:30;:45::i;:::-;21805:673:::0;;;;;;;;;;:::o;35912:262::-;36065:14;36104:62;36134:8;36144:9;36155:10;36104:29;:62::i;:::-;36097:69;35912:262;-1:-1:-1;;;;35912:262:0:o;29751:1046::-;29965:21;29937:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30037:4:0::1;30012:29;:4:::0;;-1:-1:-1;;30017:15:0;;30012:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;30012:21:0::1;-1:-1:-1::0;;;;;30012:29:0::1;;30004:78;;;;-1:-1:-1::0;;;30004:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30103:55;30134:7;30143:8;30153:4;;30103:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30103:30:0::1;::::0;-1:-1:-1;;;30103:55:0:i:1;:::-;30093:65;;30208:12;30177:7;30202:1;30185:7;:14;:18;30177:27;;;;;;;;;;;;;;:43;;30169:106;;;;-1:-1:-1::0;;;30169:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30286:141;30332:4;;30337:1;30332:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30332:7:0::1;30341:10;30353:51;30378:7;30387:4;;30392:1;30387:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30387:7:0::1;30396:4;;30401:1;30396:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;30396:7:0::1;30353:24;:51::i;:::-;30406:7;30414:1;30406:10;;;;;;;;;;;;;;30286:31;:141::i;:::-;30438:35;30444:7;30453:4;;30438:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30467:4:0::1;::::0;-1:-1:-1;30438:5:0::1;::::0;-1:-1:-1;;30438:35:0:i:1;:::-;30490:4;-1:-1:-1::0;;;;;30484:20:0::1;;30505:7;30530:1;30513:7;:14;:18;30505:27;;;;;;;;;;;;;;30484:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30544:63;30575:2;30579:7;30604:1;30587:7;:14;:18;30579:27;;;;;;;;;;;;;;30544:30;:63::i;:::-;30683:5;30648:7;30673:1;30656:7;:14;:18;30648:27;;;;;;;;;;;;;;30678:4;30648:34;:40;;;;;;30618:7;30643:1;30626:7;:14;:18;30618:27;;;;;;;;;;;;;:70;;;::::0;::::1;29751:1046:::0;;;;;;;;;:::o;36712:253::-;36856:21;36902:55;36932:7;36941:9;36952:4;36902:29;:55::i;:::-;36895:62;;36712:253;;;;;:::o;22484:677::-;22790:12;22804;22829;22844:49;22869:7;22878:6;22886;22844:24;:49::i;:::-;22829:64;;22904:10;22917;:33;;22941:9;22917:33;;;-1:-1:-1;;22917:33:0;22961:80;;;-1:-1:-1;;;22961:80:0;;22989:10;22961:80;;;;23009:4;22961:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22904:46;;-1:-1:-1;;;;;;22961:27:0;;;;;:80;;;;;-1:-1:-1;;22961:80:0;;;;;;;;-1:-1:-1;22961:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23073;23089:6;23097;23105:9;23116:10;23128;23140:2;23144:8;23073:15;:80::i;:::-;23052:101;;;;;;;;22484:677;;;;;;;;;;;;;;;;:::o;26198:817::-;26422:21;26403:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;26466:55:::1;26497:7;26506:8;26516:4;;26466:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26466:30:0::1;::::0;-1:-1:-1;;;26466:55:0:i:1;:::-;26456:65;;26571:12;26540:7;26565:1;26548:7;:14;:18;26540:27;;;;;;;;;;;;;;:43;;26532:106;;;;-1:-1:-1::0;;;26532:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26649:141;26695:4;;26700:1;26695:7;;;;;;26649:141;26801:24;26807:7;26816:4;;26801:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26822:2:0;;-1:-1:-1;26801:5:0::1;::::0;-1:-1:-1;;26801:24:0:i:1;28721:1024::-:0;28935:21;28907:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29007:4:0::1;28982:29;:4:::0;;-1:-1:-1;;28987:15:0;;28982:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28982:21:0::1;-1:-1:-1::0;;;;;28982:29:0::1;;28974:78;;;;-1:-1:-1::0;;;28974:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29073:55;29103:7;29112:9;29123:4;;29073:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29073:29:0::1;::::0;-1:-1:-1;;;29073:55:0:i:1;:::-;29063:65;;29161:11;29147:7;29155:1;29147:10;;;;;;;;;;;;;;:25;;29139:84;;;;-1:-1:-1::0;;;29139:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24628:718:::0;24946:14;24973:12;24988:46;25013:7;25022:5;25029:4;24988:24;:46::i;:::-;24973:61;;25045:10;25058;:33;;25082:9;25058:33;;;-1:-1:-1;;25058:33:0;25102:80;;;-1:-1:-1;;;25102:80:0;;25130:10;25102:80;;;;25150:4;25102:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25045:46;;-1:-1:-1;;;;;;25102:27:0;;;;;:80;;;;;-1:-1:-1;;25102:80:0;;;;;;;;-1:-1:-1;25102:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25205:133;25267:5;25274:9;25285:14;25301:12;25315:2;25319:8;25205:47;:133::i;:::-;25193:145;24628:718;-1:-1:-1;;;;;;;;;;;;;24628:718:0:o;33183:735::-;33417:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;33438:139:::1;33484:4;;33489:1;33484:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33484:7:0::1;33493:10;33505:51;33530:7;33539:4;;33544:1;33539:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;33539:7:0::1;33548:4;;33553:1;33548:7;;;;;;33505:51;33558:8;33438:31;:139::i;:::-;33588:18;33623:4:::0;;-1:-1:-1;;33628:15:0;;33623:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33623:21:0::1;-1:-1:-1::0;;;;;33609:46:0::1;;33656:2;33609:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;33609:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33609:50:0;33670:44:::1;::::0;;33609:50:::1;33670:44:::0;;::::1;::::0;;;;;;;;;;;33609:50;;-1:-1:-1;33670:44:0::1;::::0;;;33705:4;;;;;;33670:44;::::1;::::0;33705:4;;33670:44;33705:4;33670:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;33711:2:0;;-1:-1:-1;33670:34:0::1;::::0;-1:-1:-1;;33670:44:0:i:1;:::-;33820:12:::0;33747:69:::1;33802:13:::0;33761:4;;-1:-1:-1;;33766:15:0;;33761:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;33761:21:0::1;-1:-1:-1::0;;;;;33747:46:0::1;;33794:2;33747:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;33747:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33747:50:0;;:54:::1;:69::i;:::-;:85;;33725:185;;;;-1:-1:-1::0;;;33725:185:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17445:1;33183:735:::0;;;;;;;:::o;34808:864::-;35075:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;35134:4:0::1;35109:29;:4:::0;;-1:-1:-1;;35114:15:0;;35109:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;35109:21:0::1;-1:-1:-1::0;;;;;35109:29:0::1;;35101:78;;;;-1:-1:-1::0;;;35101:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35190:139;35236:4;;35241:1;35236:7;;;;;;35190:139;35340:55;35375:4;;35340:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35389:4:0::1;::::0;-1:-1:-1;35340:34:0::1;::::0;-1:-1:-1;;35340:55:0:i:1;:::-;35406:14;35437:4;-1:-1:-1::0;;;;;35423:29:0::1;;35461:4;35423:44;;;;;;;;;;;;;-1:-1:-1::0;;;;;35423:44:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;35423:44:0;;-1:-1:-1;35486:25:0;;::::1;;35478:88;;;;-1:-1:-1::0;;;35478:88:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35583:4;-1:-1:-1::0;;;;;35577:20:0::1;;35598:9;35577:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35619:45;35650:2;35654:9;35619:30;:45::i;27822:893::-:0;28038:21;28010:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;28096:4:::1;-1:-1:-1::0;;;;;28085:15:0::1;:4;;28090:1;28085:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28085:7:0::1;-1:-1:-1::0;;;;;28085:15:0::1;;28077:64;;;;-1:-1:-1::0;;;28077:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28162:56;28193:7;28202:9;28213:4;;28162:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28162:30:0::1;::::0;-1:-1:-1;;;28162:56:0:i:1;:::-;28152:66;;28268:12;28237:7;28262:1;28245:7;:14;:18;28237:27;;;;;;;;;;;;;;:43;;28229:106;;;;-1:-1:-1::0;;;28229:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28352:4;-1:-1:-1::0;;;;;28346:19:0::1;;28373:7;28381:1;28373:10;;;;;;;;;;;;;;28346:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28410:4;-1:-1:-1::0;;;;;28404:20:0::1;;28425:51;28450:7;28459:4;;28464:1;28459:7;;;;;;28425:51;28478:7;28486:1;28478:10;;;;;;;;;;;;;;28404:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;28404:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28404:85:0;28397:93:::1;;;;28501:24;28507:7;28516:4;;28501:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28522:2:0;;-1:-1:-1;28501:5:0::1;::::0;-1:-1:-1;;28501:24:0:i:1;:::-;28601:5;28566:7;28591:1;28574:7;:14;:18;28566:27;;;;;;;;;;;;;;28596:4;28566:34;:40;;;;;;28536:7;28561:1;28544:7;:14;:18;28536:27;;;;;;;;;;;;;:70;;;::::0;::::1;27822:893:::0;;;;;;;;:::o;36182:261::-;36335:13;36373:62;36402:9;36413;36424:10;36373:28;:62::i;27021:795::-;27245:21;27226:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;27289:55:::1;27319:7;27328:9;27339:4;;27289:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27289:29:0::1;::::0;-1:-1:-1;;;27289:55:0:i:1;:::-;27279:65;;27377:11;27363:7;27371:1;27363:10;;;;;;;;;;;;;;:25;;27355:84;;;;-1:-1:-1::0;;;27355:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17274:38:::0;;;:::o;35716:188::-;35813:12;35845:51;35868:7;35877:8;35887;35845:22;:51::i;23915:707::-;24181:14;24162:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;24224:196:::1;24254:5;24274:4;24293:9;24317:14;24346:12;24381:4;24401:8;24224:15;:196::i;:::-;24208:212;;;;;;24431:85;24459:5;24466:2;24484:5;-1:-1:-1::0;;;;;24470:30:0::1;;24509:4;24470:45;;;;;;;;;;;;;-1:-1:-1::0;;;;;24470:45:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24470:45:0;24431:27:::1;:85::i;:::-;24533:4;-1:-1:-1::0;;;;;24527:20:0::1;;24548:9;24527:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24569:45;24600:2;24604:9;24569:30;:45::i;:::-;23915:707:::0;;;;;;;;;:::o;33924:878::-;34184:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;34229:4:::1;-1:-1:-1::0;;;;;34218:15:0::1;:4;;34223:1;34218:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;34218:7:0::1;-1:-1:-1::0;;;;;34218:15:0::1;;34210:64;;;;-1:-1:-1::0;;;34210:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34285:13;34301:9;34285:25;;34327:4;-1:-1:-1::0;;;;;34321:19:0::1;;34348:8;34321:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34383:4;-1:-1:-1::0;;;;;34377:20:0::1;;34398:51;34423:7;34432:4;;34437:1;34432:7;;;;;;34398:51;34451:8;34377:83;;;;;;;;;;;;;-1:-1:-1::0;;;;;34377:83:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34377:83:0;34370:91:::1;;;;34472:18;34507:4:::0;;-1:-1:-1;;34512:15:0;;34507:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34507:21:0::1;-1:-1:-1::0;;;;;34493:46:0::1;;34540:2;34493:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;34493:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34493:50:0;34554:44:::1;::::0;;34493:50:::1;34554:44:::0;;::::1;::::0;;;;;;;;;;;34493:50;;-1:-1:-1;34554:44:0::1;::::0;;;34589:4;;;;;;34554:44;::::1;::::0;34589:4;;34554:44;34589:4;34554:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;34595:2:0;;-1:-1:-1;34554:34:0::1;::::0;-1:-1:-1;;34554:44:0:i:1;:::-;34704:12:::0;34631:69:::1;34686:13:::0;34645:4;;-1:-1:-1;;34650:15:0;;34645:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;34645:21:0::1;-1:-1:-1::0;;;;;34631:46:0::1;;34678:2;34631:50;;;;;;;;;;;;;-1:-1:-1::0;;;;;34631:50:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;20920:879:::0;21174:12;21188;21155:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;21213:12:::1;21228:49;21253:7;21262:6;21270;21228:24;:49::i;:::-;21288:62;::::0;;-1:-1:-1;;;21288:62:0;;21322:10:::1;21288:62;::::0;::::1;::::0;-1:-1:-1;;;;;21288:33:0;::::1;:62:::0;;;;;;;;;;;;;;21213:64;;-1:-1:-1;21288:33:0;;::::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;21288:33:0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;21418:29:0::1;::::0;;-1:-1:-1;;;21418:29:0;;-1:-1:-1;;;;;21418:29:0;;::::1;;::::0;::::1;::::0;;;21388:12:::1;::::0;;;21418:25;;::::1;::::0;::::1;::::0;:29;;;;;;;;;;;21388:12;21418:25;:29;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21418:29:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;21418:29:0;-1:-1:-1;21459:14:0::1;21478:43;21506:6:::0;21514;21478:27:::1;:43::i;:::-;21458:63;;;21563:6;-1:-1:-1::0;;;;;21553:16:0::1;:6;-1:-1:-1::0;;;;;21553:16:0::1;;:58;;21594:7;21603;21553:58;;;21573:7;21582;21553:58;21532:79:::0;;-1:-1:-1;21532:79:0;-1:-1:-1;21630:21:0;;::::1;;21622:79;;;;-1:-1:-1::0;;;21622:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21731:10;21720:7;:21;;21712:79;;;;-1:-1:-1::0;;;21712:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17445:1;;;;20920:879:::0;;;;;;;;;;;:::o;17226:41::-;;;:::o;36451:253::-;36595:21;36641:55;36672:7;36681:8;36691:4;36641:30;:55::i;23167:669::-;23456:16;23474:14;23501:12;23516:46;23541:7;23550:5;23557:4;23516:24;:46::i;:::-;23501:61;;23573:10;23586;:33;;23610:9;23586:33;;;-1:-1:-1;;23586:33:0;23630:80;;;-1:-1:-1;;;23630:80:0;;23658:10;23630:80;;;;23678:4;23630:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23573:46;;-1:-1:-1;;;;;;23630:27:0;;;;;:80;;;;;-1:-1:-1;;23630:80:0;;;;;;;;-1:-1:-1;23630:27:0;:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23748;23767:5;23774:9;23785:14;23801:12;23815:2;23819:8;23748:18;:80::i;:::-;23721:107;;;;-1:-1:-1;23167:669:0;-1:-1:-1;;;;;;;;;;;;;23167:669:0:o;19159:738::-;19447:12;19461;19475:14;19428:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;19523:85:::1;19537:6;19545;19553:14;19569;19585:10;19597;19523:13;:85::i;:::-;19502:106:::0;;-1:-1:-1;19502:106:0;-1:-1:-1;19619:12:0::1;19634:49;19659:7;19668:6:::0;19676;19634:24:::1;:49::i;:::-;19619:64;;19694:66;19726:6;19734:10;19746:4;19752:7;19694:31;:66::i;:::-;19771;19803:6;19811:10;19823:4;19829:7;19771:31;:66::i;:::-;19875:4;-1:-1:-1::0;;;;;19860:25:0::1;;19886:2;19860:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;19860:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;19860:29:0;19159:738;;;;-1:-1:-1;19860:29:0;;-1:-1:-1;19159:738:0;;-1:-1:-1;;;;;;;;;19159:738:0:o;19903:974::-;20156:16;20174:14;20190;20137:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;20244:176:::1;20272:5;20292:4;20311:18;20344:9;20368:14;20397:12;20244:13;:176::i;:::-;20217:203:::0;;-1:-1:-1;20217:203:0;-1:-1:-1;20431:12:0::1;20446:46;20471:7;20480:5:::0;20487:4:::1;20446:24;:46::i;:::-;20431:61;;20503:69;20535:5;20542:10;20554:4;20560:11;20503:31;:69::i;:::-;20589:4;-1:-1:-1::0;;;;;20583:19:0::1;;20610:9;20583:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;20646:4;-1:-1:-1::0;;;;;20640:20:0::1;;20661:4;20667:9;20640:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;20640:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20640:37:0;20633:45:::1;;;;20716:4;-1:-1:-1::0;;;;;20701:25:0::1;;20727:2;20701:29;;;;;;;;;;;;;-1:-1:-1::0;;;;;20701:29:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20701:29:0;;-1:-1:-1;20781:9:0::1;:21:::0;-1:-1:-1;20777:92:0::1;;;20804:65;20835:10;20859:9;20847;:21;20804:30;:65::i;:::-;17445:1;19903:974:::0;;;;;;;;;;;:::o;30803:1006::-;31016:21;30988:8;17383:15;17371:8;:27;;17363:71;;;;;-1:-1:-1;;;17363:71:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17363:71:0;;;;;;;;;;;;;;;31074:4:::1;-1:-1:-1::0;;;;;31063:15:0::1;:4;;31068:1;31063:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31063:7:0::1;-1:-1:-1::0;;;;;31063:15:0::1;;31055:64;;;;-1:-1:-1::0;;;31055:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31140:55;31170:7;31179:9;31190:4;;31140:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31140:29:0::1;::::0;-1:-1:-1;;;31140:55:0:i:1;:::-;31130:65;;31228:9;31214:7;31222:1;31214:10;;;;;;;;;;;;;;:23;;31206:82;;;;-1:-1:-1::0;;;31206:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31305:4;-1:-1:-1::0;;;;;31299:19:0::1;;31326:7;31334:1;31326:10;;;;;;;;;;;;;;31299:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31363:4;-1:-1:-1::0;;;;;31357:20:0::1;;31378:51;31403:7;31412:4;;31417:1;31412:7;;;;;;31378:51;31431:7;31439:1;31431:10;;;;;;;;;;;;;;31357:85;;;;;;;;;;;;;-1:-1:-1::0;;;;;31357:85:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31357:85:0;31350:93:::1;;;;31454:24;31460:7;31469:4;;31454:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31475:2:0;;-1:-1:-1;31454:5:0::1;::::0;-1:-1:-1;;31454:24:0:i:1;:::-;31541:7;31549:1;31541:10;;;;;;;;;;;;;;31529:9;:22;31525:94;;;31553:66;31584:10;31608:7;31616:1;31608:10;;;;;;;;;;;;;;31596:9;:22;31553:30;:66::i;8525:361::-:0;8720:45;;;-1:-1:-1;;;;;8720:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8720:45:0;-1:-1:-1;;;8720:45:0;;;8709:57;;;;8674:12;;8688:17;;8709:10;;;;8720:45;8709:57;;;8720:45;8709:57;;8720:45;8709:57;;;;;;;;;;-1:-1:-1;;8709:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8673:93;;;;8785:7;:57;;;;-1:-1:-1;8797:11:0;;:16;;:44;;;8828:4;8817:24;;;;;;;;;;;;;;;-1:-1:-1;8817:24:0;8797:44;8777:101;;;;;-1:-1:-1;;;8777:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8525:361;;;;;:::o;9304:195::-;9412:12;;;9374;9412;;;;;;;;;-1:-1:-1;;;;;9391:7:0;;;9405:5;;9391:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9391:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9373:52;;;9444:7;9436:55;;;;-1:-1:-1;;;9436:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9304:195;;;:::o;5625:517::-;5718:14;5764:1;5753:8;:12;5745:68;;;;-1:-1:-1;;;5745:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5844:1;5832:9;:13;:31;;;;;5862:1;5849:10;:14;5832:31;5824:84;;;;-1:-1:-1;;;5824:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5919:20;5942:17;:8;5955:3;5942:12;:17::i;:::-;5919:40;-1:-1:-1;5970:14:0;5987:31;5919:40;6007:10;5987:19;:31::i;:::-;5970:48;-1:-1:-1;6029:16:0;6048:40;6072:15;6048:19;:9;6062:4;6048:13;:19::i;:::-;:23;;:40::i;:::-;6029:59;;6123:11;6111:9;:23;;;;;;;5625:517;-1:-1:-1;;;;;;;5625:517:0:o;6817:511::-;6918:21;6975:1;6960:4;:11;:16;;6952:59;;;;;-1:-1:-1;;;6952:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7043:4;:11;7032:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:23:0;;7022:33;;7079:8;7066:7;7074:1;7066:10;;;;;;;;;;;;;:21;;;;;7103:6;7098:223;7129:1;7115:4;:11;:15;7111:1;:19;7098:223;;;7153:14;7169:15;7188:42;7200:7;7209:4;7214:1;7209:7;;;;;;;;;;;;;;7218:4;7223:1;7227;7223:5;7218:11;;;;;;;;;;;;;;7188;:42::i;:::-;7152:78;;;;7262:47;7275:7;7283:1;7275:10;;;;;;;;;;;;;;7287:9;7298:10;7262:12;:47::i;:::-;7245:7;7253:1;7257;7253:5;7245:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;7132:3:0;;7098:223;;;;6817:511;;;;;:::o;4142:478::-;4231:12;4257:14;4273;4291:26;4302:6;4310;4291:10;:26::i;:::-;4455:32;;;-1:-1:-1;;4455:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4445:43;;;;;;-1:-1:-1;;;;;;4358:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4348:262;;;;;;;;;4142:478;-1:-1:-1;;;;;4142:478:0:o;8894:402::-;9119:51;;;-1:-1:-1;;;;;9119:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9119:51:0;-1:-1:-1;;;9119:51:0;;;9108:63;;;;9073:12;;9087:17;;9108:10;;;;9119:51;9108:63;;;9119:51;9108:63;;9119:51;9108:63;;;;;;;;;;-1:-1:-1;;9108:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9072:99;;;;9190:7;:57;;;;-1:-1:-1;9202:11:0;;:16;;:44;;;9233:4;9222:24;;;;;;;;;;;;;;;-1:-1:-1;9222:24:0;9202:44;9182:106;;;;-1:-1:-1;;;9182:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8894:402;;;;;;:::o;25457:735::-;25564:6;25559:626;25590:1;25576:4;:11;:15;25572:1;:19;25559:626;;;25614:13;25629:14;25648:4;25653:1;25648:7;;;;;;;;;;;;;;25657:4;25662:1;25666;25662:5;25657:11;;;;;;;;;;;;;;25613:56;;;;25685:14;25704:42;25732:5;25739:6;25704:27;:42::i;:::-;25684:62;;;25761:14;25778:7;25786:1;25790;25786:5;25778:14;;;;;;;;;;;;;;25761:31;;25808:15;25825;25853:6;-1:-1:-1;;;;;25844:15:0;:5;-1:-1:-1;;;;;25844:15:0;;:61;;25886:9;25902:1;25844:61;;;25868:1;25872:9;25844:61;25807:98;;;;25920:10;25951:1;25937:4;:11;:15;25933:1;:19;:82;;26012:3;25933:82;;;25955:54;25980:7;25989:6;25997:4;26002:1;26006;26002:5;25997:11;;;;;;;;;;;;;;25955:24;:54::i;:::-;25920:95;;26045:48;26070:7;26079:5;26086:6;26045:24;:48::i;:::-;-1:-1:-1;;;;;26030:69:0;;26118:10;26130;26142:2;26156:1;26146:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26146:12:0;;26030:143;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26030:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25593:3:0;;;;;-1:-1:-1;25559:626:0;;-1:-1:-1;;;;;;;;25559:626:0;;;25457:735;;;:::o;7409:532::-;7510:21;7567:1;7552:4;:11;:16;;7544:59;;;;;-1:-1:-1;;;7544:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7635:4;:11;7624:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7624:23:0;;7614:33;;7688:9;7658:7;7683:1;7666:7;:14;:18;7658:27;;;;;;;;;;;;;;;;;:39;7722:11;;-1:-1:-1;;7722:15:0;7708:226;7739:5;;7708:226;;7767:14;7783:15;7802:42;7814:7;7823:4;7832:1;7828;:5;7823:11;;;;;;;;;;;;;;7836:4;7841:1;7836:7;;;;;;;7802:42;7766:78;;;;7876:46;7888:7;7896:1;7888:10;;;;;;;;;;;;;;7900:9;7911:10;7876:11;:46::i;:::-;7859:7;7871:1;7867;:5;7859:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;7746:3:0;7708:226;;31956:1221;32069:6;32064:1106;32095:1;32081:4;:11;:15;32077:1;:19;32064:1106;;;32119:13;32134:14;32153:4;32158:1;32153:7;;;;;;;;;;;;;;32162:4;32167:1;32171;32167:5;32162:11;;;;;;;;;;;;;;32118:56;;;;32190:14;32209:42;32237:5;32244:6;32209:27;:42::i;:::-;32189:62;;;32266:19;32303:48;32328:7;32337:5;32344:6;32303:24;:48::i;:::-;32266:86;;32367:16;32398:17;32486:13;32501;32519:4;-1:-1:-1;;;;;32519:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32519:18:0;;;;;;;-1:-1:-1;;;;;32485:52:0;;;;-1:-1:-1;32485:52:0;;-1:-1:-1;32553:17:0;;-1:-1:-1;;;;;32594:15:0;;;;;;;:61;;32636:8;32646;32594:61;;;32613:8;32623;32594:61;32552:103;;;;32684:63;32734:12;32698:5;-1:-1:-1;;;;;32684:30:0;;32723:4;32684:45;;;;;;;;;;;;;-1:-1:-1;;;;;32684:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;:63;32670:77;;32777:71;32807:11;32820:12;32834:13;32777:29;:71::i;:::-;32762:86;;32064:1106;;;;32879:15;32896;32924:6;-1:-1:-1;;;;;32915:15:0;:5;-1:-1:-1;;;;;32915:15:0;;:67;;32960:12;32979:1;32915:67;;;32939:1;32943:12;32915:67;32878:104;;;;32997:10;33028:1;33014:4;:11;:15;33010:1;:19;:82;;33089:3;33010:82;;;33032:54;33057:7;33066:6;33074:4;33079:1;33083;33079:5;33074:11;;;;;;;33032:54;33145:12;;;33155:1;33145:12;;;;;;;;;;-1:-1:-1;;;33107:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33107:51:0;;;;;;;;;;;;;;;;;;;;;;32997:95;;-1:-1:-1;33107:9:0;;;;;;33117:10;;33129;;32997:95;;33145:12;;33107:51;;;;;;;;33145:12;;33107:51;;;;33145:12;;33107:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32098:3:0;;;;;-1:-1:-1;32064:1106:0;;-1:-1:-1;;;;;;;;;;32064:1106:0;3172:129;3256:5;;;3251:16;;;;3243:50;;;;;-1:-1:-1;;;3243:50:0;;;;;;;;;;;;-1:-1:-1;;;3243:50:0;;;;;;;;;;;;;;6263:472;6356:13;6402:1;6390:9;:13;6382:70;;;;-1:-1:-1;;;6382:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6483:1;6471:9;:13;:31;;;;;6501:1;6488:10;:14;6471:31;6463:84;;;;-1:-1:-1;;;6463:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6558:14;6575:34;6604:4;6575:24;:9;6589;6575:13;:24::i;:::-;:28;;:34::i;:::-;6558:51;-1:-1:-1;6620:16:0;6639:34;6669:3;6639:25;:10;6654:9;6639:14;:25::i;:34::-;6620:53;;6695:32;6725:1;6708:11;6696:9;:23;;;;;;;6695:29;:32::i;:::-;6684:43;6263:472;-1:-1:-1;;;;;;6263:472:0:o;5182:321::-;5264:12;5307:1;5297:7;:11;5289:61;;;;-1:-1:-1;;;5289:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5380:1;5369:8;:12;:28;;;;;5396:1;5385:8;:12;5369:28;5361:81;;;;-1:-1:-1;;;5361:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5487:8;5463:21;:7;5475:8;5463:11;:21::i;:::-;:32;;;;;;;5182:321;-1:-1:-1;;;;5182:321:0:o;3701:349::-;3776:14;3792;3837:6;-1:-1:-1;;;;;3827:16:0;:6;-1:-1:-1;;;;;3827:16:0;;;3819:66;;;;-1:-1:-1;;;3819:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3924:6;-1:-1:-1;;;;;3915:15:0;:6;-1:-1:-1;;;;;3915:15:0;;:53;;3953:6;3961;3915:53;;;3934:6;3942;3915:53;3896:72;;-1:-1:-1;3896:72:0;-1:-1:-1;;;;;;3987:20:0;;3979:63;;;;;-1:-1:-1;;;3979:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3701:349;;;;;:::o;17749:1404::-;17967:12;17981;18124:1;-1:-1:-1;;;;;18062:64:0;18080:7;-1:-1:-1;;;;;18062:34:0;;18097:6;18105;18062:50;;;;;;;;;;;;;-1:-1:-1;;;;;18062:50:0;;;;;;-1:-1:-1;;;;;18062:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18062:50:0;-1:-1:-1;;;;;18062:64:0;;18058:150;;;18161:7;-1:-1:-1;;;;;18143:37:0;;18181:6;18189;18143:53;;;;;;;;;;;;;-1:-1:-1;;;;;18143:53:0;;;;;;-1:-1:-1;;;;;18143:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18058:150:0;18219:13;18234;18251:53;18280:7;18289:6;18297;18251:28;:53::i;:::-;18218:86;;;;18319:8;18331:1;18319:13;:30;;;;-1:-1:-1;18336:13:0;;18319:30;18315:831;;;18388:14;;-1:-1:-1;18404:14:0;;-1:-1:-1;18315:831:0;;;18452:19;18474:58;18497:14;18513:8;18523;18474:22;:58::i;:::-;18452:80;;18569:14;18551;:32;18547:588;;18630:10;18612:14;:28;;18604:86;;;;-1:-1:-1;;;18604:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18731:14;;-1:-1:-1;18747:14:0;-1:-1:-1;18747:14:0;18547:588;;;18803:19;18825:58;18848:14;18864:8;18874;18825:22;:58::i;:::-;18803:80;;18927:14;18909;:32;;18902:40;;;;18987:10;18969:14;:28;;18961:86;;;;-1:-1:-1;;;18961:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19088:14;-1:-1:-1;19104:14:0;;-1:-1:-1;18547:588:0;18315:831;;17749:1404;;;;;;;;;;;:::o;3309:142::-;3361:6;3388;;;:30;;-1:-1:-1;;3403:5:0;;;3417:1;3412;3403:5;3412:1;3398:15;;;;;:20;3388:30;3380:63;;;;;-1:-1:-1;;;3380:63:0;;;;;;;;;;;;-1:-1:-1;;;3380:63:0;;;;;;;;;;;;;;3036:128;3120:5;;;3115:16;;;;3107:49;;;;;-1:-1:-1;;;3107:49:0;;;;;;;;;;;;-1:-1:-1;;;3107:49:0;;;;;;;;;;;;;;4678:391;4771:13;4786;4813:14;4832:26;4843:6;4851;4832:10;:26::i;:::-;4812:46;;;4870:13;4885;4918:32;4926:7;4935:6;4943;4918:7;:32::i;:::-;-1:-1:-1;;;;;4903:60:0;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4903:62:0;;;;;;;-1:-1:-1;;;;;4869:96:0;;;;-1:-1:-1;4869:96:0;;-1:-1:-1;;;;;;4999:16:0;;;;;;;:62;;5042:8;5052;4999:62;;;5019:8;5029;4999:62;4976:85;;;;-1:-1:-1;4678:391:0;-1:-1:-1;;;;;;;4678:391:0:o

Swarm Source

ipfs://b320048d8fc7bbfffc0013501deac9c69749e27e0c3053f671801b1c7de20fd7
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.