Contract 0xfb45b575b66c99e0c8d2639acf237807d4ea1508

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x16767d71142eff552f870644b41ba144e9247c8176fe899b9d449ca0d192bee30x9d9270a839501932023-04-02 9:53:363 hrs 11 mins ago0xf7abcfa42bf7e7d43d3d53c665ded80fdafb5244 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.0007564505
0xcb57eb6ae914fe37b3e647d2d9043039b98f63cf39973ba7c8ea2ed5ea4cc0f5Swap Exact Token...39498682023-04-02 8:46:184 hrs 18 mins ago0x6e795449a8ba43a03888dbddb48164a6eab8e0e0 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.0006430255
0xdb9270d732816b8c5913410df42a67d52b84592eb7215041a8ae3e59cdca412dSwap Exact Token...39494662023-04-02 7:23:245 hrs 41 mins ago0x846f075386d893b7ad22c76b9b19568c445ef494 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.0006431035
0x127a1600078dbba91d4b0fd49108728bb80b78e7e51066ee616737658d51e682Swap Exact Token...39486772023-04-02 4:38:428 hrs 26 mins ago0xc6ca7dedd3bccb12e58d361ce794a8ea3f81a1d5 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.0005262411
0xacab0f855e248faccf1e1d11c0f2ce20e2d918c7e3378d0b13452ef0c40894e4Swap Exact Token...39462342023-04-01 20:16:1816 hrs 48 mins ago0xdb98631b982ec04e5f2324bb79fc0708ef6361f1 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000893412
0x6688915026305b90485ce5dcecdc311863d7027eaf9384ee3be0bb5a02a6093eSwap Exact Token...39462232023-04-01 20:14:0616 hrs 50 mins ago0xdb98631b982ec04e5f2324bb79fc0708ef6361f1 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00020826
0x0a4e04e954da5b85e3a210606f7c0458608c90e67907e0942083b136e7a6fe55Swap Exact Token...39446482023-04-01 14:51:0022 hrs 13 mins ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000393614
0x0ec34f4b915bde25b0890591ade32c6870960072936a1bc76fcc0ddf7d6be4a7Swap Exact Token...39446442023-04-01 14:50:1222 hrs 14 mins ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000393614
0xaa729672b31921cd444dd62ad8deef342f999721b12edca6c1bb22c3ad3819aeSwap Exact Token...39444322023-04-01 14:06:4222 hrs 58 mins ago0x5b4ca4107614101867dde9be9619b6003db0ebb6 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.0004112745
0x382aa262898e17e3e45a1b21eb6752f55be8f3c7890a162b1e6e36c4e676f742Swap Exact Nativ...39401782023-03-31 23:29:361 day 13 hrs ago0x3556e8c08007440fbd759d17a320155ad029f24c IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15081 MOVR0.0006271915
0xc319d6ac96ae1c4354b6ed32ad6888d293b84b84839003df83db431ff0a6a00bSwap Exact Token...39401392023-03-31 23:21:241 day 13 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0x921d100d8c6948d5caa4edb24d0665ae6042fb5d14abaf428e7661d0baa610f6Swap Exact Token...39401332023-03-31 23:20:121 day 13 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0xe91c5877cbbd1695dc9a27796d197c2da5c2839528cf620f76a536420c82d6e2Swap Exact Token...39377232023-03-31 15:03:481 day 22 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0xff1984297d0f1363a100d4eae2565577270ced99880610923697c0254deb3da5Swap Exact Token...39377132023-03-31 15:01:481 day 22 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0xe843e63a082fce1b5ae76e0ed029f46d164341f23a26933dcd6669ea4604ae92Swap Exact Token...39376902023-03-31 14:56:541 day 22 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00039390325
0xdbf6328f223aa8eb99b9ee652664e9286f5b95d41692683edbddf86ea8cf37750x9d9270a839376702023-03-31 14:52:541 day 22 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00070636475
0xb0db6603f2d0028d3c86423409b87dd0d93027822f6500204ac9e0b36f89ed25Swap Exact Token...39373042023-03-31 13:37:241 day 23 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00013746625
0xf2f11a1955f9b00d6d2d18aa45f9ab69cc01bba004288483dfeeda578aa2525dSwap Exact Token...39373002023-03-31 13:36:361 day 23 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0x56480ad8ff0775af971d35a03508274d81d01fc70e9f2a4d34fe92850ad6c40fSwap Exact Token...39372962023-03-31 13:35:421 day 23 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015151625
0x444b5275af5842f9b9a8204d25642b34a3f22be42b906e356668153f94947e71Swap Exact Token...39369182023-03-31 12:16:302 days 48 mins ago0x5049feb67800e5ba82626c9f78ff9c458e0eb66f IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00062755209
0x5ade86a3968ab73fc7cad2d9f1faeaca4edfd6f2ae3a9969431a38d6e50c229eSwap Exact Token...39348432023-03-31 5:08:242 days 7 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000151375
0xb7f62aee4754a91e2e1dedbcc94609c25884fa2f6cc472fda9ff9beaebfdaf84Swap Exact Token...39348352023-03-31 5:06:482 days 7 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.00015139
0x5106661b2a0596de289c691f0ea060e70bec58300f91f56759e9bddcfc60a6c1Swap Exact Token...39333422023-03-30 23:59:422 days 13 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000393614
0xaffc60b6a7993b8a03baeede3c47a1a98c0f62c3d4d465d165b8d59b73b0c0a4Swap Exact Token...39333392023-03-30 23:59:062 days 13 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000393614
0x23b214cde297d97b29364253125098277aa8f9e59cdbb588475f98c8cf588776Swap Exact Token...39332492023-03-30 23:40:302 days 13 hrs ago0xd7b522717a6cbe54d3d4ab67df96fcdf437eda69 IN  0xfb45b575b66c99e0c8d2639acf237807d4ea15080 MOVR0.000393614
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcb57eb6ae914fe37b3e647d2d9043039b98f63cf39973ba7c8ea2ed5ea4cc0f539498682023-04-02 8:46:184 hrs 18 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x6e795449a8ba43a03888dbddb48164a6eab8e0e00.021855368541133287 MOVR
0xcb57eb6ae914fe37b3e647d2d9043039b98f63cf39973ba7c8ea2ed5ea4cc0f539498682023-04-02 8:46:184 hrs 18 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15080.021855368541133287 MOVR
0xdb9270d732816b8c5913410df42a67d52b84592eb7215041a8ae3e59cdca412d39494662023-04-02 7:23:245 hrs 41 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x846f075386d893b7ad22c76b9b19568c445ef4940.108620598514465333 MOVR
0xdb9270d732816b8c5913410df42a67d52b84592eb7215041a8ae3e59cdca412d39494662023-04-02 7:23:245 hrs 41 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15080.108620598514465333 MOVR
0xaa729672b31921cd444dd62ad8deef342f999721b12edca6c1bb22c3ad3819ae39444322023-04-01 14:06:4222 hrs 58 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x5b4ca4107614101867dde9be9619b6003db0ebb60.211054850586204294 MOVR
0xaa729672b31921cd444dd62ad8deef342f999721b12edca6c1bb22c3ad3819ae39444322023-04-01 14:06:4222 hrs 58 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15080.211054850586204294 MOVR
0x382aa262898e17e3e45a1b21eb6752f55be8f3c7890a162b1e6e36c4e676f74239401782023-03-31 23:29:361 day 13 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token1 MOVR
0x444b5275af5842f9b9a8204d25642b34a3f22be42b906e356668153f94947e7139369182023-03-31 12:16:302 days 48 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x5049feb67800e5ba82626c9f78ff9c458e0eb66f39.87076026461963734 MOVR
0x444b5275af5842f9b9a8204d25642b34a3f22be42b906e356668153f94947e7139369182023-03-31 12:16:302 days 48 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea150839.87076026461963734 MOVR
0xee1d88f5ac3e9f12ea439ecc8da0772b39d595d73a57d5a3be3f88379920f9fd39301682023-03-30 13:01:003 days 3 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080xb72da4ab14f38fe4f24f1cd85b7255027da2ebda0.919277761436053252 MOVR
0xee1d88f5ac3e9f12ea439ecc8da0772b39d595d73a57d5a3be3f88379920f9fd39301682023-03-30 13:01:003 days 3 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15080.919277761436053252 MOVR
0xc1b2396bc2b90b5b59bd52b9fb134a0e8ddc9d21ea12df99fde15c5d71aa436c39292872023-03-30 9:58:183 days 3 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token0.004 MOVR
0x1f9bbf8ddfda560a6351636119e1d7e32360aeb1a61e69bcbcb57297b20da8d639292842023-03-30 9:57:423 days 3 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token0.004 MOVR
0x9752689382c8ac8a577f5acf005fc5163111d1ef382dbfe204405682a5342b6d39255372023-03-29 21:07:003 days 15 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x4218397390f0ce50bcf4e8a0f5779092a430242f8.089012408508612918 MOVR
0x9752689382c8ac8a577f5acf005fc5163111d1ef382dbfe204405682a5342b6d39255372023-03-29 21:07:003 days 15 hrs ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15088.089012408508612918 MOVR
0x4b4e75ba8e67d192658339ada510e98f72fc83e4f75351470e2bfc31f297ae8239240502023-03-29 15:59:363 days 21 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080xe6a311788c58a3b4bfd13922da33591eb8334ec22.115612018478674101 MOVR
0x4b4e75ba8e67d192658339ada510e98f72fc83e4f75351470e2bfc31f297ae8239240502023-03-29 15:59:363 days 21 hrs ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15082.115612018478674101 MOVR
0xb21a69b18053382699ad3270cbb1d29030753f3a6ce3b682edfd80c27295438239231272023-03-29 12:50:304 days 14 mins ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x4fea955b97aac71c9624d9e07231b2fb6c673c1b16.742859140499131495 MOVR
0xb21a69b18053382699ad3270cbb1d29030753f3a6ce3b682edfd80c27295438239231272023-03-29 12:50:304 days 14 mins ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea150816.742859140499131495 MOVR
0x28ee56d5ebe1a95e002f3c40658614e99d71b3fe2ca9f17581947e9b28439c8639220322023-03-29 9:05:004 days 3 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token4.5 MOVR
0x554aea5d292cdbbea1b2cd5d792121e4f7e659fc4102b4ce9f6166d10670574b39213202023-03-29 6:39:064 days 6 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea15080x1289b59d69dbafa8b97d0643d2bf04e8a01f98392.641244802807970218 MOVR
0x554aea5d292cdbbea1b2cd5d792121e4f7e659fc4102b4ce9f6166d10670574b39213202023-03-29 6:39:064 days 6 hrs ago Moonbeam Foundation: WMOVR Token 0xfb45b575b66c99e0c8d2639acf237807d4ea15082.641244802807970218 MOVR
0x34f5b787419eece979ace6aa54f9af22e13de78c51c8b5004eae150237ba866639174002023-03-28 17:15:424 days 19 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token4.08049 MOVR
0xbedc358c79b841cd675e310c0c1bb7a4cc9d74b0a7dd81f9e8ef11a6f6dbcc7d39173522023-03-28 17:05:544 days 19 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token4.0792 MOVR
0x192452c2abb19cf4c98c7d531f04b83e11d3ba364384f0d70c14a073abbe7a4a39163772023-03-28 13:45:304 days 23 hrs ago 0xfb45b575b66c99e0c8d2639acf237807d4ea1508 Moonbeam Foundation: WMOVR Token6 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapRouterV1

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2022-08-01
*/

// File: contracts/core/interfaces/IFactory.sol



pragma solidity >=0.8.0;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );
    event PairCreateLocked(
        address indexed caller
    );
    event PairCreateUnlocked(
        address indexed caller
    );
    event BootstrapSetted(
        address indexed tokenA,
        address indexed tokenB,
        address indexed bootstrap
    );
    event FeetoUpdated(
        address indexed feeto
    );
    event FeeBasePointUpdated(
        uint8 basePoint
    );

    function feeto() external view returns (address);

    function feeBasePoint() external view returns (uint8);

    function lockForPairCreate() external view returns (bool);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);
    
    function getBootstrap(address tokenA, address tokenB)
        external
        view
        returns (address bootstrap);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

// File: contracts/core/interfaces/IPair.sol



pragma solidity >=0.8.0;

interface IPair {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );

    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);
    function price1CumulativeLast() external view returns (uint256);
    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;

    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts/libraries/Math.sol



pragma solidity >=0.8.0;

// a library for performing various math operations

library Math {
    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

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

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

// File: contracts/libraries/Helper.sol



pragma solidity >=0.8.0;




library Helper {
    using Math for uint256;

    function sortTokens(address tokenA, address tokenB)
        internal
        pure
        returns (address token0, address token1)
    {
        require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "Helper: ZERO_ADDRESS");
    }

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        return IFactory(factory).getPair(tokenA, tokenB);
    }

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, "INSUFFICIENT_AMOUNT");
        require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY");
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed"
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 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::safeTransfer: transfer failed"
        );
    }

    function safeTransferNativeCurrency(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed"
        );
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn.mul(997);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 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(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "Helper: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        uint256 denominator = reserveOut.sub(amountOut).mul(997);
        amountIn = (numerator / denominator).add(1);
    }

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

    function getAmountsIn(
        address factory,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "Helper: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

// File: contracts/periphery/interfaces/IWNativeCurrency.sol



pragma solidity >=0.8.0;

interface IWNativeCurrency {
    function deposit() external payable;

    function withdraw(uint256) external;
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: contracts/stableswap/interfaces/IStableSwap.sol


pragma solidity >=0.8.0;


interface IStableSwap {
    /// EVENTS
    event AddLiquidity(
        address indexed provider,
        uint256[] tokenAmounts,
        uint256[] fees,
        uint256 invariant,
        uint256 tokenSupply
    );

    event FlashLoan(
        address indexed caller,
        address indexed receiver,
        uint256[] amounts_out
    );

    event TokenExchange(
        address indexed buyer,
        uint256 soldId,
        uint256 tokensSold,
        uint256 boughtId,
        uint256 tokensBought
    );

    event RemoveLiquidity(address indexed provider, uint256[] tokenAmounts, uint256[] fees, uint256 tokenSupply);

    event RemoveLiquidityOne(address indexed provider, uint256 tokenIndex, uint256 tokenAmount, uint256 coinAmount);

    event RemoveLiquidityImbalance(
        address indexed provider,
        uint256[] tokenAmounts,
        uint256[] fees,
        uint256 invariant,
        uint256 tokenSupply
    );

    event RampA(uint256 oldA, uint256 newA, uint256 initialTime, uint256 futureTime);

    event StopRampA(uint256 A, uint256 timestamp);

    event NewFee(uint256 fee, uint256 adminFee);

    event CollectProtocolFee(address token, uint256 amount);

    event FeeControllerChanged(address newController);

    event FeeDistributorChanged(address newController);

    // pool data view functions
    function getLpToken() external view returns (IERC20 lpToken);

    function getA() external view returns (uint256);

    function getAPrecise() external view returns (uint256);

    function getToken(uint8 index) external view returns (IERC20);

    function getTokens() external view returns (IERC20[] memory);

    function getTokenIndex(address tokenAddress) external view returns (uint8);

    function getTokenBalance(uint8 index) external view returns (uint256);

    function getTokenBalances() external view returns (uint256[] memory);

    function getNumberOfTokens() external view returns (uint256);

    function getVirtualPrice() external view returns (uint256);

    function calculateTokenAmount(uint256[] calldata amounts, bool deposit) external view returns (uint256);

    function calculateSwap(
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external view returns (uint256);

    function calculateRemoveLiquidity(uint256 amount) external view returns (uint256[] memory);

    function calculateRemoveLiquidityOneToken(uint256 tokenAmount, uint8 tokenIndex)
        external
        view
        returns (uint256 availableTokenAmount);

    function getAdminBalances() external view returns (uint256[] memory adminBalances);

    function getAdminBalance(uint8 index) external view returns (uint256);

    // state modifying functions
    function swap(
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) external returns (uint256);

    function flashLoan(
        uint256[] memory amountsOut,
        address to,
        bytes calldata data,
        uint256 deadline
    ) external;

    function addLiquidity(
        uint256[] calldata amounts,
        uint256 minToMint,
        uint256 deadline
    ) external returns (uint256);

    function removeLiquidity(
        uint256 amount,
        uint256[] calldata minAmounts,
        uint256 deadline
    ) external returns (uint256[] memory);

    function removeLiquidityOneToken(
        uint256 tokenAmount,
        uint8 tokenIndex,
        uint256 minAmount,
        uint256 deadline
    ) external returns (uint256);

    function removeLiquidityImbalance(
        uint256[] calldata amounts,
        uint256 maxBurnAmount,
        uint256 deadline
    ) external returns (uint256);

    function withdrawAdminFee() external;
}

// File: contracts/periphery/interfaces/ISwapRouterV1.sol



pragma solidity >=0.8.0;


interface ISwapRouterV1 {

    struct Route {
        bool stable;
        bytes callData; 
    }

    function factory() external view returns (address);

    function WNativeCurrency() external view returns (address);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapPool(
        IStableSwap pool,
        uint8 fromIndex,
        uint8 toIndex,
        uint256 inAmount,
        uint256 minOutAmount,
        address to,
        uint256 deadline
    ) external returns (uint256 amountOut);

    function swapPoolFromBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        address to,
        uint256 deadline
    ) external returns (uint256 amountOut);

    function swapPoolToBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        address to,
        uint256 deadline
    ) external returns (uint256 amountOut);

    function swapExactTokensForTokensThroughStablePool(
        uint256 amountIn,
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external returns (uint256 amountOut);

    function swapExactNativeCurrencyForTokensThroughStablePool(
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external payable returns (uint256 amountOut);

    function swapExactTokensForNativeCurrencyThroughStablePool(
        uint256 amountIn,
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external returns (uint256 amountOut);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn, 
        address[] memory path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut, 
        address[] memory path
    ) external view returns (uint256[] memory amounts);

    function calculateSwap(
        IStableSwap pool,
        uint8 fromIndex,
        uint8 toIndex,
        uint256 inAmount
    ) external view returns (uint256);

    function calculateSwapFromBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external view returns (uint256);

    function calculateSwapToBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: contracts/periphery/SwapRouterV1.sol


pragma solidity >=0.8.0;








contract SwapRouterV1 is ISwapRouterV1 {
    using SafeERC20 for IERC20;
    using Math for uint256;

    struct StablePath {
        IStableSwap pool;
        IStableSwap basePool;
        address fromToken;
        address toToken;
        bool fromBase;
    }

    address public override factory;
    address public override WNativeCurrency;

    constructor(address _factory, address _WNativeCurrency) {
        factory = _factory;
        WNativeCurrency = _WNativeCurrency;
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "SwapRouterV1: EXPIRED");
        _;
    }

    receive() external payable {
        require(msg.sender == WNativeCurrency);
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) private {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = Helper.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2
                ? Helper.pairFor(factory, output, path[i + 2])
                : _to;
            IPair(Helper.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactNativeCurrencyForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH");
        amounts = Helper.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactNativeCurrency(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "SwapRouterV1: INVALID_PATH"
        );
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForNativeCurrency(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256[] memory amounts) {
        require(
            path[path.length - 1] == WNativeCurrency,
            "SwapRouterV1: INVALID_PATH"
        );
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        Helper.safeTransferFrom(
            path[0],
            msg.sender,
            Helper.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]);
        Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]);
    }

    function swapNativeCurrencyForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external override payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH");
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT");
        IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}();
        require(
            IERC20(WNativeCurrency).transfer(
                Helper.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        if (msg.value > amounts[0]) {
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amounts[0]
            );
        }
    }

    function _swapPool(
        IStableSwap pool,
        uint8 fromIndex,
        uint8 toIndex,
        uint256 inAmount,
        uint256 minOutAmount,
        uint256 deadline
    ) private returns (uint256 amountOut) {
        IERC20 coin = pool.getToken(fromIndex);
        coin.safeIncreaseAllowance(address(pool), inAmount);
        amountOut = pool.swap(fromIndex, toIndex, inAmount, minOutAmount, deadline);
    }

    function _swapPoolFromBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) private returns (uint256 amountOut) {
        IERC20 baseToken = basePool.getLpToken();
        uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
        uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens());
        base_amounts[tokenIndexFrom] = dx;
        IERC20 coin = basePool.getToken(tokenIndexFrom);
        coin.safeIncreaseAllowance(address(basePool), dx);
        uint256 baseLpAmount = basePool.addLiquidity(base_amounts, 0, deadline);
        if (baseTokenIndex != tokenIndexTo) {
            amountOut = _swapPool(pool, baseTokenIndex, tokenIndexTo, baseLpAmount, minDy, deadline);
        } else {
            amountOut = baseLpAmount;
        }
    }

    function _swapPoolToBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        uint256 deadline
    ) private returns (uint256 amountOut) {
        IERC20 baseToken = basePool.getLpToken();
        uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
        uint256 tokenLPAmount = dx;
        if (baseTokenIndex != tokenIndexFrom) {
            tokenLPAmount = _swapPool(pool, tokenIndexFrom, baseTokenIndex, dx, 0, deadline);
        }
        baseToken.safeIncreaseAllowance(address(basePool), tokenLPAmount);
        amountOut = basePool.removeLiquidityOneToken(tokenLPAmount, tokenIndexTo, minDy, deadline);
    }

    function swapPool(
        IStableSwap pool,
        uint8 fromIndex,
        uint8 toIndex,
        uint256 inAmount,
        uint256 minOutAmount,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 amountOut) {
        IERC20 coin = pool.getToken(fromIndex);
        coin.safeTransferFrom(msg.sender, address(this), inAmount);
        amountOut = _swapPool(pool, fromIndex, toIndex, inAmount, minOutAmount, deadline);
        IERC20 coinTo = pool.getToken(toIndex);
        coinTo.safeTransfer(to, amountOut);
    }

    function swapPoolFromBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 amountOut) {
        IERC20 coin = basePool.getToken(tokenIndexFrom);
        coin.safeTransferFrom(msg.sender, address(this), dx);
        amountOut = _swapPoolFromBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline);
        IERC20 coinTo = pool.getToken(tokenIndexTo);
        coinTo.safeTransfer(to, amountOut);
    }

    function swapPoolToBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx,
        uint256 minDy,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 amountOut) {
        IERC20 coin = pool.getToken(tokenIndexFrom);
        coin.safeTransferFrom(msg.sender, address(this), dx);
        amountOut = _swapPoolToBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline);
        IERC20 coinTo = basePool.getToken(tokenIndexTo);
        coinTo.safeTransfer(to, amountOut);
    }

    function _anyStableSwap(
        uint256 amountIn,
        Route calldata route,
        uint256 deadline
    ) private returns (address tokenOut, uint256 amountOut) {
        StablePath memory path = _decodeStableSwapCallData(route.callData);
        tokenOut = path.toToken;

        if (address(path.basePool) == address(0)) {
            amountOut = _swapPool(
                path.pool, 
                path.pool.getTokenIndex(path.fromToken), 
                path.pool.getTokenIndex(path.toToken), 
                amountIn, 
                0, 
                deadline
            );
        } else if (path.fromBase) {
            amountOut = _swapPoolFromBase(
                path.pool, 
                path.basePool, 
                path.basePool.getTokenIndex(path.fromToken), 
                path.pool.getTokenIndex(path.toToken), 
                amountIn, 
                0, 
                deadline
            );
        } else {
            amountOut = _swapPoolToBase(
                path.pool,
                path.basePool,
                path.pool.getTokenIndex(path.fromToken), 
                path.basePool.getTokenIndex(path.toToken), 
                amountIn, 
                0,
                deadline
            );
        }
    }

    function _swapThroughStablePool(
        address tokenIn,
        uint256 amountIn,
        Route[] calldata routes,
        uint256 deadline
    ) private returns (address tokenOut, uint256 amountOut) {
        tokenOut = tokenIn;
        amountOut = amountIn;

        for (uint256 i = 0; i < routes.length; i++) {
            if (routes[i].stable) {
               (tokenOut, amountOut) = _anyStableSwap(amountOut, routes[i], deadline);
            } else {
                address[] memory path = _decodeAmmCalldata(routes[i].callData);
                tokenOut = path[path.length - 1];
                uint256[] memory amounts = Helper.getAmountsOut(factory, amountOut, path);
                Helper.safeTransfer(
                    path[0], 
                    Helper.pairFor(factory, path[0], path[1]),
                    amounts[0]
                );
                _swap(amounts, path, address(this));
                amountOut = amounts[amounts.length - 1];
            }
        }
    }

    function swapExactTokensForTokensThroughStablePool(
        uint256 amountIn,
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 amountOut) {
        address tokenIn;
        if (routes[0].stable) {
            tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken;
        } else {
            tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
        }

        Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
        address tokenOut;
        (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline);
        require(
            amountOut >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IERC20(tokenOut).safeTransfer(to, amountOut);
    }

    function swapExactNativeCurrencyForTokensThroughStablePool(
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external override payable ensure(deadline) returns (uint256 amountOut) {
        require(!routes[0].stable, "SwapRouterV1: INVALID_ROUTES");
        address tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
        require(tokenIn == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES");
        IWNativeCurrency(WNativeCurrency).deposit{value: msg.value}();
        address tokenOut;
        (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, msg.value, routes, deadline);
        require(
            amountOut >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IERC20(tokenOut).safeTransfer(to, amountOut);
    }

    function swapExactTokensForNativeCurrencyThroughStablePool(
        uint256 amountIn,
        uint256 amountOutMin,
        Route[] calldata routes,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 amountOut) {
        require(!routes[routes.length - 1].stable, "SwapRouterV1: INVALID_ROUTES");
        address[] memory tokenOutPath = _decodeAmmCalldata(routes[routes.length - 1].callData);
        require(tokenOutPath[tokenOutPath.length - 1] == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES");
        address tokenIn;
        if (routes[0].stable) {
            tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken;
        } else {
            tokenIn = _decodeAmmCalldata(routes[0].callData)[0];
        }
        Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn);
        address tokenOut;
        (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline);
        require(
            amountOut >= amountOutMin,
            "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWNativeCurrency(WNativeCurrency).withdraw(amountOut);
        Helper.safeTransferNativeCurrency(to, amountOut);
    }

    function _decodeAmmCalldata(bytes memory data) private pure returns (address[] memory path) {
        path = abi.decode(data, (address[]));
    }

    function _decodeStableSwapCallData(bytes memory data) 
        private 
        pure 
        returns (StablePath memory path) 
    {
        (
            IStableSwap pool, 
            IStableSwap basePool, 
            address fromToken, 
            address toToken, 
            bool fromBase
        ) = abi.decode(data, (IStableSwap, IStableSwap, address, address, bool));

        return StablePath(pool, basePool, fromToken, toToken, fromBase);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external override pure returns (uint256 amountOut) {
        return Helper.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external override pure returns (uint256 amountIn) {
        return Helper.getAmountOut(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path)
        external
        override
        view
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path)
        external
        override
        view
        returns (uint256[] memory amounts)
    {
        return Helper.getAmountsIn(factory, amountOut, path);
    }

    function calculateSwap(
        IStableSwap pool,
        uint8 fromIndex,
        uint8 toIndex,
        uint256 inAmount
    ) external override view returns (uint256) {
        return pool.calculateSwap(fromIndex, toIndex, inAmount);
    }

    function calculateSwapFromBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external override view returns (uint256) {
        IERC20 baseToken = basePool.getLpToken();
        uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
        uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens());
        base_amounts[tokenIndexFrom] = dx;
        uint256 baseLpAmount = basePool.calculateTokenAmount(base_amounts, true);
        if (baseTokenIndex == tokenIndexTo) {
            return baseLpAmount;
        }
        return pool.calculateSwap(baseTokenIndex, tokenIndexTo, baseLpAmount);
    }

    function calculateSwapToBase(
        IStableSwap pool,
        IStableSwap basePool,
        uint8 tokenIndexFrom,
        uint8 tokenIndexTo,
        uint256 dx
    ) external override view returns (uint256) {
        IERC20 baseToken = basePool.getLpToken();
        uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken));
        uint256 tokenLPAmount = dx;
        if (baseTokenIndex != tokenIndexFrom) {
            tokenLPAmount = pool.calculateSwap(tokenIndexFrom, baseTokenIndex, dx);
        }
        return basePool.calculateRemoveLiquidityOneToken(tokenLPAmount, tokenIndexTo);
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"calculateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapFromBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapToBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"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":"swapExactTokensForNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrencyThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","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":"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"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","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":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolFromBase","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolToBase","outputs":[{"internalType":"uint256","name":"amountOut","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":"swapTokensForExactNativeCurrency","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"}]

60806040523480156200001157600080fd5b506040516200467638038062004676833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b6145ab80620000cb6000396000f3fe60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a01551461032f578063cd1bd0d91461034f578063d06ca61f14610362578063d74fff4e14610382578063dcff1b94146103a2578063f85b7c8b146103c257600080fd5b80638803dbee1461029c5780638a311c57146102bc5780639be7614d146102dc5780639d9270a8146102ef578063b56527bd1461030f57600080fd5b8063419591ed116100f2578063419591ed146102115780634b1d08ca146102495780636dc9c4981461025c578063798af7201461027c57806385f8c2591461015157600080fd5b8063054d50d4146101515780631f00ca74146101845780633214b8c9146101b1578063357b32f0146101d157806338ed1739146101f157600080fd5b3661014c576001546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061017161016c3660046140ed565b6103e2565b6040519081526020015b60405180910390f35b34801561019057600080fd5b506101a461019f366004613fcd565b6103f9565b60405161017b91906141b9565b3480156101bd57600080fd5b506101716101cc366004613d3f565b61041c565b3480156101dd57600080fd5b506101716101ec366004613e82565b61063b565b3480156101fd57600080fd5b506101a461020c36600461407a565b6107ab565b34801561021d57600080fd5b50600154610231906001600160a01b031681565b6040516001600160a01b03909116815260200161017b565b610171610257366004613f66565b61095c565b34801561026857600080fd5b5061017161027736600461407a565b610b4a565b34801561028857600080fd5b50610171610297366004613e31565b610de0565b3480156102a857600080fd5b506101a46102b736600461407a565b610e6c565b3480156102c857600080fd5b506101716102d7366004613d3f565b610f15565b6101a46102ea366004613f66565b611216565b3480156102fb57600080fd5b5061017161030a36600461407a565b611526565b34801561031b57600080fd5b5061017161032a366004613da3565b611637565b34801561033b57600080fd5b50600054610231906001600160a01b031681565b6101a461035d366004613f66565b6117a1565b34801561036e57600080fd5b506101a461037d366004613fcd565b611a3a565b34801561038e57600080fd5b5061017161039d366004613da3565b611a54565b3480156103ae57600080fd5b506101a46103bd36600461407a565b611b4d565b3480156103ce57600080fd5b506101a46103dd36600461407a565b611d78565b60006103ef848484611e87565b90505b9392505050565b600054606090610413906001600160a01b03168484611f8b565b90505b92915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f9190614119565b90508360ff808316908816146105ab5760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b15801561057057600080fd5b505afa158015610584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190613f4d565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a19060440160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190613f4d565b93505050505b95945050505050565b600081428110156106675760405162461bcd60e51b815260040161065e906142a7565b60405180910390fd5b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613bcd565b90506106fa6001600160a01b03821633308a612118565b6107088a8a8a8a8a89612189565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240160206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107879190613bcd565b905061079d6001600160a01b03821687866122c2565b505050979650505050505050565b606081428110156107ce5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610818936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b915086826001845161082a9190614489565b8151811061083a5761083a614514565b602002602001015110156108605760405162461bcd60e51b815260040161065e9061425f565b6109128686600081811061087657610876614514565b905060200201602081019061088b9190613bb0565b6000805433916108f2916001600160a01b0316908b908b90816108b0576108b0614514565b90506020020160208101906108c59190613bb0565b8b8b60018181106108d8576108d8614514565b90506020020160208101906108ed9190613bb0565b612464565b8560008151811061090557610905614514565b60200260200101516124e9565b61095182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b509695505050505050565b6000814281101561097f5760405162461bcd60e51b815260040161065e906142a7565b8585600081811061099257610992614514565b90506020028101906109a491906143c5565b6109b2906020810190613c90565b156109cf5760405162461bcd60e51b815260040161065e906142d6565b6000610a41878760008181106109e7576109e7614514565b90506020028101906109f991906143c5565b610a0790602081019061437e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280292505050565b600081518110610a5357610a53614514565b60209081029190910101516001549091506001600160a01b03808316911614610a8e5760405162461bcd60e51b815260040161065e906142d6565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b50505050506000610b0682348a8a89612818565b9450905088841015610b2a5760405162461bcd60e51b815260040161065e9061425f565b610b3e6001600160a01b03821687866122c2565b50505095945050505050565b60008142811015610b6d5760405162461bcd60e51b815260040161065e906142a7565b8585610b7a600182614489565b818110610b8957610b89614514565b9050602002810190610b9b91906143c5565b610ba9906020810190613c90565b15610bc65760405162461bcd60e51b815260040161065e906142d6565b6000610be78787610bd8600182614489565b8181106109e7576109e7614514565b6001805482519293506001600160a01b0316918391610c0591614489565b81518110610c1557610c15614514565b60200260200101516001600160a01b031614610c435760405162461bcd60e51b815260040161065e906142d6565b600087876000818110610c5857610c58614514565b9050602002810190610c6a91906143c5565b610c78906020810190613c90565b15610cf857610ced88886000818110610c9357610c93614514565b9050602002810190610ca591906143c5565b610cb390602081019061437e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129cf92505050565b604001519050610d2b565b610d0e888860008181106109e7576109e7614514565b600081518110610d2057610d20614514565b602002602001015190505b610d378133308d6124e9565b6000610d46828c8b8b8a612818565b9550905089851015610d6a5760405162461bcd60e51b815260040161065e9061425f565b600154604051632e1a7d4d60e01b8152600481018790526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b50505050610dd28786612a5a565b505050509695505050505050565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610e3457600080fd5b505afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613f4d565b60608142811015610e8f5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610ed9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110610eef57610eef614514565b602002602001015111156108605760405162461bcd60e51b815260040161065e9061430d565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190614119565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613f4d565b67ffffffffffffffff8111156110955761109561452a565b6040519080825280602002602001820160405280156110be578160200160208202803683370190505b50905084818860ff16815181106110d7576110d7614514565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906111149085906001906004016141cc565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613f4d565b90508660ff168360ff16141561117f57935061063292505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190613f4d565b9a9950505050505050505050565b606081428110156112395760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b0316868660008161125657611256614514565b905060200201602081019061126b9190613bb0565b6001600160a01b0316146112915760405162461bcd60e51b815260040161065e90614228565b60005460408051602080890282810182019093528882526112db936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611f8b92505050565b915034826000815181106112f1576112f1614514565b602002602001015111156113175760405162461bcd60e51b815260040161065e9061430d565b60015482516001600160a01b039091169063d0e30db090849060009061133f5761133f614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561137257600080fd5b505af1158015611386573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506113e59350909116908a908a90816113bd576113bd614514565b90506020020160208101906113d29190613bb0565b8a8a60018181106108d8576108d8614514565b846000815181106113f8576113f8614514565b60200260200101516040518363ffffffff1660e01b81526004016114319291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114839190613cad565b61148c57600080fd5b6114cb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b816000815181106114de576114de614514565b602002602001015134111561151c5761151c338360008151811061150457611504614514565b6020026020010151346115179190614489565b612a5a565b5095945050505050565b600081428110156115495760405162461bcd60e51b815260040161065e906142a7565b60008686600081811061155e5761155e614514565b905060200281019061157091906143c5565b61157e906020810190613c90565b156115a45761159987876000818110610c9357610c93614514565b6040015190506115d7565b6115ba878760008181106109e7576109e7614514565b6000815181106115cc576115cc614514565b602002602001015190505b6115e38133308c6124e9565b60006115f2828b8a8a89612818565b94509050888410156116165760405162461bcd60e51b815260040161065e9061425f565b61162a6001600160a01b03821687866122c2565b5050509695505050505050565b6000814281101561165a5760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613bcd565b90506116ed6001600160a01b03821633308a612118565b6116fc8b8b8b8b8b8b8a612b50565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038d16906382b86600906024015b60206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c9190613bcd565b90506117926001600160a01b03821687866122c2565b50505098975050505050505050565b606081428110156117c45760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b031686866000816117e1576117e1614514565b90506020020160208101906117f69190613bb0565b6001600160a01b03161461181c5760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611866936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506122f792505050565b91508682600184516118789190614489565b8151811061188857611888614514565b602002602001015110156118ae5760405162461bcd60e51b815260040161065e9061425f565b60015482516001600160a01b039091169063d0e30db09084906000906118d6576118d6614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506119549350909116908a908a90816113bd576113bd614514565b8460008151811061196757611967614514565b60200260200101516040518363ffffffff1660e01b81526004016119a09291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190613cad565b6119fb57600080fd5b61151c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b600054606090610413906001600160a01b031684846122f7565b60008142811015611a775760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015611abb57600080fd5b505afa158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af39190613bcd565b9050611b0a6001600160a01b03821633308a612118565b611b198b8b8b8b8b8b8a612e6c565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240161172c565b60608142811015611b705760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611b8c9082614489565b818110611b9b57611b9b614514565b9050602002016020810190611bb09190613bb0565b6001600160a01b031614611bd65760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611c20936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611c329190614489565b81518110611c4257611c42614514565b60200260200101511015611c685760405162461bcd60e51b815260040161065e9061425f565b611c7e8686600081811061087657610876614514565b611cbd82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612627915050565b6001805483516001600160a01b0390911691632e1a7d4d918591611ce091614489565b81518110611cf057611cf0614514565b60200260200101516040518263ffffffff1660e01b8152600401611d1691815260200190565b600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050610951848360018551611d5b9190614489565b81518110611d6b57611d6b614514565b6020026020010151612a5a565b60608142811015611d9b5760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611db79082614489565b818110611dc657611dc6614514565b9050602002016020810190611ddb9190613bb0565b6001600160a01b031614611e015760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611e4b936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110611e6157611e61614514565b60200260200101511115611c685760405162461bcd60e51b815260040161065e9061430d565b6000808411611ee25760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b606482015260840161065e565b600083118015611ef25750600082115b611f3e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b6000611f4c856103e5613035565b90506000611f5a8285613035565b90506000611f7483611f6e886103e8613035565b9061309c565b9050611f808183614448565b979650505050505050565b6060600282511015611fd65760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff811115611ff057611ff061452a565b604051908082528060200260200182016040528015612019578160200160208202803683370190505b50905082816001835161202c9190614489565b8151811061203c5761203c614514565b6020026020010181815250506000600183516120589190614489565b90505b8015612110576000806120ab8786612074600187614489565b8151811061208457612084614514565b602002602001015187868151811061209e5761209e614514565b60200260200101516130f1565b915091506120d38484815181106120c4576120c4614514565b602002602001015183836131ca565b846120df600186614489565b815181106120ef576120ef614514565b60200260200101818152505050508080612108906144cc565b91505061205b565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121839085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526132c9565b50505050565b60405162415c3360e91b815260ff8616600482015260009081906001600160a01b038916906382b866009060240160206040518083038186803b1580156121cf57600080fd5b505afa1580156121e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122079190613bcd565b905061221d6001600160a01b038216898761339b565b6040516348b4aac360e11b815260ff8089166004830152871660248201526044810186905260648101859052608481018490526001600160a01b0389169063916955869060a401602060405180830381600087803b15801561227e57600080fd5b505af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190613f4d565b98975050505050505050565b6040516001600160a01b0383166024820152604481018290526122f290849063a9059cbb60e01b9060640161214c565b505050565b60606002825110156123425760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff81111561235c5761235c61452a565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160008151811061239c5761239c614514565b60200260200101818152505060005b600183516123b99190614489565b811015612110576000806123ff878685815181106123d9576123d9614514565b6020026020010151878660016123ef9190614430565b8151811061209e5761209e614514565b9150915061242784848151811061241857612418614514565b60200260200101518383611e87565b84612433856001614430565b8151811061244357612443614514565b6020026020010181815250505050808061245c906144e3565b9150506123ab565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190613bcd565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161254d919061419d565b6000604051808303816000865af19150503d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b50915091508180156125b95750805115806125b95750808060200190518101906125b99190613cad565b61261f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161065e565b505050505050565b60005b600183516126389190614489565b8110156121835760008084838151811061265457612654614514565b60200260200101518584600161266a9190614430565b8151811061267a5761267a614514565b6020026020010151915091506000612692838361345c565b5090506000876126a3866001614430565b815181106126b3576126b3614514565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126e1578260006126e5565b6000835b91509150600060028a516126f99190614489565b8810612705578861273f565b60005461273f906001600160a01b0316878c6127228c6002614430565b8151811061273257612732614514565b6020026020010151612464565b600054909150612759906001600160a01b03168888612464565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612796576020820181803683370190505b506040518563ffffffff1660e01b81526004016127b69493929190614351565b600060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050505050505050505080806127fa906144e3565b91505061262a565b6060818060200190518101906104169190613bea565b848460005b848110156129c45785858281811061283757612837614514565b905060200281019061284991906143c5565b612857906020810190613c90565b156128945761288a8287878481811061287257612872614514565b905060200281019061288491906143c5565b8661353d565b90935091506129b2565b60006128ab8787848181106109e7576109e7614514565b905080600182516128bc9190614489565b815181106128cc576128cc614514565b6020026020010151935060006128f660008054906101000a90046001600160a01b031685846122f7565b905061297b8260008151811061290e5761290e614514565b602002602001015161295b60008054906101000a90046001600160a01b03168560008151811061294057612940614514565b60200260200101518660018151811061273257612732614514565b8360008151811061296e5761296e614514565b60200260200101516138c4565b612986818330612627565b80600182516129959190614489565b815181106129a5576129a5614514565b6020026020010151935050505b806129bc816144e3565b91505061281d565b509550959350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080600080600086806020019051810190612a169190613cca565b6040805160a0810182526001600160a01b03968716815294861660208601529285169284019290925290921660608201529015156080820152979650505050505050565b604080516000808252602082019092526001600160a01b038416908390604051612a84919061419d565b60006040518083038185875af1925050503d8060008114612ac1576040519150601f19603f3d011682016040523d82523d6000602084013e612ac6565b606091505b50509050806122f25760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a40161065e565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8c57600080fd5b505afa158015612ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc49190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614119565b90506000896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190613f4d565b67ffffffffffffffff811115612cd057612cd061452a565b604051908082528060200260200182016040528015612cf9578160200160208202803683370190505b50905086818a60ff1681518110612d1257612d12614514565b602090810291909101015260405162415c3360e91b815260ff8a1660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015612d6157600080fd5b505afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613bcd565b9050612daf6001600160a01b0382168c8a61339b565b604051634d49e87d60e01b81526000906001600160a01b038d1690634d49e87d90612de290869085908c906004016141f0565b602060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613f4d565b90508960ff168460ff1614612e5857612e518d858c848c8c612189565b9550612e5c565b8095505b5050505050979650505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee09190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612f2757600080fd5b505afa158015612f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5f9190614119565b90508560ff808316908a1614612f8157612f7e8b8a848a60008a612189565b90505b612f956001600160a01b0384168b8361339b565b6040516301f1d0ab60e51b81526004810182905260ff8916602482015260448101879052606481018690526001600160a01b038b1690633e3a156090608401602060405180830381600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130269190613f4d565b9b9a5050505050505050505050565b60008115806130595750828261304b818361446a565b92506130579083614448565b145b6104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161065e565b6000826130a98382614430565b91508110156104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161065e565b6000806000613100858561345c565b509050600080613111888888612464565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561314957600080fd5b505afa15801561315d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131819190613efd565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146131b85780826131bb565b81815b90999098509650505050505050565b60008084116132265760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b606482015260840161065e565b6000831180156132365750600082115b6132825760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b600061329a6103e86132948688613035565b90613035565b905060006132ae6103e561329486896139f5565b90506132bf6001611f6e8385614448565b9695505050505050565b600061331e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a4b9092919063ffffffff16565b8051909150156122f2578080602001905181019061333c9190613cad565b6122f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156133e757600080fd5b505afa1580156133fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341f9190613f4d565b6134299190614430565b6040516001600160a01b03851660248201526044810182905290915061218390859063095ea7b360e01b9060640161214c565b600080826001600160a01b0316846001600160a01b031614156134c15760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f4144445245535345530000000000604482015260640161065e565b826001600160a01b0316846001600160a01b0316106134e15782846134e4565b83835b90925090506001600160a01b0382166135365760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b604482015260640161065e565b9250929050565b60008080613551610cb3602087018761437e565b606081015160208201519094509091506001600160a01b031661368357805160408083015190516319b02f4960e21b81526001600160a01b03918216600482015261367c92918216906366c0bd249060240160206040518083038186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f39190614119565b835160608501516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561363b57600080fd5b505afa15801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136739190614119565b89600089612189565b91506138bb565b8060800151156137a1578051602082015160408084015190516319b02f4960e21b81526001600160a01b03918216600482015261367c9392918216906366c0bd249060240160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614119565b845160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137989190614119565b8a60008a612b50565b8051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526138b89392918316906366c0bd249060240160206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c9190614119565b602085015160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561387757600080fd5b505afa15801561388b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138af9190614119565b8a60008a612e6c565b91505b50935093915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613920919061419d565b6000604051808303816000865af19150503d806000811461395d576040519150601f19603f3d011682016040523d82523d6000602084013e613962565b606091505b509150915081801561398c57508051158061398c57508080602001905181019061398c9190613cad565b6139ee5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161065e565b5050505050565b600082613a028382614489565b91508111156104165760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161065e565b60606103ef8484600085856001600160a01b0385163b613aad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065e565b600080866001600160a01b03168587604051613ac9919061419d565b60006040518083038185875af1925050503d8060008114613b06576040519150601f19603f3d011682016040523d82523d6000602084013e613b0b565b606091505b5091509150611f8082828660608315613b255750816103f2565b825115613b355782518084602001fd5b8160405162461bcd60e51b815260040161065e9190614215565b60008083601f840112613b6157600080fd5b50813567ffffffffffffffff811115613b7957600080fd5b6020830191508360208260051b850101111561353657600080fd5b80516001600160701b0381168114613bab57600080fd5b919050565b600060208284031215613bc257600080fd5b81356103f281614540565b600060208284031215613bdf57600080fd5b81516103f281614540565b60006020808385031215613bfd57600080fd5b825167ffffffffffffffff811115613c1457600080fd5b8301601f81018513613c2557600080fd5b8051613c38613c338261440c565b6143db565b80828252848201915084840188868560051b8701011115613c5857600080fd5b600094505b83851015613c84578051613c7081614540565b835260019490940193918501918501613c5d565b50979650505050505050565b600060208284031215613ca257600080fd5b81356103f281614558565b600060208284031215613cbf57600080fd5b81516103f281614558565b600080600080600060a08688031215613ce257600080fd5b8551613ced81614540565b6020870151909550613cfe81614540565b6040870151909450613d0f81614540565b6060870151909350613d2081614540565b6080870151909250613d3181614558565b809150509295509295909350565b600080600080600060a08688031215613d5757600080fd5b8535613d6281614540565b94506020860135613d7281614540565b93506040860135613d8281614566565b92506060860135613d9281614566565b949793965091946080013592915050565b600080600080600080600080610100898b031215613dc057600080fd5b8835613dcb81614540565b97506020890135613ddb81614540565b96506040890135613deb81614566565b95506060890135613dfb81614566565b94506080890135935060a0890135925060c0890135613e1981614540565b8092505060e089013590509295985092959890939650565b60008060008060808587031215613e4757600080fd5b8435613e5281614540565b93506020850135613e6281614566565b92506040850135613e7281614566565b9396929550929360600135925050565b600080600080600080600060e0888a031215613e9d57600080fd5b8735613ea881614540565b96506020880135613eb881614566565b95506040880135613ec881614566565b9450606088013593506080880135925060a0880135613ee681614540565b8092505060c0880135905092959891949750929550565b600080600060608486031215613f1257600080fd5b613f1b84613b94565b9250613f2960208501613b94565b9150604084015163ffffffff81168114613f4257600080fd5b809150509250925092565b600060208284031215613f5f57600080fd5b5051919050565b600080600080600060808688031215613f7e57600080fd5b85359450602086013567ffffffffffffffff811115613f9c57600080fd5b613fa888828901613b4f565b9095509350506040860135613fbc81614540565b949793965091946060013592915050565b60008060408385031215613fe057600080fd5b8235915060208084013567ffffffffffffffff811115613fff57600080fd5b8401601f8101861361401057600080fd5b803561401e613c338261440c565b80828252848201915084840189868560051b870101111561403e57600080fd5b600094505b8385101561406a57803561405681614540565b835260019490940193918501918501614043565b5080955050505050509250929050565b60008060008060008060a0878903121561409357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156140b857600080fd5b6140c489828a01613b4f565b90955093505060608701356140d881614540565b80925050608087013590509295509295509295565b60008060006060848603121561410257600080fd5b505081359360208301359350604090920135919050565b60006020828403121561412b57600080fd5b81516103f281614566565b600081518084526020808501945080840160005b838110156141665781518752958201959082019060010161414a565b509495945050505050565b600081518084526141898160208601602086016144a0565b601f01601f19169290920160200192915050565b600082516141af8184602087016144a0565b9190910192915050565b6020815260006104136020830184614136565b6040815260006141df6040830185614136565b905082151560208301529392505050565b6060815260006142036060830186614136565b60208301949094525060400152919050565b6020815260006104136020830184614171565b6020808252601a908201527f53776170526f7574657256313a20494e56414c49445f50415448000000000000604082015260600190565b60208082526028908201527f53776170526f7574657256313a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b60208082526015908201527414ddd85c149bdd5d195c958c4e8811561412549151605a1b604082015260600190565b6020808252601c908201527f53776170526f7574657256313a20494e56414c49445f524f5554455300000000604082015260600190565b60208082526024908201527f53776170526f7574657256313a204558434553534956455f494e5055545f414d60408201526313d5539560e21b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260006132bf6080830184614171565b6000808335601e1984360301811261439557600080fd5b83018035915067ffffffffffffffff8211156143b057600080fd5b60200191503681900382131561353657600080fd5b60008235603e198336030181126141af57600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144045761440461452a565b604052919050565b600067ffffffffffffffff8211156144265761442661452a565b5060051b60200190565b60008219821115614443576144436144fe565b500190565b60008261446557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614484576144846144fe565b500290565b60008282101561449b5761449b6144fe565b500390565b60005b838110156144bb5781810151838201526020016144a3565b838111156121835750506000910152565b6000816144db576144db6144fe565b506000190190565b60006000198214156144f7576144f76144fe565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461455557600080fd5b50565b801515811461455557600080fd5b60ff8116811461455557600080fdfea2646970667358221220c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c44364736f6c6343000807003300000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d3800000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

00000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d3800000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _factory (address): 0x28eaa01dc747c4e9d37c5ca473e7d167e90f8d38
Arg [1] : _WNativeCurrency (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d38
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

36710:19261:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37416:15;;-1:-1:-1;;;;;37416:15:0;37402:10;:29;37394:38;;;;;;36710:19261;;;;;53368:242;;;;;;;;;;-1:-1:-1;53368:242:0;;;;;:::i;:::-;;:::i;:::-;;;23514:25:1;;;23502:2;23487:18;53368:242:0;;;;;;;;54110:234;;;;;;;;;;-1:-1:-1;54110:234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55351:617::-;;;;;;;;;;-1:-1:-1;55351:617:0;;;;;:::i;:::-;;:::i;45480:583::-;;;;;;;;;;-1:-1:-1;45480:583:0;;;;;:::i;:::-;;:::i;38318:677::-;;;;;;;;;;-1:-1:-1;38318:677:0;;;;;:::i;:::-;;:::i;37028:39::-;;;;;;;;;;-1:-1:-1;37028:39:0;;;;-1:-1:-1;;;;;37028:39:0;;;;;;-1:-1:-1;;;;;13470:32:1;;;13452:51;;13440:2;13425:18;37028:39:0;13306:203:1;50615:850:0;;;;;;:::i;:::-;;:::i;51473:1251::-;;;;;;;;;;-1:-1:-1;51473:1251:0;;;;;:::i;:::-;;:::i;54352:249::-;;;;;;;;;;-1:-1:-1;54352:249:0;;;;;:::i;:::-;;:::i;39003:618::-;;;;;;;;;;-1:-1:-1;39003:618:0;;;;;:::i;:::-;;:::i;54609:734::-;;;;;;;;;;-1:-1:-1;54609:734:0;;;;;:::i;:::-;;:::i;42381:941::-;;;;;;:::i;:::-;;:::i;49720:887::-;;;;;;;;;;-1:-1:-1;49720:887:0;;;;;:::i;:::-;;:::i;46071:642::-;;;;;;;;;;-1:-1:-1;46071:642:0;;;;;:::i;:::-;;:::i;36990:31::-;;;;;;;;;;-1:-1:-1;36990:31:0;;;;-1:-1:-1;;;;;36990:31:0;;;39629:823;;;;;;:::i;:::-;;:::i;53868:234::-;;;;;;;;;;-1:-1:-1;53868:234:0;;;;;:::i;:::-;;:::i;46721:638::-;;;;;;;;;;-1:-1:-1;46721:638:0;;;;;:::i;:::-;;:::i;41391:982::-;;;;;;;;;;-1:-1:-1;41391:982:0;;;;;:::i;:::-;;:::i;40460:923::-;;;;;;;;;;-1:-1:-1;40460:923:0;;;;;:::i;:::-;;:::i;53368:242::-;53513:17;53550:52;53570:8;53580:9;53591:10;53550:19;:52::i;:::-;53543:59;;53368:242;;;;;;:::o;54110:234::-;54311:7;;54242:24;;54291:45;;-1:-1:-1;;;;;54311:7:0;54320:9;54331:4;54291:19;:45::i;:::-;54284:52;;54110:234;;;;;:::o;55351:617::-;55558:7;55578:16;55597:8;-1:-1:-1;;;;;55597:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55652:38;;-1:-1:-1;;;55652:38:0;;-1:-1:-1;;;;;13470:32:1;;;55652:38:0;;;13452:51:1;55578:40:0;;-1:-1:-1;55629:20:0;;55652:18;;;;;13425::1;;55652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55629:61;-1:-1:-1;55725:2:0;55742:32;;;;;;;;55738:135;;55807:54;;-1:-1:-1;;;55807:54:0;;25089:4:1;25077:17;;;55807:54:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55807:18:0;;;;;25032::1;;55807:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55791:70;;55738:135;55890:70;;-1:-1:-1;;;55890:70:0;;;;;24183:25:1;;;24256:4;24244:17;;24224:18;;;24217:45;-1:-1:-1;;;;;55890:41:0;;;;;24156:18:1;;55890:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55883:77;;;;;55351:617;;;;;;;;:::o;45480:583::-;45732:17;45713:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;;;;;;;;;45776:24:::1;::::0;-1:-1:-1;;;45776:24:0;;24848:4:1;24836:17;;45776:24:0::1;::::0;::::1;24818:36:1::0;45762:11:0::1;::::0;-1:-1:-1;;;;;45776:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45776:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45762:38:::0;-1:-1:-1;45811:58:0::1;-1:-1:-1::0;;;;;45811:21:0;::::1;45833:10;45853:4;45860:8:::0;45811:21:::1;:58::i;:::-;45892:69;45902:4;45908:9;45919:7;45928:8;45938:12;45952:8;45892:9;:69::i;:::-;45988:22;::::0;-1:-1:-1;;;45988:22:0;;24848:4:1;24836:17;;45988:22:0::1;::::0;::::1;24818:36:1::0;45880:81:0;;-1:-1:-1;45972:13:0::1;::::0;-1:-1:-1;;;;;45988:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45988:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45972:38:::0;-1:-1:-1;46021:34:0::1;-1:-1:-1::0;;;;;46021:19:0;::::1;46041:2:::0;46045:9;46021:19:::1;:34::i;:::-;45751:312;;45480:583:::0;;;;;;;;;;:::o;38318:677::-;38543:24;38524:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;38611:7:::1;::::0;38590:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;38611:7:0::1;::::0;38620:8;;38590:45;38630:4;;;;;;38590:45;;::::1;::::0;38630:4;;38590:45;38630:4;38590:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;38590:20:0::1;::::0;-1:-1:-1;;;38590:45:0:i:1;:::-;38580:55;;38699:12;38668:7;38693:1;38676:7;:14;:18;;;;:::i;:::-;38668:27;;;;;;;;:::i;:::-;;;;;;;:43;;38646:133;;;;-1:-1:-1::0;;;38646:133:0::1;;;;;;;:::i;:::-;38790:162;38828:4;;38833:1;38828:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38890;::::0;;38850:10:::1;::::0;38875:41:::1;::::0;-1:-1:-1;;;;;38890:7:0::1;::::0;38899:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38908:4;;38913:1;38908:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38875:14;:41::i;:::-;38931:7;38939:1;38931:10;;;;;;;;:::i;:::-;;;;;;;38790:23;:162::i;:::-;38963:24;38969:7;38978:4;;38963:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38984:2:0;;-1:-1:-1;38963:5:0::1;::::0;-1:-1:-1;;38963:24:0:i:1;:::-;38318:677:::0;;;;;;;;;:::o;50615:850::-;50846:17;50827:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;50885:6:::1;;50892:1;50885:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50884:17;50876:58;;;;-1:-1:-1::0;;;50876:58:0::1;;;;;;;:::i;:::-;50945:15;50963:38;50982:6;;50989:1;50982:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50963:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50963:18:0::1;::::0;-1:-1:-1;;;50963:38:0:i:1;:::-;51002:1;50963:41;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;51034:15:::1;::::0;50963:41;;-1:-1:-1;;;;;;51023:26:0;;::::1;51034:15:::0;::::1;51023:26;51015:67;;;;-1:-1:-1::0;;;51015:67:0::1;;;;;;;:::i;:::-;51110:15;;;;;;;;;-1:-1:-1::0;;;;;51110:15:0::1;-1:-1:-1::0;;;;;51093:41:0::1;;51142:9;51093:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;51165:16;51216:60;51239:7;51248:9;51259:6;;51267:8;51216:22;:60::i;:::-;51192:84:::0;-1:-1:-1;51192:84:0;-1:-1:-1;51309:25:0;;::::1;;51287:115;;;;-1:-1:-1::0;;;51287:115:0::1;;;;;;;:::i;:::-;51413:44;-1:-1:-1::0;;;;;51413:29:0;::::1;51443:2:::0;51447:9;51413:29:::1;:44::i;:::-;50865:600;;50615:850:::0;;;;;;;;:::o;51473:1251::-;51723:17;51704:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;51762:6;;51769:17:::1;51785:1;51762:6:::0;51769:17:::1;:::i;:::-;51762:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;51761:33;51753:74;;;;-1:-1:-1::0;;;51753:74:0::1;;;;;;;:::i;:::-;51838:29;51870:54;51889:6:::0;;51896:17:::1;51912:1;51889:6:::0;51896:17:::1;:::i;:::-;51889:25;;;;;;;:::i;51870:54::-;51984:15;::::0;;51956:19;;51838:86;;-1:-1:-1;;;;;;51984:15:0::1;::::0;51838:86;;51956:23:::1;::::0;::::1;:::i;:::-;51943:37;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;51943:56:0::1;;51935:97;;;;-1:-1:-1::0;;;51935:97:0::1;;;;;;;:::i;:::-;52043:15;52073:6;;52080:1;52073:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52069:198;;;52116:45;52142:6;;52149:1;52142:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52116:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;52116:25:0::1;::::0;-1:-1:-1;;;52116:45:0:i:1;:::-;:55;;;52106:65;;52069:198;;;52214:38;52233:6;;52240:1;52233:9;;;;;;;:::i;52214:38::-;52253:1;52214:41;;;;;;;;:::i;:::-;;;;;;;52204:51;;52069:198;52277:69;52301:7;52310:10;52330:4;52337:8;52277:23;:69::i;:::-;52357:16;52408:59;52431:7;52440:8;52450:6;;52458:8;52408:22;:59::i;:::-;52384:83:::0;-1:-1:-1;52384:83:0;-1:-1:-1;52500:25:0;;::::1;;52478:115;;;;-1:-1:-1::0;;;52478:115:0::1;;;;;;;:::i;:::-;52621:15;::::0;52604:53:::1;::::0;-1:-1:-1;;;52604:53:0;;::::1;::::0;::::1;23514:25:1::0;;;-1:-1:-1;;;;;52621:15:0;;::::1;::::0;52604:42:::1;::::0;23487:18:1;;52604:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52668:48;52702:2;52706:9;52668:33;:48::i;:::-;51742:982;;;51473:1251:::0;;;;;;;;;:::o;54352:249::-;54545:48;;-1:-1:-1;;;54545:48:0;;25089:4:1;25077:17;;;54545:48:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;54518:7:0;;-1:-1:-1;;;;;54545:18:0;;;;;25032::1;;54545:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39003:618::-;39228:24;39209:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39295:7:::1;::::0;39275:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39295:7:0::1;::::0;39304:9;;39275:45;39315:4;;;;;;39275:45;;::::1;::::0;39315:4;;39275:45;39315:4;39275:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39275:19:0::1;::::0;-1:-1:-1;;;39275:45:0:i:1;:::-;39265:55;;39353:11;39339:7;39347:1;39339:10;;;;;;;;:::i;:::-;;;;;;;:25;;39331:74;;;;-1:-1:-1::0;;;39331:74:0::1;;;;;;;:::i;54609:734::-:0;54818:7;54838:16;54857:8;-1:-1:-1;;;;;54857:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54912:38;;-1:-1:-1;;;54912:38:0;;-1:-1:-1;;;;;13470:32:1;;;54912:38:0;;;13452:51:1;54838:40:0;;-1:-1:-1;54889:20:0;;54912:18;;;;;13425::1;;54912:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54889:61;;54961:29;55007:8;-1:-1:-1;;;;;55007:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54993:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54993:43:0;;54961:75;;55078:2;55047:12;55060:14;55047:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;55114:49;;-1:-1:-1;;;55114:49:0;;55091:20;;-1:-1:-1;;;;;55114:29:0;;;;;:49;;55144:12;;55158:4;;55114:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55091:72;;55196:12;55178:30;;:14;:30;;;55174:82;;;55232:12;-1:-1:-1;55225:19:0;;-1:-1:-1;;;55225:19:0;55174:82;55273:62;;-1:-1:-1;;;55273:62:0;;25089:4:1;25077:17;;;55273:62:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55273:18:0;;;;;25032::1;;55273:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55266:69;54609:734;-1:-1:-1;;;;;;;;;;54609:734:0:o;42381:941::-;42592:24;42573:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;42648:15:::1;::::0;-1:-1:-1;;;;;42648:15:0::1;42637:4:::0;;42648:15:::1;42637:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42637:26:0::1;;42629:65;;;;-1:-1:-1::0;;;42629:65:0::1;;;;;;;:::i;:::-;42735:7;::::0;42715:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;42735:7:0::1;::::0;42744:9;;42715:45;42755:4;;;;;;42715:45;;::::1;::::0;42755:4;;42715:45;42755:4;42715:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;42715:19:0::1;::::0;-1:-1:-1;;;42715:45:0:i:1;:::-;42705:55;;42793:9;42779:7;42787:1;42779:10;;;;;;;;:::i;:::-;;;;;;;:23;;42771:72;;;;-1:-1:-1::0;;;42771:72:0::1;;;;;;;:::i;:::-;42871:15;::::0;42903:10;;-1:-1:-1;;;;;42871:15:0;;::::1;::::0;42854:41:::1;::::0;42903:7;;42871:15:::1;::::0;42903:10:::1;;;;:::i;:::-;;;;;;;42854:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42956:15:0::1;::::0;::::1;43015:7:::0;;-1:-1:-1;;;;;42956:15:0;;::::1;::::0;-1:-1:-1;42949:32:0::1;::::0;-1:-1:-1;43000:41:0::1;::::0;-1:-1:-1;43015:7:0;;::::1;::::0;43024:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43033:4;;43038:1;43033:7;;;;;;;:::i;43000:41::-;43060:7;43068:1;43060:10;;;;;;;;:::i;:::-;;;;;;;42949:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;42949:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42927:169;;;::::0;::::1;;43107:24;43113:7;43122:4;;43107:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43128:2:0;;-1:-1:-1;43107:5:0::1;::::0;-1:-1:-1;;43107:24:0:i:1;:::-;43158:7;43166:1;43158:10;;;;;;;;:::i;:::-;;;;;;;43146:9;:22;43142:173;;;43185:118;43237:10;43278:7;43286:1;43278:10;;;;;;;;:::i;:::-;;;;;;;43266:9;:22;;;;:::i;:::-;43185:33;:118::i;:::-;42381:941:::0;;;;;;;;:::o;49720:887::-;49962:17;49943:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;49992:15:::1;50022:6;;50029:1;50022:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50018:198;;;50065:45;50091:6;;50098:1;50091:9;;;;;;;:::i;50065:45::-;:55;;;50055:65;;50018:198;;;50163:38;50182:6;;50189:1;50182:9;;;;;;;:::i;50163:38::-;50202:1;50163:41;;;;;;;;:::i;:::-;;;;;;;50153:51;;50018:198;50228:69;50252:7;50261:10;50281:4;50288:8;50228:23;:69::i;:::-;50308:16;50359:59;50382:7;50391:8;50401:6;;50409:8;50359:22;:59::i;:::-;50335:83:::0;-1:-1:-1;50335:83:0;-1:-1:-1;50451:25:0;;::::1;;50429:115;;;;-1:-1:-1::0;;;50429:115:0::1;;;;;;;:::i;:::-;50555:44;-1:-1:-1::0;;;;;50555:29:0;::::1;50585:2:::0;50589:9;50555:29:::1;:44::i;:::-;49981:626;;49720:887:::0;;;;;;;;;:::o;46071:642::-;46359:17;46340:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;46403:33:::1;::::0;-1:-1:-1;;;46403:33:0;;24848:4:1;24836:17;;46403:33:0::1;::::0;::::1;24818:36:1::0;46389:11:0::1;::::0;-1:-1:-1;;;;;46403:17:0;::::1;::::0;::::1;::::0;24791:18:1;;46403:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46389:47:::0;-1:-1:-1;46447:52:0::1;-1:-1:-1::0;;;;;46447:21:0;::::1;46469:10;46489:4;46496:2:::0;46447:21:::1;:52::i;:::-;46522:84;46540:4;46546:8;46556:14;46572:12;46586:2;46590:5;46597:8;46522:17;:84::i;:::-;46633:27;::::0;-1:-1:-1;;;46633:27:0;;24848:4:1;24836:17;;46633:27:0::1;::::0;::::1;24818:36:1::0;46510:96:0;;-1:-1:-1;46617:13:0::1;::::0;-1:-1:-1;;;;;46633:13:0;::::1;::::0;::::1;::::0;24791:18:1;;46633:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46617:43:::0;-1:-1:-1;46671:34:0::1;-1:-1:-1::0;;;;;46671:19:0;::::1;46691:2:::0;46695:9;46671:19:::1;:34::i;:::-;46378:335;;46071:642:::0;;;;;;;;;;;:::o;39629:823::-;39843:24;39824:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39899:15:::1;::::0;-1:-1:-1;;;;;39899:15:0::1;39888:4:::0;;39899:15:::1;39888:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39888:26:0::1;;39880:65;;;;-1:-1:-1::0;;;39880:65:0::1;;;;;;;:::i;:::-;39987:7;::::0;39966:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39987:7:0::1;::::0;39996:9:::1;::::0;39966:46;40007:4;;;;;;39966:46;;::::1;::::0;40007:4;;39966:46;40007:4;39966:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39966:20:0::1;::::0;-1:-1:-1;;;39966:46:0:i:1;:::-;39956:56;;40076:12;40045:7;40070:1;40053:7;:14;:18;;;;:::i;:::-;40045:27;;;;;;;;:::i;:::-;;;;;;;:43;;40023:133;;;;-1:-1:-1::0;;;40023:133:0::1;;;;;;;:::i;:::-;40184:15;::::0;40216:10;;-1:-1:-1;;;;;40184:15:0;;::::1;::::0;40167:41:::1;::::0;40216:7;;40184:15:::1;::::0;40216:10:::1;;;;:::i;:::-;;;;;;;40167:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40269:15:0::1;::::0;::::1;40328:7:::0;;-1:-1:-1;;;;;40269:15:0;;::::1;::::0;-1:-1:-1;40262:32:0::1;::::0;-1:-1:-1;40313:41:0::1;::::0;-1:-1:-1;40328:7:0;;::::1;::::0;40337:4;;;;:7;::::1;;;;:::i;40313:41::-;40373:7;40381:1;40373:10;;;;;;;;:::i;:::-;;;;;;;40262:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;40262:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40240:169;;;::::0;::::1;;40420:24;40426:7;40435:4;;40420:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;40441:2:0;;-1:-1:-1;40420:5:0::1;::::0;-1:-1:-1;;40420:24:0:i:1;53868:234::-:0;54070:7;;54000:24;;54049:45;;-1:-1:-1;;;;;54070:7:0;54079:8;54089:4;54049:20;:45::i;46721:638::-;47007:17;46988:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;47051:29:::1;::::0;-1:-1:-1;;;47051:29:0;;24848:4:1;24836:17;;47051:29:0::1;::::0;::::1;24818:36:1::0;47037:11:0::1;::::0;-1:-1:-1;;;;;47051:13:0;::::1;::::0;::::1;::::0;24791:18:1;;47051:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47037:43:::0;-1:-1:-1;47091:52:0::1;-1:-1:-1::0;;;;;47091:21:0;::::1;47113:10;47133:4;47140:2:::0;47091:21:::1;:52::i;:::-;47166:82;47182:4;47188:8;47198:14;47214:12;47228:2;47232:5;47239:8;47166:15;:82::i;:::-;47275:31;::::0;-1:-1:-1;;;47275:31:0;;24848:4:1;24836:17;;47275:31:0::1;::::0;::::1;24818:36:1::0;47154:94:0;;-1:-1:-1;47259:13:0::1;::::0;-1:-1:-1;;;;;47275:17:0;::::1;::::0;::::1;::::0;24791:18:1;;47275:31:0::1;24676:184:1::0;41391:982:0;41624:24;41605:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;41708:15:::1;::::0;;-1:-1:-1;;;;;41708:15:0::1;::::0;41683:4;;;;41688:15:::1;::::0;41683:4;41688:15:::1;:::i;:::-;41683:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41683:40:0::1;;41661:116;;;;-1:-1:-1::0;;;41661:116:0::1;;;;;;;:::i;:::-;41819:7;::::0;41798:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;41819:7:0::1;::::0;41828:8;;41798:45;41838:4;;;;;;41798:45;;::::1;::::0;41838:4;;41798:45;41838:4;41798:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;41798:20:0::1;::::0;-1:-1:-1;;;41798:45:0:i:1;:::-;41788:55;;41907:12;41876:7;41901:1;41884:7;:14;:18;;;;:::i;:::-;41876:27;;;;;;;;:::i;:::-;;;;;;;:43;;41854:133;;;;-1:-1:-1::0;;;41854:133:0::1;;;;;;;:::i;:::-;41998:162;42036:4;;42041:1;42036:7;;;;;;;:::i;41998:162::-;42171:35;42177:7;42186:4;;42171:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42200:4:0::1;::::0;-1:-1:-1;42171:5:0::1;::::0;-1:-1:-1;;42171:35:0:i:1;:::-;42234:15;::::0;;42268:14;;-1:-1:-1;;;;;42234:15:0;;::::1;::::0;42217:42:::1;::::0;42260:7;;42268:18:::1;::::0;::::1;:::i;:::-;42260:27;;;;;;;;:::i;:::-;;;;;;;42217:71;;;;;;;;;;;;;23514:25:1::0;;23502:2;23487:18;;23368:177;42217:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42299:66;42333:2;42337:7;42362:1;42345:7;:14;:18;;;;:::i;:::-;42337:27;;;;;;;;:::i;:::-;;;;;;;42299:33;:66::i;40460:923::-:0;40693:24;40674:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;40777:15:::1;::::0;;-1:-1:-1;;;;;40777:15:0::1;::::0;40752:4;;;;40757:15:::1;::::0;40752:4;40757:15:::1;:::i;:::-;40752:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40752:40:0::1;;40730:116;;;;-1:-1:-1::0;;;40730:116:0::1;;;;;;;:::i;:::-;40887:7;::::0;40867:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;40887:7:0::1;::::0;40896:9;;40867:45;40907:4;;;;;;40867:45;;::::1;::::0;40907:4;;40867:45;40907:4;40867:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;40867:19:0::1;::::0;-1:-1:-1;;;40867:45:0:i:1;:::-;40857:55;;40945:11;40931:7;40939:1;40931:10;;;;;;;;:::i;:::-;;;;;;;:25;;40923:74;;;;-1:-1:-1::0;;;40923:74:0::1;;;;;;;:::i;7009:589::-:0;7145:17;7194:1;7183:8;:12;7175:58;;;;-1:-1:-1;;;7175:58:0;;23168:2:1;7175:58:0;;;23150:21:1;23207:2;23187:18;;;23180:30;23246:34;23226:18;;;23219:62;-1:-1:-1;;;23297:18:1;;;23290:31;23338:19;;7175:58:0;22966:397:1;7175:58:0;7278:1;7266:9;:13;:31;;;;;7296:1;7283:10;:14;7266:31;7244:111;;;;-1:-1:-1;;;7244:111:0;;22049:2:1;7244:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7244:111:0;21847:354:1;7244:111:0;7366:23;7392:17;:8;7405:3;7392:12;:17::i;:::-;7366:43;-1:-1:-1;7420:17:0;7440:31;7366:43;7460:10;7440:19;:31::i;:::-;7420:51;-1:-1:-1;7482:19:0;7504:40;7528:15;7504:19;:9;7518:4;7504:13;:19::i;:::-;:23;;:40::i;:::-;7482:62;-1:-1:-1;7567:23:0;7482:62;7567:9;:23;:::i;:::-;7555:35;7009:589;-1:-1:-1;;;;;;;7009:589:0:o;8969:640::-;9107:24;9167:1;9152:4;:11;:16;;9144:49;;;;-1:-1:-1;;;9144:49:0;;22408:2:1;9144:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;9144:49:0;22206:344:1;9144:49:0;9228:4;:11;9214:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9214:26:0;;9204:36;;9281:9;9251:7;9276:1;9259:7;:14;:18;;;;:::i;:::-;9251:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9306:9;9332:1;9318:4;:11;:15;;;;:::i;:::-;9306:27;;9301:301;9335:5;;9301:301;;9363:17;;9404:108;9434:7;9460:4;9465:5;9469:1;9465;:5;:::i;:::-;9460:11;;;;;;;;:::i;:::-;;;;;;;9490:4;9495:1;9490:7;;;;;;;;:::i;:::-;;;;;;;9404:11;:108::i;:::-;9362:150;;;;9544:46;9556:7;9564:1;9556:10;;;;;;;;:::i;:::-;;;;;;;9568:9;9579:10;9544:11;:46::i;:::-;9527:7;9535:5;9539:1;9535;:5;:::i;:::-;9527:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9347:255;;9342:3;;;;;:::i;:::-;;;;9301:301;;;;8969:640;;;;;:::o;33046:248::-;33217:68;;-1:-1:-1;;;;;14081:15:1;;;33217:68:0;;;14063:34:1;14133:15;;14113:18;;;14106:43;14165:18;;;14158:34;;;33190:96:0;;33210:5;;-1:-1:-1;;;33240:27:0;13998:18:1;;33217:68:0;;;;-1:-1:-1;;33217:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33217:68:0;-1:-1:-1;;;;;;33217:68:0;;;;;;;;;;33190:19;:96::i;:::-;33046:248;;;;:::o;43330:429::-;43579:24;;-1:-1:-1;;;43579:24:0;;24848:4:1;24836:17;;43579:24:0;;;24818:36:1;43535:17:0;;;;-1:-1:-1;;;;;43579:13:0;;;;;24791:18:1;;43579:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43565:38;-1:-1:-1;43614:51:0;-1:-1:-1;;;;;43614:26:0;;43649:4;43656:8;43614:26;:51::i;:::-;43688:63;;-1:-1:-1;;;43688:63:0;;25484:4:1;25472:17;;;43688:63:0;;;25454:36:1;25526:17;;25506:18;;;25499:45;25560:18;;;25553:34;;;25603:18;;;25596:34;;;25646:19;;;25639:35;;;-1:-1:-1;;;;;43688:9:0;;;;;25426:19:1;;43688:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43676:75;43330:429;-1:-1:-1;;;;;;;;43330:429:0:o;32827:211::-;32971:58;;-1:-1:-1;;;;;14395:32:1;;32971:58:0;;;14377:51:1;14444:18;;;14437:34;;;32944:86:0;;32964:5;;-1:-1:-1;;;32994:23:0;14350:18:1;;32971:58:0;14203:274:1;32944:86:0;32827:211;;;:::o;8342:619::-;8480:24;8540:1;8525:4;:11;:16;;8517:49;;;;-1:-1:-1;;;8517:49:0;;22408:2:1;8517:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;8517:49:0;22206:344:1;8517:49:0;8601:4;:11;8587:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8587:26:0;;8577:36;;8637:8;8624:7;8632:1;8624:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8661:9;8656:298;8690:1;8676:4;:11;:15;;;;:::i;:::-;8672:1;:19;8656:298;;;8714:17;8733:18;8755:108;8785:7;8811:4;8816:1;8811:7;;;;;;;;:::i;:::-;;;;;;;8837:4;8842:1;8846;8842:5;;;;:::i;:::-;8837:11;;;;;;;;:::i;8755:108::-;8713:150;;;;8895:47;8908:7;8916:1;8908:10;;;;;;;;:::i;:::-;;;;;;;8920:9;8931:10;8895:12;:47::i;:::-;8878:7;8886:5;:1;8890;8886:5;:::i;:::-;8878:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8698:256;;8693:3;;;;;:::i;:::-;;;;8656:298;;4550:204;4705:41;;-1:-1:-1;;;4705:41:0;;-1:-1:-1;;;;;13744:15:1;;;4705:41:0;;;13726:34:1;13796:15;;;13776:18;;;13769:43;4673:12:0;;4705:25;;;;;;13661:18:1;;4705:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5589:522::-;5874:51;;;-1:-1:-1;;;;;14081:15:1;;;5874:51:0;;;14063:34:1;14133:15;;;14113:18;;;14106:43;14165:18;;;;14158:34;;;5874:51:0;;;;;;;;;;13998:18:1;;;;5874:51:0;;;;;;;-1:-1:-1;;;;;5874:51:0;-1:-1:-1;;;5874:51:0;;;5849:87;;-1:-1:-1;;;;5849:10:0;;;;:87;;5874:51;5849:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5813:123;;;;5969:7;:57;;;;-1:-1:-1;5981:11:0;;:16;;:44;;;6012:4;6001:24;;;;;;;;;;;;:::i;:::-;5947:156;;;;-1:-1:-1;;;5947:156:0;;17749:2:1;5947:156:0;;;17731:21:1;17788:2;17768:18;;;17761:30;17827:34;17807:18;;;17800:62;-1:-1:-1;;;17878:18:1;;;17871:47;17935:19;;5947:156:0;17547:413:1;5947:156:0;5723:388;;5589:522;;;;:::o;37448:862::-;37583:9;37578:725;37612:1;37598:4;:11;:15;;;;:::i;:::-;37594:1;:19;37578:725;;;37636:13;37651:14;37670:4;37675:1;37670:7;;;;;;;;:::i;:::-;;;;;;;37679:4;37684:1;37688;37684:5;;;;:::i;:::-;37679:11;;;;;;;;:::i;:::-;;;;;;;37635:56;;;;37707:14;37727:32;37745:5;37752:6;37727:17;:32::i;:::-;-1:-1:-1;37706:53:0;-1:-1:-1;37774:17:0;37794:7;37802:5;:1;37806;37802:5;:::i;:::-;37794:14;;;;;;;;:::i;:::-;;;;;;;37774:34;;37824:18;37844;37875:6;-1:-1:-1;;;;;37866:15:0;:5;-1:-1:-1;;;;;37866:15:0;;:101;;37945:9;37964:1;37866:101;;;37910:1;37914:9;37866:101;37823:144;;;;37982:10;38013:1;37999:4;:11;:15;;;;:::i;:::-;37995:1;:19;:106;;38098:3;37995:106;;;38049:7;;38034:44;;-1:-1:-1;;;;;38049:7:0;38058:6;38066:4;38071:5;:1;38075;38071:5;:::i;:::-;38066:11;;;;;;;;:::i;:::-;;;;;;;38034:14;:44::i;:::-;38137:7;;37982:119;;-1:-1:-1;38122:38:0;;-1:-1:-1;;;;;38137:7:0;38146:5;38153:6;38122:14;:38::i;:::-;-1:-1:-1;;;;;38116:50:0;;38185:10;38214;38243:2;38274:1;38264:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38264:12:0;;38116:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37620:683;;;;;;;37615:3;;;;;:::i;:::-;;;;37578:725;;52732:147;52801:21;52853:4;52842:29;;;;;;;;;;;;:::i;48686:1026::-;48915:7;48945:8;48856:16;48966:739;48986:17;;;48966:739;;;49029:6;;49036:1;49029:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;;;;;;:::i;:::-;49025:669;;;49089:46;49104:9;49115:6;;49122:1;49115:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49126:8;49089:14;:46::i;:::-;49065:70;;-1:-1:-1;49065:70:0;-1:-1:-1;49025:669:0;;;49176:21;49200:38;49219:6;;49226:1;49219:9;;;;;;;:::i;49200:38::-;49176:62;;49268:4;49287:1;49273:4;:11;:15;;;;:::i;:::-;49268:21;;;;;;;;:::i;:::-;;;;;;;49257:32;;49308:24;49335:46;49356:7;;;;;;;;-1:-1:-1;;;;;49356:7:0;49365:9;49376:4;49335:20;:46::i;:::-;49308:73;;49400:166;49442:4;49447:1;49442:7;;;;;;;;:::i;:::-;;;;;;;49473:41;49488:7;;;;;;;;-1:-1:-1;;;;;49488:7:0;49497:4;49502:1;49497:7;;;;;;;;:::i;:::-;;;;;;;49506:4;49511:1;49506:7;;;;;;;;:::i;49473:41::-;49537:7;49545:1;49537:10;;;;;;;;:::i;:::-;;;;;;;49400:19;:166::i;:::-;49585:35;49591:7;49600:4;49614;49585:5;:35::i;:::-;49651:7;49676:1;49659:7;:14;:18;;;;:::i;:::-;49651:27;;;;;;;;:::i;:::-;;;;;;;49639:39;;49157:537;;49025:669;49005:3;;;;:::i;:::-;;;;48966:739;;;;48686:1026;;;;;;;;:::o;52887:473::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53049:16:0;53081:20;53117:17;53150:15;53181:13;53219:4;53208:68;;;;;;;;;;;;:::i;:::-;53296:56;;;;;;;;-1:-1:-1;;;;;53296:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;52887:473:0:o;6600:287::-;6724:12;;;6684;6724;;;;;;;;;-1:-1:-1;;;;;6702:7:0;;;6717:5;;6702:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6683:54;;;6770:7;6748:131;;;;-1:-1:-1;;;6748:131:0;;19686:2:1;6748:131:0;;;19668:21:1;19725:2;19705:18;;;19698:30;19764:34;19744:18;;;19737:62;19835:34;19815:18;;;19808:62;-1:-1:-1;;;19886:19:1;;;19879:41;19937:19;;6748:131:0;19484:478:1;43767:939:0;44008:17;44038:16;44057:8;-1:-1:-1;;;;;44057:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44112:38;;-1:-1:-1;;;44112:38:0;;-1:-1:-1;;;;;13470:32:1;;;44112:38:0;;;13452:51:1;44038:40:0;;-1:-1:-1;44089:20:0;;44112:18;;;;;13425::1;;44112:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44089:61;;44161:29;44207:8;-1:-1:-1;;;;;44207:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44193:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44193:43:0;;44161:75;;44278:2;44247:12;44260:14;44247:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;44305;;-1:-1:-1;;;44305:33:0;;24848:4:1;24836:17;;44305:33:0;;;24818:36:1;44291:11:0;;-1:-1:-1;;;;;44305:17:0;;;;;24791:18:1;;44305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44291:47;-1:-1:-1;44349:49:0;-1:-1:-1;;;;;44349:26:0;;44384:8;44395:2;44349:26;:49::i;:::-;44432:48;;-1:-1:-1;;;44432:48:0;;44409:20;;-1:-1:-1;;;;;44432:21:0;;;;;:48;;44454:12;;44409:20;;44471:8;;44432:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44409:71;;44513:12;44495:30;;:14;:30;;;44491:208;;44554:76;44564:4;44570:14;44586:12;44600;44614:5;44621:8;44554:9;:76::i;:::-;44542:88;;44491:208;;;44675:12;44663:24;;44491:208;44027:679;;;;;43767:939;;;;;;;;;:::o;44714:758::-;44953:17;44983:16;45002:8;-1:-1:-1;;;;;45002:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45057:38;;-1:-1:-1;;;45057:38:0;;-1:-1:-1;;;;;13470:32:1;;;45057:38:0;;;13452:51:1;44983:40:0;;-1:-1:-1;45034:20:0;;45057:18;;;;;13425::1;;45057:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45034:61;-1:-1:-1;45130:2:0;45147:32;;;;;;;;45143:145;;45212:64;45222:4;45228:14;45244;45260:2;45264:1;45267:8;45212:9;:64::i;:::-;45196:80;;45143:145;45298:65;-1:-1:-1;;;;;45298:31:0;;45338:8;45349:13;45298:31;:65::i;:::-;45386:78;;-1:-1:-1;;;45386:78:0;;;;;24500:25:1;;;24573:4;24561:17;;24541:18;;;24534:45;24595:18;;;24588:34;;;24638:18;;;24631:34;;;-1:-1:-1;;;;;45386:32:0;;;;;24472:19:1;;45386:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45374:90;44714:758;-1:-1:-1;;;;;;;;;;;44714:758:0:o;3863:151::-;3921:9;3951:6;;;:30;;-1:-1:-1;3980:1:0;3975;3966:5;3975:1;3980;3966:5;:::i;:::-;3962:9;-1:-1:-1;3961:15:0;;3962:9;3961:15;:::i;:::-;:20;3951:30;3943:63;;;;-1:-1:-1;;;3943:63:0;;16642:2:1;3943:63:0;;;16624:21:1;16681:2;16661:18;;;16654:30;-1:-1:-1;;;16700:18:1;;;16693:50;16760:18;;3943:63:0;16440:344:1;3572:137:0;3630:9;3675:1;3665:5;3669:1;3675;3665:5;:::i;:::-;3661:9;;;3660:16;;3652:49;;;;-1:-1:-1;;;3652:49:0;;16991:2:1;3652:49:0;;;16973:21:1;17030:2;17010:18;;;17003:30;-1:-1:-1;;;17049:18:1;;;17042:50;17109:18;;3652:49:0;16789:344:1;5101:480:0;5228:16;5246;5276:14;5296:26;5307:6;5315;5296:10;:26::i;:::-;5275:47;;;5334:16;5352;5394:32;5402:7;5411:6;5419;5394:7;:32::i;:::-;-1:-1:-1;;;;;5374:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5333:118;-1:-1:-1;;;;;5333:118:0;;;-1:-1:-1;;;;;5333:118:0;;;5495:6;-1:-1:-1;;;;;5485:16:0;:6;-1:-1:-1;;;;;5485:16:0;;:88;;5554:8;5564;5485:88;;;5518:8;5528;5485:88;5462:111;;;;-1:-1:-1;5101:480:0;-1:-1:-1;;;;;;;5101:480:0:o;7719:541::-;7855:16;7904:1;7892:9;:13;7884:60;;;;-1:-1:-1;;;7884:60:0;;20518:2:1;7884:60:0;;;20500:21:1;20557:2;20537:18;;;20530:30;20596:34;20576:18;;;20569:62;-1:-1:-1;;;20647:18:1;;;20640:32;20689:19;;7884:60:0;20316:398:1;7884:60:0;7989:1;7977:9;:13;:31;;;;;8007:1;7994:10;:14;7977:31;7955:111;;;;-1:-1:-1;;;7955:111:0;;22049:2:1;7955:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7955:111:0;21847:354:1;7955:111:0;8077:17;8097:34;8126:4;8097:24;:9;8111;8097:13;:24::i;:::-;:28;;:34::i;:::-;8077:54;-1:-1:-1;8142:19:0;8164:34;8194:3;8164:25;:10;8179:9;8164:14;:25::i;:34::-;8142:56;-1:-1:-1;8220:32:0;8250:1;8221:23;8142:56;8221:9;:23;:::i;8220:32::-;8209:43;7719:541;-1:-1:-1;;;;;;7719:541:0:o;35894:716::-;36318:23;36344:69;36372:4;36344:69;;;;;;;;;;;;;;;;;36352:5;-1:-1:-1;;;;;36344:27:0;;;:69;;;;;:::i;:::-;36428:17;;36318:95;;-1:-1:-1;36428:21:0;36424:179;;36525:10;36514:30;;;;;;;;;;;;:::i;:::-;36506:85;;;;-1:-1:-1;;;36506:85:0;;22757:2:1;36506:85:0;;;22739:21:1;22796:2;22776:18;;;22769:30;22835:34;22815:18;;;22808:62;-1:-1:-1;;;22886:18:1;;;22879:40;22936:19;;36506:85:0;22555:406:1;34187:317:0;34341:39;;-1:-1:-1;;;34341:39:0;;34365:4;34341:39;;;13726:34:1;-1:-1:-1;;;;;13796:15:1;;;13776:18;;;13769:43;34318:20:0;;34383:5;;34341:15;;;;;13661:18:1;;34341:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;34426:69;;-1:-1:-1;;;;;14395:32:1;;34426:69:0;;;14377:51:1;14444:18;;;14437:34;;;34318:70:0;;-1:-1:-1;34399:97:0;;34419:5;;-1:-1:-1;;;34449:22:0;14350:18:1;;34426:69:0;14203:274:1;4155:387:0;4257:14;4273;4323:6;-1:-1:-1;;;;;4313:16:0;:6;-1:-1:-1;;;;;4313:16:0;;;4305:56;;;;-1:-1:-1;;;4305:56:0;;20921:2:1;4305:56:0;;;20903:21:1;20960:2;20940:18;;;20933:30;20999:29;20979:18;;;20972:57;21046:18;;4305:56:0;20719:351:1;4305:56:0;4400:6;-1:-1:-1;;;;;4391:15:0;:6;-1:-1:-1;;;;;4391:15:0;;:79;;4455:6;4463;4391:79;;;4423:6;4431;4391:79;4372:98;;-1:-1:-1;4372:98:0;-1:-1:-1;;;;;;4489:20:0;;4481:53;;;;-1:-1:-1;;;4481:53:0;;20169:2:1;4481:53:0;;;20151:21:1;20208:2;20188:18;;;20181:30;-1:-1:-1;;;20227:18:1;;;20220:50;20287:18;;4481:53:0;19967:344:1;4481:53:0;4155:387;;;;;:::o;47367:1311::-;47500:16;;;47573:41;47599:14;;;;:5;:14;:::i;47573:41::-;47636:12;;;;47673:13;;;;47636:12;;-1:-1:-1;47548:66:0;;-1:-1:-1;;;;;;47665:36:0;47661:1010;;47758:9;;47811:14;;;;;47787:39;;-1:-1:-1;;;47787:39:0;;-1:-1:-1;;;;;13470:32:1;;;47787:39:0;;;13452:51:1;47730:245:0;;47758:9;47787:23;;;;;13425:18:1;;47787:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47846:9;;47870:12;;;;47846:37;;-1:-1:-1;;;47846:37:0;;-1:-1:-1;;;;;13470:32:1;;;47846:37:0;;;13452:51:1;47846:23:0;;;;;13425:18:1;;47846:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47903:8;47931:1;47952:8;47730:9;:245::i;:::-;47718:257;;47661:1010;;;47997:4;:13;;;47993:678;;;48075:9;;48104:13;;;;48165:14;;;;;48137:43;;-1:-1:-1;;;48137:43:0;;-1:-1:-1;;;;;13470:32:1;;;48137:43:0;;;13452:51:1;48039:290:0;;48075:9;48104:13;48137:27;;;;;13425:18:1;;48137:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48200:9;;48224:12;;;;48200:37;;-1:-1:-1;;;48200:37:0;;-1:-1:-1;;;;;13470:32:1;;;48200:37:0;;;13452:51:1;48200:23:0;;;;;13425:18:1;;48200:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48257:8;48285:1;48306:8;48039:17;:290::i;47993:678::-;48408:9;;48436:13;;;;48492:14;;;;;48468:39;;-1:-1:-1;;;48468:39:0;;-1:-1:-1;;;;;13470:32:1;;;48468:39:0;;;13452:51:1;48374:285:0;;48408:9;48436:13;48468:23;;;;;13425:18:1;;48468:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48527:13;;;;48555:12;;;;48527:41;;-1:-1:-1;;;48527:41:0;;-1:-1:-1;;;;;13470:32:1;;;48527:41:0;;;13452:51:1;48527:27:0;;;;;13425:18:1;;48527:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48588:8;48616:1;48636:8;48374:15;:285::i;:::-;48362:297;;47993:678;47537:1141;47367:1311;;;;;;:::o;6119:473::-;6365:45;;;-1:-1:-1;;;;;14395:32:1;;;6365:45:0;;;14377:51:1;14444:18;;;;14437:34;;;6365:45:0;;;;;;;;;;14350:18:1;;;;6365:45:0;;;;;;;-1:-1:-1;;;;;6365:45:0;-1:-1:-1;;;6365:45:0;;;6340:81;;-1:-1:-1;;;;6340:10:0;;;;:81;;6365:45;6340:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6304:117;;;;6454:7;:57;;;;-1:-1:-1;6466:11:0;;:16;;:44;;;6497:4;6486:24;;;;;;;;;;;;:::i;:::-;6432:152;;;;-1:-1:-1;;;6432:152:0;;21635:2:1;6432:152:0;;;21617:21:1;21674:2;21654:18;;;21647:30;21713:34;21693:18;;;21686:62;-1:-1:-1;;;21764:18:1;;;21757:43;21817:19;;6432:152:0;21433:409:1;6432:152:0;6226:366;;6119:473;;;:::o;3717:138::-;3775:9;3820:1;3810:5;3814:1;3820;3810:5;:::i;:::-;3806:9;;;3805:16;;3797:50;;;;-1:-1:-1;;;3797:50:0;;15937:2:1;3797:50:0;;;15919:21:1;15976:2;15956:18;;;15949:30;-1:-1:-1;;;15995:18:1;;;15988:51;16056:18;;3797:50:0;15735:345:1;13811:229:0;13948:12;13980:52;14002:6;14010:4;14016:1;14019:12;13948;-1:-1:-1;;;;;11361:19:0;;;15218:60;;;;-1:-1:-1;;;15218:60:0;;21277:2:1;15218:60:0;;;21259:21:1;21316:2;21296:18;;;21289:30;21355:31;21335:18;;;21328:59;21404:18;;15218:60:0;21075:353:1;15218:60:0;15292:12;15306:23;15333:6;-1:-1:-1;;;;;15333:11:0;15352:5;15359:4;15333:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15291:73;;;;15382:51;15399:7;15408:10;15420:12;17767;17796:7;17792:580;;;-1:-1:-1;17827:10:0;17820:17;;17792:580;17941:17;;:21;17937:424;;18189:10;18183:17;18250:15;18237:10;18233:2;18229:19;18222:44;17937:424;18332:12;18325:20;;-1:-1:-1;;;18325:20:0;;;;;;;;:::i;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;386:188;465:13;;-1:-1:-1;;;;;507:42:1;;497:53;;487:81;;564:1;561;554:12;487:81;386:188;;;:::o;579:247::-;638:6;691:2;679:9;670:7;666:23;662:32;659:52;;;707:1;704;697:12;659:52;746:9;733:23;765:31;790:5;765:31;:::i;831:251::-;901:6;954:2;942:9;933:7;929:23;925:32;922:52;;;970:1;967;960:12;922:52;1002:9;996:16;1021:31;1046:5;1021:31;:::i;1087:967::-;1182:6;1213:2;1256;1244:9;1235:7;1231:23;1227:32;1224:52;;;1272:1;1269;1262:12;1224:52;1305:9;1299:16;1338:18;1330:6;1327:30;1324:50;;;1370:1;1367;1360:12;1324:50;1393:22;;1446:4;1438:13;;1434:27;-1:-1:-1;1424:55:1;;1475:1;1472;1465:12;1424:55;1504:2;1498:9;1527:60;1543:43;1583:2;1543:43;:::i;:::-;1527:60;:::i;:::-;1609:3;1633:2;1628:3;1621:15;1661:2;1656:3;1652:12;1645:19;;1692:2;1688;1684:11;1740:7;1735:2;1729;1726:1;1722:10;1718:2;1714:19;1710:28;1707:41;1704:61;;;1761:1;1758;1751:12;1704:61;1783:1;1774:10;;1793:231;1807:2;1804:1;1801:9;1793:231;;;1871:3;1865:10;1888:31;1913:5;1888:31;:::i;:::-;1932:18;;1825:1;1818:9;;;;;1970:12;;;;2002;;1793:231;;;-1:-1:-1;2043:5:1;1087:967;-1:-1:-1;;;;;;;1087:967:1:o;2059:241::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;2223:9;2210:23;2242:28;2264:5;2242:28;:::i;2305:245::-;2372:6;2425:2;2413:9;2404:7;2400:23;2396:32;2393:52;;;2441:1;2438;2431:12;2393:52;2473:9;2467:16;2492:28;2514:5;2492:28;:::i;2826:839::-;2985:6;2993;3001;3009;3017;3070:3;3058:9;3049:7;3045:23;3041:33;3038:53;;;3087:1;3084;3077:12;3038:53;3119:9;3113:16;3138:31;3163:5;3138:31;:::i;:::-;3238:2;3223:18;;3217:25;3188:5;;-1:-1:-1;3251:33:1;3217:25;3251:33;:::i;:::-;3355:2;3340:18;;3334:25;3303:7;;-1:-1:-1;3368:33:1;3334:25;3368:33;:::i;:::-;3472:2;3457:18;;3451:25;3420:7;;-1:-1:-1;3485:33:1;3451:25;3485:33;:::i;:::-;3589:3;3574:19;;3568:26;3537:7;;-1:-1:-1;3603:30:1;3568:26;3603:30;:::i;:::-;3652:7;3642:17;;;2826:839;;;;;;;;:::o;3670:772::-;3801:6;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3942:9;3929:23;3961:31;3986:5;3961:31;:::i;:::-;4011:5;-1:-1:-1;4068:2:1;4053:18;;4040:32;4081:33;4040:32;4081:33;:::i;:::-;4133:7;-1:-1:-1;4192:2:1;4177:18;;4164:32;4205:31;4164:32;4205:31;:::i;:::-;4255:7;-1:-1:-1;4314:2:1;4299:18;;4286:32;4327:31;4286:32;4327:31;:::i;:::-;3670:772;;;;-1:-1:-1;3670:772:1;;4431:3;4416:19;4403:33;;3670:772;-1:-1:-1;;3670:772:1:o;4447:1052::-;4605:6;4613;4621;4629;4637;4645;4653;4661;4714:3;4702:9;4693:7;4689:23;4685:33;4682:53;;;4731:1;4728;4721:12;4682:53;4770:9;4757:23;4789:31;4814:5;4789:31;:::i;:::-;4839:5;-1:-1:-1;4896:2:1;4881:18;;4868:32;4909:33;4868:32;4909:33;:::i;:::-;4961:7;-1:-1:-1;5020:2:1;5005:18;;4992:32;5033:31;4992:32;5033:31;:::i;:::-;5083:7;-1:-1:-1;5142:2:1;5127:18;;5114:32;5155:31;5114:32;5155:31;:::i;:::-;5205:7;-1:-1:-1;5259:3:1;5244:19;;5231:33;;-1:-1:-1;5311:3:1;5296:19;;5283:33;;-1:-1:-1;5368:3:1;5353:19;;5340:33;5382;5340;5382;:::i;:::-;5434:7;5424:17;;;5488:3;5477:9;5473:19;5460:33;5450:43;;4447:1052;;;;;;;;;;;:::o;5504:610::-;5606:6;5614;5622;5630;5683:3;5671:9;5662:7;5658:23;5654:33;5651:53;;;5700:1;5697;5690:12;5651:53;5739:9;5726:23;5758:31;5783:5;5758:31;:::i;:::-;5808:5;-1:-1:-1;5865:2:1;5850:18;;5837:32;5878:31;5837:32;5878:31;:::i;:::-;5928:7;-1:-1:-1;5987:2:1;5972:18;;5959:32;6000:31;5959:32;6000:31;:::i;:::-;5504:610;;;;-1:-1:-1;6050:7:1;;6104:2;6089:18;6076:32;;-1:-1:-1;;5504:610:1:o;6119:890::-;6248:6;6256;6264;6272;6280;6288;6296;6349:3;6337:9;6328:7;6324:23;6320:33;6317:53;;;6366:1;6363;6356:12;6317:53;6405:9;6392:23;6424:31;6449:5;6424:31;:::i;:::-;6474:5;-1:-1:-1;6531:2:1;6516:18;;6503:32;6544:31;6503:32;6544:31;:::i;:::-;6594:7;-1:-1:-1;6653:2:1;6638:18;;6625:32;6666:31;6625:32;6666:31;:::i;:::-;6716:7;-1:-1:-1;6770:2:1;6755:18;;6742:32;;-1:-1:-1;6821:3:1;6806:19;;6793:33;;-1:-1:-1;6878:3:1;6863:19;;6850:33;6892;6850;6892;:::i;:::-;6944:7;6934:17;;;6998:3;6987:9;6983:19;6970:33;6960:43;;6119:890;;;;;;;;;;:::o;7014:450::-;7101:6;7109;7117;7170:2;7158:9;7149:7;7145:23;7141:32;7138:52;;;7186:1;7183;7176:12;7138:52;7209:40;7239:9;7209:40;:::i;:::-;7199:50;;7268:49;7313:2;7302:9;7298:18;7268:49;:::i;:::-;7258:59;;7360:2;7349:9;7345:18;7339:25;7404:10;7397:5;7393:22;7386:5;7383:33;7373:61;;7430:1;7427;7420:12;7373:61;7453:5;7443:15;;;7014:450;;;;;:::o;7469:184::-;7539:6;7592:2;7580:9;7571:7;7567:23;7563:32;7560:52;;;7608:1;7605;7598:12;7560:52;-1:-1:-1;7631:16:1;;7469:184;-1:-1:-1;7469:184:1:o;7658:709::-;7771:6;7779;7787;7795;7803;7856:3;7844:9;7835:7;7831:23;7827:33;7824:53;;;7873:1;7870;7863:12;7824:53;7909:9;7896:23;7886:33;;7970:2;7959:9;7955:18;7942:32;7997:18;7989:6;7986:30;7983:50;;;8029:1;8026;8019:12;7983:50;8068:70;8130:7;8121:6;8110:9;8106:22;8068:70;:::i;:::-;8157:8;;-1:-1:-1;8042:96:1;-1:-1:-1;;8242:2:1;8227:18;;8214:32;8255:31;8214:32;8255:31;:::i;:::-;7658:709;;;;-1:-1:-1;7658:709:1;;8357:2;8342:18;8329:32;;7658:709;-1:-1:-1;;7658:709:1:o;8372:1045::-;8465:6;8473;8526:2;8514:9;8505:7;8501:23;8497:32;8494:52;;;8542:1;8539;8532:12;8494:52;8578:9;8565:23;8555:33;;8607:2;8660;8649:9;8645:18;8632:32;8687:18;8679:6;8676:30;8673:50;;;8719:1;8716;8709:12;8673:50;8742:22;;8795:4;8787:13;;8783:27;-1:-1:-1;8773:55:1;;8824:1;8821;8814:12;8773:55;8860:2;8847:16;8883:60;8899:43;8939:2;8899:43;:::i;8883:60::-;8965:3;8989:2;8984:3;8977:15;9017:2;9012:3;9008:12;9001:19;;9048:2;9044;9040:11;9096:7;9091:2;9085;9082:1;9078:10;9074:2;9070:19;9066:28;9063:41;9060:61;;;9117:1;9114;9107:12;9060:61;9139:1;9130:10;;9149:238;9163:2;9160:1;9157:9;9149:238;;;9234:3;9221:17;9251:31;9276:5;9251:31;:::i;:::-;9295:18;;9181:1;9174:9;;;;;9333:12;;;;9365;;9149:238;;;9153:3;9406:5;9396:15;;;;;;;8372:1045;;;;;:::o;10161:778::-;10283:6;10291;10299;10307;10315;10323;10376:3;10364:9;10355:7;10351:23;10347:33;10344:53;;;10393:1;10390;10383:12;10344:53;10429:9;10416:23;10406:33;;10486:2;10475:9;10471:18;10458:32;10448:42;;10541:2;10530:9;10526:18;10513:32;10568:18;10560:6;10557:30;10554:50;;;10600:1;10597;10590:12;10554:50;10639:70;10701:7;10692:6;10681:9;10677:22;10639:70;:::i;:::-;10728:8;;-1:-1:-1;10613:96:1;-1:-1:-1;;10813:2:1;10798:18;;10785:32;10826:31;10785:32;10826:31;:::i;:::-;10876:5;10866:15;;;10928:3;10917:9;10913:19;10900:33;10890:43;;10161:778;;;;;;;;:::o;11752:316::-;11829:6;11837;11845;11898:2;11886:9;11877:7;11873:23;11869:32;11866:52;;;11914:1;11911;11904:12;11866:52;-1:-1:-1;;11937:23:1;;;12007:2;11992:18;;11979:32;;-1:-1:-1;12058:2:1;12043:18;;;12030:32;;11752:316;-1:-1:-1;11752:316:1:o;12073:247::-;12141:6;12194:2;12182:9;12173:7;12169:23;12165:32;12162:52;;;12210:1;12207;12200:12;12162:52;12242:9;12236:16;12261:29;12284:5;12261:29;:::i;12325:435::-;12378:3;12416:5;12410:12;12443:6;12438:3;12431:19;12469:4;12498:2;12493:3;12489:12;12482:19;;12535:2;12528:5;12524:14;12556:1;12566:169;12580:6;12577:1;12574:13;12566:169;;;12641:13;;12629:26;;12675:12;;;;12710:15;;;;12602:1;12595:9;12566:169;;;-1:-1:-1;12751:3:1;;12325:435;-1:-1:-1;;;;;12325:435:1:o;12765:257::-;12806:3;12844:5;12838:12;12871:6;12866:3;12859:19;12887:63;12943:6;12936:4;12931:3;12927:14;12920:4;12913:5;12909:16;12887:63;:::i;:::-;13004:2;12983:15;-1:-1:-1;;12979:29:1;12970:39;;;;13011:4;12966:50;;12765:257;-1:-1:-1;;12765:257:1:o;13027:274::-;13156:3;13194:6;13188:13;13210:53;13256:6;13251:3;13244:4;13236:6;13232:17;13210:53;:::i;:::-;13279:16;;;;;13027:274;-1:-1:-1;;13027:274:1:o;14482:261::-;14661:2;14650:9;14643:21;14624:4;14681:56;14733:2;14722:9;14718:18;14710:6;14681:56;:::i;14748:342::-;14949:2;14938:9;14931:21;14912:4;14969:56;15021:2;15010:9;15006:18;14998:6;14969:56;:::i;:::-;14961:64;;15075:6;15068:14;15061:22;15056:2;15045:9;15041:18;15034:50;14748:342;;;;;:::o;15095:411::-;15338:2;15327:9;15320:21;15301:4;15358:56;15410:2;15399:9;15395:18;15387:6;15358:56;:::i;:::-;15445:2;15430:18;;15423:34;;;;-1:-1:-1;15488:2:1;15473:18;15466:34;15350:64;15095:411;-1:-1:-1;15095:411:1:o;15511:219::-;15660:2;15649:9;15642:21;15623:4;15680:44;15720:2;15709:9;15705:18;15697:6;15680:44;:::i;16085:350::-;16287:2;16269:21;;;16326:2;16306:18;;;16299:30;16365:28;16360:2;16345:18;;16338:56;16426:2;16411:18;;16085:350::o;17138:404::-;17340:2;17322:21;;;17379:2;17359:18;;;17352:30;17418:34;17413:2;17398:18;;17391:62;-1:-1:-1;;;17484:2:1;17469:18;;17462:38;17532:3;17517:19;;17138:404::o;18372:345::-;18574:2;18556:21;;;18613:2;18593:18;;;18586:30;-1:-1:-1;;;18647:2:1;18632:18;;18625:51;18708:2;18693:18;;18372:345::o;18722:352::-;18924:2;18906:21;;;18963:2;18943:18;;;18936:30;19002;18997:2;18982:18;;18975:58;19065:2;19050:18;;18722:352::o;19079:400::-;19281:2;19263:21;;;19320:2;19300:18;;;19293:30;19359:34;19354:2;19339:18;;19332:62;-1:-1:-1;;;19425:2:1;19410:18;;19403:34;19469:3;19454:19;;19079:400::o;23550:458::-;23781:6;23770:9;23763:25;23824:6;23819:2;23808:9;23804:18;23797:34;23896:1;23892;23887:3;23883:11;23879:19;23871:6;23867:32;23862:2;23851:9;23847:18;23840:60;23936:3;23931:2;23920:9;23916:18;23909:31;23744:4;23957:45;23997:3;23986:9;23982:19;23974:6;23957:45;:::i;25685:521::-;25762:4;25768:6;25828:11;25815:25;25922:2;25918:7;25907:8;25891:14;25887:29;25883:43;25863:18;25859:68;25849:96;;25941:1;25938;25931:12;25849:96;25968:33;;26020:20;;;-1:-1:-1;26063:18:1;26052:30;;26049:50;;;26095:1;26092;26085:12;26049:50;26128:4;26116:17;;-1:-1:-1;26159:14:1;26155:27;;;26145:38;;26142:58;;;26196:1;26193;26186:12;26211:322;26302:4;26360:11;26347:25;26454:2;26450:7;26439:8;26423:14;26419:29;26415:43;26395:18;26391:68;26381:96;;26473:1;26470;26463:12;26538:275;26609:2;26603:9;26674:2;26655:13;;-1:-1:-1;;26651:27:1;26639:40;;26709:18;26694:34;;26730:22;;;26691:62;26688:88;;;26756:18;;:::i;:::-;26792:2;26785:22;26538:275;;-1:-1:-1;26538:275:1:o;26818:183::-;26878:4;26911:18;26903:6;26900:30;26897:56;;;26933:18;;:::i;:::-;-1:-1:-1;26978:1:1;26974:14;26990:4;26970:25;;26818:183::o;27006:128::-;27046:3;27077:1;27073:6;27070:1;27067:13;27064:39;;;27083:18;;:::i;:::-;-1:-1:-1;27119:9:1;;27006:128::o;27139:217::-;27179:1;27205;27195:132;;27249:10;27244:3;27240:20;27237:1;27230:31;27284:4;27281:1;27274:15;27312:4;27309:1;27302:15;27195:132;-1:-1:-1;27341:9:1;;27139:217::o;27361:168::-;27401:7;27467:1;27463;27459:6;27455:14;27452:1;27449:21;27444:1;27437:9;27430:17;27426:45;27423:71;;;27474:18;;:::i;:::-;-1:-1:-1;27514:9:1;;27361:168::o;27534:125::-;27574:4;27602:1;27599;27596:8;27593:34;;;27607:18;;:::i;:::-;-1:-1:-1;27644:9:1;;27534:125::o;27664:258::-;27736:1;27746:113;27760:6;27757:1;27754:13;27746:113;;;27836:11;;;27830:18;27817:11;;;27810:39;27782:2;27775:10;27746:113;;;27877:6;27874:1;27871:13;27868:48;;;-1:-1:-1;;27912:1:1;27894:16;;27887:27;27664:258::o;27927:136::-;27966:3;27994:5;27984:39;;28003:18;;:::i;:::-;-1:-1:-1;;;28039:18:1;;27927:136::o;28068:135::-;28107:3;-1:-1:-1;;28128:17:1;;28125:43;;;28148:18;;:::i;:::-;-1:-1:-1;28195:1:1;28184:13;;28068:135::o;28208:127::-;28269:10;28264:3;28260:20;28257:1;28250:31;28300:4;28297:1;28290:15;28324:4;28321:1;28314:15;28340:127;28401:10;28396:3;28392:20;28389:1;28382:31;28432:4;28429:1;28422:15;28456:4;28453:1;28446:15;28472:127;28533:10;28528:3;28524:20;28521:1;28514:31;28564:4;28561:1;28554:15;28588:4;28585:1;28578:15;28604:131;-1:-1:-1;;;;;28679:31:1;;28669:42;;28659:70;;28725:1;28722;28715:12;28659:70;28604:131;:::o;28740:118::-;28826:5;28819:13;28812:21;28805:5;28802:32;28792:60;;28848:1;28845;28838:12;28863:114;28947:4;28940:5;28936:16;28929:5;28926:27;28916:55;;28967:1;28964;28957:12

Swarm Source

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