Contract 0xe6fe3db4c5a2e4a9ab3301201b38724e578b35ca 1

DeFi  
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8238a78623a8e7b2d0a31a42dd9b798b76403c1b759d3b62dbb60a7cb9f3e424Swap Exact Token...18932182022-05-25 6:23:362 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200188
0xece0c614d52d3bcb82c61000376590b4106123a00a05f18def0fb833855b8451Swap Exact Token...18932152022-05-25 6:22:542 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xe50ef6d1d1edae3791e9f30ee46ed3fae0b4556ca8828de8e58d997cece97712Swap Exact Token...18932132022-05-25 6:22:303 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x1766ae9375bee2da22dca06f3c5950d309778d3a699bda966535327e844aa073Swap Exact Token...18932122022-05-25 6:22:063 mins ago0xae8da4a9792503f1ec97ed035e35133a9e65a61f IN  Zenlink: Regular AMM Router0 MOVR0.000477867
0x7894d46d4a54683ebeea64f768ef4370027199031b1e0a0441aecf52b9b61ca3Swap Exact Token...18932072022-05-25 6:21:064 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x349c0974f47873a63607715f2098a9b8169a04b31dee6118857c5b6c5ab8d9a8Swap Exact Token...18931822022-05-25 6:15:3010 mins ago0xae8da4a9792503f1ec97ed035e35133a9e65a61f IN  Zenlink: Regular AMM Router0 MOVR0.000477867
0x2f913ff38e6b25e3540b9c68ac362258724a258b8bf1dc90dd9d29d2dafd156eSwap Exact Token...18931752022-05-25 6:14:0011 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x782474f87bdd8bc479c6c53fd82b35c3100e06e352c6b75e13d17455e398be9bSwap Exact Nativ...18931692022-05-25 6:11:3614 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router15 MOVR0.000213392
0xc3eeab073578cdd1cf6d25867c4382fd73582515ab7b8b7322e2b2fe1f2076baSwap Exact Nativ...18931672022-05-25 6:11:1214 mins ago0xe1fa699860444be91d366c21de8fef56e3dec77a IN  Zenlink: Regular AMM Router15 MOVR0.000213392
0x8b1be1aefcebc5121518d2bc84f589a29f5f7d7d1b6689a78a016d1417cde83fSwap Exact Token...18931262022-05-25 6:01:3624 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x396af164df7d1aae4cc69ea31e015ea4ec7ef8efb5ef89e07c51225cbd189617Swap Exact Token...18931222022-05-25 6:00:4824 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xad69d4292907b76e702cd6f40a0abac1fceb93eb705ee995f71a6a23462854aaSwap Exact Token...18931172022-05-25 5:59:4825 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xe7cd7b10cfced4d8dbf66d478591cd3883a30a5537132d31144109db876b942cSwap Exact Token...18931122022-05-25 5:58:4226 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xeba8061e7c2113e73c48387e3c4db876e03e5ca2d66936dd1548b4d13d76366cSwap Exact Token...18931082022-05-25 5:57:5427 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x286de141765a9a30b253cb24a04657606223a9d50ca58ef1be09926768036b85Swap Exact Token...18931062022-05-25 5:57:2428 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x290cbe7275ec9e5cf8ab8118b1964724b5e4600310ef41bf17564a9c1179a47dSwap Exact Token...18931002022-05-25 5:56:0629 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x1bf0d5a5ac642f7aa2ec4a388cd41255f0966fb1e98dc4a0149627ece4aebc13Swap Exact Token...18930972022-05-25 5:55:2430 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xf173a291f4b3345dcaff4bdc48253e8904aed429fbb1f9186367632f922f68c2Swap Exact Token...18930762022-05-25 5:50:1235 mins ago0x7d3d507e99a4d0ef0fa4ddf007f0ae531bd57bbc IN  Zenlink: Regular AMM Router0 MOVR0.0013383296
0x58b7fb844757da0e3dca99571c0dcbf644ac48ad0c48d59dac53b4d9d92e86f1Swap Exact Token...18930572022-05-25 5:45:5439 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x26041a028b6adfe64fb18c078e1f9303daba6dfabb3a91566a5d9fb9e403a1dfSwap Exact Token...18930552022-05-25 5:45:3040 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xf50c20639f00be3b309746021f5cdbf59ce184a200ddc1103f19bf3b02cd868fSwap Exact Token...18930512022-05-25 5:44:4240 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xafab8677fea9c015122179f2e10744f617d6ab03b11b0911151c46c5790d2705Swap Exact Token...18930472022-05-25 5:43:5441 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xa60c2fb46865774821a0781644752c2613174dd6e2b47c1e3ba72cb8869f489dSwap Exact Token...18930452022-05-25 5:43:3042 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0x483328533f4a7a27c41b0a28bad87acfb3f7201671f9501b37e28a177964b810Swap Exact Token...18930432022-05-25 5:43:0642 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
0xc66dfe6f006ee79c33ee199b99e570c7df38718a5fa281d2f3805797c59e5953Swap Exact Token...18930422022-05-25 5:42:4842 mins ago0x0097fad287a3bdea08ccf94e7f076eafbbe6aa62 IN  Zenlink: Regular AMM Router0 MOVR0.000200212
[ Download CSV Export 

OVERVIEW

AMM Router contract of Zenlink.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x782474f87bdd8bc479c6c53fd82b35c3100e06e352c6b75e13d17455e398be9b18931692022-05-25 6:11:3614 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a15 MOVR
0xc3eeab073578cdd1cf6d25867c4382fd73582515ab7b8b7322e2b2fe1f2076ba18931672022-05-25 6:11:1214 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a15 MOVR
0x605cdf123951e64036f09ee33c005740ebfac03b56188777c0a33918ccc38b7218931452022-05-25 6:05:3620 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a6.664075608315478992 MOVR
0x605cdf123951e64036f09ee33c005740ebfac03b56188777c0a33918ccc38b7218931452022-05-25 6:05:3620 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 Zenlink: Regular AMM Router6.664075608315478992 MOVR
0x334014576a8d27bcca1dd996580eb1d5100342b484e2dceecbab5f358156934218930382022-05-25 5:41:5443 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xb2aafb6ac74d32a0f034ab728bcddc96ec1ba4f10a48e01f9931accb73a1957e18930362022-05-25 5:41:2444 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0x59fe69c4adff32635270994f8195bfc43537adaac55887cf8f01dd33d40993a818930212022-05-25 5:38:0647 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xa9095f682aa22cc0594240224e63b1b44cb80aa2ebffd0a22714db498115022418930212022-05-25 5:38:0647 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xee929a11ec69de7ef26c2a701ef389eaf22c102418353b5f89794c5125c26dae18930082022-05-25 5:34:5450 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a26.9 MOVR
0xe298394f26bfb5467067b2ec5bb154f7e2e13c620bfa47af9934804f82289f8318930082022-05-25 5:34:5450 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a20 MOVR
0x560bbe3cc6474400b9c9dd57ded6c5318a72af0b4de019c43834a8bf59eebca618930062022-05-25 5:34:3051 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a2.218297397105159664 MOVR
0x560bbe3cc6474400b9c9dd57ded6c5318a72af0b4de019c43834a8bf59eebca618930062022-05-25 5:34:3051 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 Zenlink: Regular AMM Router2.218297397105159664 MOVR
0x5c3b8fc17b6bf28e0b60217c489f362c4107d17d442fd8ff67e8ef9169c1597e18930042022-05-25 5:34:0051 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xb91f8f4967e727d259d558da425cc8e9fe7e954c73eb57697edc718362ae9a1418930042022-05-25 5:34:0051 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xc68ab215e452d0c594bf1657ff7346e616a0e8d0055602718e67ea1128ee7b9318930022022-05-25 5:32:3053 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a30 MOVR
0xfbf172a3ee47b4ad152cf2ef3a039097cccb02362a755a1346340ff8e15b1fe518929412022-05-25 5:18:481 hr 6 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a60 MOVR
0x96cc348ec40dd6fa2878657adba467a6acf738b73e651b391c447fbe4c119e8418929392022-05-25 5:18:181 hr 7 mins ago Zenlink: Regular AMM Router0xe1fa699860444be91d366c21de8fef56e3dec77a10.303211594152250577 MOVR
0x96cc348ec40dd6fa2878657adba467a6acf738b73e651b391c447fbe4c119e8418929392022-05-25 5:18:181 hr 7 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Zenlink: Regular AMM Router10.303211594152250577 MOVR
0x5ba23f2a3efd796b6eee7d0172d471ef68304f1300610361a5e9f9b802843a6018929392022-05-25 5:18:181 hr 7 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a60 MOVR
0x495cdc4e8e3ac197b9faf240528374e82c610dc2d62b81a4f1bb4c8ba278c05b18929362022-05-25 5:17:241 hr 8 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a60 MOVR
0xbec85597a48e5cbd245ac0c9bad0e01d75df1f6f0e8cc47a081bb82ee7bcfd8b18929342022-05-25 5:16:551 hr 8 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a70 MOVR
0x94bcbc4441c36d50cea6ef5d6934a8652edbe55b84c1a4f687d6b2ca3e9ec40c18929242022-05-25 5:14:361 hr 11 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a1.662589513270105887 MOVR
0x94bcbc4441c36d50cea6ef5d6934a8652edbe55b84c1a4f687d6b2ca3e9ec40c18929242022-05-25 5:14:361 hr 11 mins ago 0x0e682221302cea425c4c8f989e66e9e4b897c6e0 Zenlink: Regular AMM Router1.662589513270105887 MOVR
0x83afe955b56cd16ad2aad25d8bcc7c15b123c7c1deaecee9a56fdd0949070d9c18928242022-05-25 4:52:061 hr 33 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a40.04 MOVR
0x0463c5eb4069bdaeb10c1174f4e8c806c681ea6a1d945668e64a7942f81d2eec18926792022-05-25 4:18:542 hrs 6 mins ago Zenlink: Regular AMM Router 0x98878b06940ae243284ca214f92bb71a2b032b8a10.2 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

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-01-07
*/

// 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
    );

    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);

    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
    ) 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: contracts/periphery/interfaces/IRouter.sol



pragma solidity >=0.8.0;

interface IRouter {
    function factory() external view returns (address);

    function WNativeCurrency() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapIn,
        uint256 amountSwapOutMin,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 liquidity
        );

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function addLiquiditySingleNativeCurrency(
        address[] calldata path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountNativeCurrency);

    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 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[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

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

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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

// File: contracts/periphery/Router.sol



pragma solidity >=0.8.0;






contract Router is IRouter {
    using Math for uint256;

    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, "Router: EXPIRED");
        _;
    }

    receive() external payable {
        require(msg.sender == WNativeCurrency); // only accept Native Currency via fallback from the WNativeCurrency contract
    }

    function addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (
            uint256 amount0,
            uint256 amount1,
            uint256 liquidity
        )
    {
        (amount0, amount1) = _addLiquidity(
            token0,
            token1,
            amount0Desired,
            amount1Desired,
            amount0Min,
            amount1Min
        );
        address pair = Helper.pairFor(factory, token0, token1);
        Helper.safeTransferFrom(token0, msg.sender, pair, amount0);
        Helper.safeTransferFrom(token1, msg.sender, pair, amount1);
        liquidity = IPair(pair).mint(to);
    }

    function addLiquiditySingleToken(
        address[] calldata path,
        uint256 amountIn,
        uint256 amountSwapOut,
        uint256 amountSwapInMax,
        uint256 amountInReserveMin,
        address to,
        uint256 deadline
    ) external override ensure(deadline) returns (uint256 liquidity) {
        address token0 = path[0];
        address token1 = path[path.length - 1];

        uint256[] memory amounts = swapTokensForExactTokens(
            amountSwapOut,
            amountSwapInMax,
            path,
            to,
            deadline
        );

        uint256 amountInReserve = amountIn - amounts[0];
        (, , liquidity) = addLiquidity(
            token1,
            token0,
            amounts[amounts.length - 1],
            amountInReserve,
            amounts[amounts.length - 1],
            amountInReserveMin,
            to,
            deadline
        );
    }

    function addLiquidityNativeCurrency(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountNativeCurrencyMin
        );
        address pair = Helper.pairFor(factory, token, WNativeCurrency);
        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();
        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));
        liquidity = IPair(pair).mint(to);
        if (msg.value > amountNativeCurrency)
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - amountNativeCurrency
            ); // refund dust native currency, if any
    }

    function addLiquiditySingleNativeCurrency(
        address[] memory path,
        uint256 amountSwapOut,
        uint256 nativeCurrencySwapInMax,
        uint256 nativeCurrencyReserveMin,
        address to,
        uint256 deadline
    )
        external
        payable
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountNativeCurrency,
            uint256 liquidity
        )
    {
        // Swap
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        uint256[] memory amounts = Helper.getAmountsIn(
            factory,
            amountSwapOut,
            path
        );

        require(amounts[0] <= msg.value, "Router: 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);

        require(
            amounts[0] <= nativeCurrencySwapInMax,
            "not allow bigger than nativeCurrencySwapInMax"
        );

        // Addliquidity
        address token = path[path.length - 1];
        uint256 nativeCurrencyReserve = msg.value - amounts[0];
        (amountToken, amountNativeCurrency) = _addLiquidity(
            token,
            WNativeCurrency,
            amounts[amounts.length - 1],
            nativeCurrencyReserve,
            amounts[amounts.length - 1],
            nativeCurrencyReserveMin
        );

        address pair = Helper.pairFor(factory, token, WNativeCurrency);

        Helper.safeTransferFrom(token, msg.sender, pair, amountToken);

        IWNativeCurrency(WNativeCurrency).deposit{
            value: amountNativeCurrency
        }();

        require(IERC20(WNativeCurrency).transfer(pair, amountNativeCurrency));

        liquidity = IPair(pair).mint(to);

        if (msg.value > (amountNativeCurrency + amounts[0]))
            Helper.safeTransferNativeCurrency(
                msg.sender,
                msg.value - (amountNativeCurrency + amounts[0])
            ); // refund dust native currency, if any
    }

    function _addLiquidity(
        address token0,
        address token1,
        uint256 amount0Desired,
        uint256 amount1Desired,
        uint256 amount0Min,
        uint256 amount1Min
    ) private returns (uint256 amount0, uint256 amount1) {
        if (IFactory(factory).getPair(token0, token1) == address(0)) {
            IFactory(factory).createPair(token0, token1);
        }
        (uint256 reserve0, uint256 reserve1) = Helper.getReserves(
            factory,
            token0,
            token1
        );
        if (reserve0 == 0 && reserve1 == 0) {
            (amount0, amount1) = (amount0Desired, amount1Desired);
        } else {
            uint256 amount1Optimal = Helper.quote(
                amount0Desired,
                reserve0,
                reserve1
            );
            if (amount1Optimal <= amount1Desired) {
                require(
                    amount1Optimal >= amount1Min,
                    "Router: INSUFFICIENT_1_AMOUNT"
                );
                (amount0, amount1) = (amount0Desired, amount1Optimal);
            } else {
                uint256 amount0Optimal = Helper.quote(
                    amount1Desired,
                    reserve1,
                    reserve0
                );
                require(amount0Optimal <= amount0Desired);
                require(
                    amount0Optimal >= amount0Min,
                    "Router: INSUFFICIENT_0_AMOUNT"
                );
                (amount0, amount1) = (amount0Optimal, amount1Desired);
            }
        }
    }

    function removeLiquidity(
        address token0,
        address token1,
        uint256 liquidity,
        uint256 amount0Min,
        uint256 amount1Min,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amount0, uint256 amount1)
    {
        address pair = Helper.pairFor(factory, token0, token1);
        IERC20(pair).transferFrom(msg.sender, pair, liquidity);
        (uint256 amountA, uint256 amountB) = IPair(pair).burn(to);
        (address tokenA, ) = Helper.sortTokens(token0, token1);
        (amount0, amount1) = tokenA == token0
            ? (amountA, amountB)
            : (amountB, amountA);
        require(amount0 >= amount0Min, "Router: INSUFFICIENT_0_AMOUNT");
        require(amount1 >= amount1Min, "Router: INSUFFICIENT_1_AMOUNT");
    }

    function removeLiquidityNativeCurrency(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountNativeCurrencyMin,
        address to,
        uint256 deadline
    )
        public
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountNativeCurrency)
    {
        (amountToken, amountNativeCurrency) = removeLiquidity(
            token,
            WNativeCurrency,
            liquidity,
            amountTokenMin,
            amountNativeCurrencyMin,
            address(this),
            deadline
        );
        Helper.safeTransfer(token, to, amountToken);
        IWNativeCurrency(WNativeCurrency).withdraw(amountNativeCurrency);
        Helper.safeTransferNativeCurrency(to, amountNativeCurrency);
    }

    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
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: 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
    ) public override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: 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
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: 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,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "Router: 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,
            "Router: INVALID_PATH"
        );
        amounts = Helper.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "Router: 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
        payable
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WNativeCurrency, "Router: INVALID_PATH");
        amounts = Helper.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "Router: 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]
            ); // refund dust eth, if any
    }

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

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

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

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

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":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencySwapInMax","type":"uint256"},{"internalType":"uint256","name":"nativeCurrencyReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountSwapOut","type":"uint256"},{"internalType":"uint256","name":"amountSwapInMax","type":"uint256"},{"internalType":"uint256","name":"amountInReserveMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquiditySingleToken","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","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":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrencyMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityNativeCurrency","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountNativeCurrency","type":"uint256"}],"stateMutability":"nonpayable","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":"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"},{"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":"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":"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"}]

60806040523480156200001157600080fd5b506040516200353138038062003531833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b61346680620000cb6000396000f3fe60806040526004361061010d5760003560e01c80639be7614d11610095578063cd1bd0d911610064578063cd1bd0d9146102f1578063d06ca61f14610304578063dcff1b9414610324578063e8e3370014610344578063f85b7c8b1461036457600080fd5b80639be7614d1461027e578063b1ea829214610291578063baa2abde146102b1578063c45a0155146102d157600080fd5b8063419591ed116100dc578063419591ed146101e5578063686589671461021d57806385f8c259146101305780638803dbee1461024b578063937ca0da1461026b57600080fd5b8063054d50d4146101305780631f00ca741461016357806338ed173914610190578063403bf1f2146101b057600080fd5b3661012b576001546001600160a01b0316331461012957600080fd5b005b600080fd5b34801561013c57600080fd5b5061015061014b3660046131b9565b610384565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b5061018361017e3660046130db565b610399565b60405161015a9190613220565b34801561019c57600080fd5b506101836101ab366004613146565b6103bc565b3480156101bc57600080fd5b506101d06101cb366004612ebf565b610576565b6040805192835260208301919091520161015a565b3480156101f157600080fd5b50600154610205906001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b61023061022b366004612fa4565b61063a565b6040805193845260208401929092529082015260600161015a565b34801561025757600080fd5b50610183610266366004613146565b610c05565b610230610279366004612ebf565b610cae565b61018361028c366004613074565b610ebd565b34801561029d57600080fd5b506101506102ac366004612f1d565b6111c8565b3480156102bd57600080fd5b506101d06102cc366004612dd1565b6112fe565b3480156102dd57600080fd5b50600054610205906001600160a01b031681565b6101836102ff366004613074565b61152f565b34801561031057600080fd5b5061018361031f3660046130db565b6117c8565b34801561033057600080fd5b5061018361033f366004613146565b6117e2565b34801561035057600080fd5b5061023061035f366004612e43565b611a0d565b34801561037057600080fd5b5061018361037f366004613146565b611b07565b6000610391848484611c16565b949350505050565b6000546060906103b3906001600160a01b03168484611d1a565b90505b92915050565b606081428110156103e85760405162461bcd60e51b81526004016103df906132c9565b60405180910390fd5b6000546040805160208089028281018201909352888252610432936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451610444919061338d565b81518110610454576104546133ec565b6020026020010151101561047a5760405162461bcd60e51b81526004016103df906132f2565b61052c86866000818110610490576104906133ec565b90506020020160208101906104a59190612d90565b60008054339161050c916001600160a01b0316908b908b90816104ca576104ca6133ec565b90506020020160208101906104df9190612d90565b8b8b60018181106104f2576104f26133ec565b90506020020160208101906105079190612d90565b612014565b8560008151811061051f5761051f6133ec565b6020026020010151612099565b61056b828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b509695505050505050565b600080824281101561059a5760405162461bcd60e51b81526004016103df906132c9565b6001546105b6908a906001600160a01b03168a8a8a308a6112fe565b90935091506105c6898685612387565b600154604051632e1a7d4d60e01b8152600481018490526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b15801561060c57600080fd5b505af1158015610620573d6000803e3d6000fd5b5050505061062e85836124b8565b50965096945050505050565b600080600083428110156106605760405162461bcd60e51b81526004016103df906132c9565b6001548a516001600160a01b03909116908b90600090610682576106826133ec565b60200260200101516001600160a01b0316146106b05760405162461bcd60e51b81526004016103df90613264565b600080546106c8906001600160a01b03168b8d611d1a565b905034816000815181106106de576106de6133ec565b602002602001015111156107045760405162461bcd60e51b81526004016103df90613292565b60015481516001600160a01b039091169063d0e30db090839060009061072c5761072c6133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561075f57600080fd5b505af1158015610773573d6000803e3d6000fd5b5050505050600160009054906101000a90046001600160a01b03166001600160a01b031663a9059cbb6107ee60008054906101000a90046001600160a01b03168e6000815181106107c6576107c66133ec565b60200260200101518f6001815181106107e1576107e16133ec565b6020026020010151612014565b83600081518110610801576108016133ec565b60200260200101516040518363ffffffff1660e01b815260040161083a9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561085457600080fd5b505af1158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190613006565b61089557600080fd5b6108a0818c896121d7565b88816000815181106108b4576108b46133ec565b602002602001015111156109205760405162461bcd60e51b815260206004820152602d60248201527f6e6f7420616c6c6f7720626967676572207468616e206e61746976654375727260448201526c0cadcc6f2a6eec2e092dc9ac2f609b1b60648201526084016103df565b60008b60018d51610931919061338d565b81518110610941576109416133ec565b60200260200101519050600082600081518110610960576109606133ec565b602002602001015134610973919061338d565b90506109e482600160009054906101000a90046001600160a01b0316856001875161099e919061338d565b815181106109ae576109ae6133ec565b60200260200101518487600189516109c6919061338d565b815181106109d6576109d66133ec565b60200260200101518f6125b3565b60008054600154939a5091985091610a0a916001600160a01b0390811691869116612014565b9050610a188333838b612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018d9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ad057600080fd5b505af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190613006565b610b1157600080fd5b6040516335313c2160e11b81526001600160a01b038b81166004830152821690636a62784290602401602060405180830381600087803b158015610b5457600080fd5b505af1158015610b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8c919061305b565b955083600081518110610ba157610ba16133ec565b602002602001015187610bb49190613334565b341115610bf457610bf43385600081518110610bd257610bd26133ec565b602002602001015189610be59190613334565b610bef903461338d565b6124b8565b505050505096509650969350505050565b60608142811015610c285760405162461bcd60e51b81526004016103df906132c9565b6000546040805160208089028281018201909352888252610c72936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110610c8857610c886133ec565b6020026020010151111561047a5760405162461bcd60e51b81526004016103df90613292565b60008060008342811015610cd45760405162461bcd60e51b81526004016103df906132c9565b600154610cef908b906001600160a01b03168b348c8c6125b3565b6000805460015493975091955091610d15916001600160a01b03908116918e9116612014565b9050610d238b338388612099565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7357600080fd5b505af1158015610d87573d6000803e3d6000fd5b505060015460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a9052909116935063a9059cbb92506044019050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190613006565b610e1c57600080fd5b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015610e5f57600080fd5b505af1158015610e73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e97919061305b565b925083341115610eaf57610eaf33610bef863461338d565b505096509650969350505050565b60608142811015610ee05760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b03168686600081610efd57610efd6133ec565b9050602002016020810190610f129190612d90565b6001600160a01b031614610f385760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252610f82936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91503482600081518110610f9857610f986133ec565b60200260200101511115610fbe5760405162461bcd60e51b81526004016103df90613292565b60015482516001600160a01b039091169063d0e30db0908490600090610fe657610fe66133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561101957600080fd5b505af115801561102d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb945061108c9350909116908a908a9081611064576110646133ec565b90506020020160208101906110799190612d90565b8a8a60018181106104f2576104f26133ec565b8460008151811061109f5761109f6133ec565b60200260200101516040518363ffffffff1660e01b81526004016110d89291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156110f257600080fd5b505af1158015611106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112a9190613006565b61113357600080fd5b611172828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b81600081518110611185576111856133ec565b60200260200101513411156111be576111be33836000815181106111ab576111ab6133ec565b602002602001015134610bef919061338d565b5095945050505050565b600081428110156111eb5760405162461bcd60e51b81526004016103df906132c9565b60008a8a6000818110611200576112006133ec565b90506020020160208101906112159190612d90565b905060008b8b61122660018261338d565b818110611235576112356133ec565b905060200201602081019061124a9190612d90565b9050600061125c8a8a8f8f8b8b610c05565b9050600081600081518110611273576112736133ec565b60200260200101518c611286919061338d565b90506112e48385846001865161129c919061338d565b815181106112ac576112ac6133ec565b60200260200101518486600188516112c4919061338d565b815181106112d4576112d46133ec565b60200260200101518e8e8e611a0d565b909150905080965050505050505098975050505050505050565b60008082428110156113225760405162461bcd60e51b81526004016103df906132c9565b6000805461133a906001600160a01b03168c8c612014565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561138b57600080fd5b505af115801561139f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c39190613006565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561140b57600080fd5b505af115801561141f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114439190613122565b9150915060006114538e8e612802565b5090508d6001600160a01b0316816001600160a01b031614611476578183611479565b82825b90975095508a8710156114ce5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b8986101561151e5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b505050505097509795505050505050565b606081428110156115525760405162461bcd60e51b81526004016103df906132c9565b6001546001600160a01b0316868660008161156f5761156f6133ec565b90506020020160208101906115849190612d90565b6001600160a01b0316146115aa5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526115f4936001600160a01b0316923492918b918b91829190850190849080828437600092019190915250611ea792505050565b9150868260018451611606919061338d565b81518110611616576116166133ec565b6020026020010151101561163c5760405162461bcd60e51b81526004016103df906132f2565b60015482516001600160a01b039091169063d0e30db0908490600090611664576116646133ec565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169757600080fd5b505af11580156116ab573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506116e29350909116908a908a9081611064576110646133ec565b846000815181106116f5576116f56133ec565b60200260200101516040518363ffffffff1660e01b815260040161172e9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561174857600080fd5b505af115801561175c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117809190613006565b61178957600080fd5b6111be828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506121d7915050565b6000546060906103b3906001600160a01b03168484611ea7565b606081428110156118055760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611821908261338d565b818110611830576118306133ec565b90506020020160208101906118459190612d90565b6001600160a01b03161461186b5760405162461bcd60e51b81526004016103df90613264565b60005460408051602080890282810182019093528882526118b5936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611ea792505050565b91508682600184516118c7919061338d565b815181106118d7576118d76133ec565b602002602001015110156118fd5760405162461bcd60e51b81526004016103df906132f2565b61191386866000818110610490576104906133ec565b611952828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506121d7915050565b6001805483516001600160a01b0390911691632e1a7d4d9185916119759161338d565b81518110611985576119856133ec565b60200260200101516040518263ffffffff1660e01b81526004016119ab91815260200190565b600060405180830381600087803b1580156119c557600080fd5b505af11580156119d9573d6000803e3d6000fd5b5050505061056b8483600185516119f0919061338d565b81518110611a0057611a006133ec565b60200260200101516124b8565b60008060008342811015611a335760405162461bcd60e51b81526004016103df906132c9565b611a418c8c8c8c8c8c6125b3565b6000805492965090945090611a60906001600160a01b03168e8e612014565b9050611a6e8d338388612099565b611a7a8c338387612099565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611abd57600080fd5b505af1158015611ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af5919061305b565b92505050985098509895505050505050565b60608142811015611b2a5760405162461bcd60e51b81526004016103df906132c9565b600180546001600160a01b03169087908790611b46908261338d565b818110611b5557611b556133ec565b9050602002016020810190611b6a9190612d90565b6001600160a01b031614611b905760405162461bcd60e51b81526004016103df90613264565b6000546040805160208089028281018201909352888252611bda936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611d1a92505050565b91508682600081518110611bf057611bf06133ec565b602002602001015111156118fd5760405162461bcd60e51b81526004016103df90613292565b6000808411611c715760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b60648201526084016103df565b600083118015611c815750600082115b611ccd5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000611cdb856103e56128e3565b90506000611ce982856128e3565b90506000611d0383611cfd886103e86128e3565b9061294a565b9050611d0f818361334c565b979650505050505050565b6060600282511015611d655760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611d7f57611d7f613402565b604051908082528060200260200182016040528015611da8578160200160208202803683370190505b509050828160018351611dbb919061338d565b81518110611dcb57611dcb6133ec565b602002602001018181525050600060018351611de7919061338d565b90505b8015611e9f57600080611e3a8786611e0360018761338d565b81518110611e1357611e136133ec565b6020026020010151878681518110611e2d57611e2d6133ec565b602002602001015161299f565b91509150611e62848481518110611e5357611e536133ec565b60200260200101518383612a76565b84611e6e60018661338d565b81518110611e7e57611e7e6133ec565b60200260200101818152505050508080611e97906133a4565b915050611dea565b509392505050565b6060600282511015611ef25760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b60448201526064016103df565b815167ffffffffffffffff811115611f0c57611f0c613402565b604051908082528060200260200182016040528015611f35578160200160208202803683370190505b5090508281600081518110611f4c57611f4c6133ec565b60200260200101818152505060005b60018351611f69919061338d565b811015611e9f57600080611faf87868581518110611f8957611f896133ec565b602002602001015187866001611f9f9190613334565b81518110611e2d57611e2d6133ec565b91509150611fd7848481518110611fc857611fc86133ec565b60200260200101518383611c16565b84611fe3856001613334565b81518110611ff357611ff36133ec565b6020026020010181815250505050808061200c906133bb565b915050611f5b565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b15801561206157600080fd5b505afa158015612075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103919190612db4565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291516000928392908816916120fd91906131e5565b6000604051808303816000865af19150503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b50915091508180156121695750805115806121695750808060200190518101906121699190613006565b6121cf5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b60648201526084016103df565b505050505050565b60005b600183516121e8919061338d565b81101561238157600080848381518110612204576122046133ec565b60200260200101518584600161221a9190613334565b8151811061222a5761222a6133ec565b60200260200101519150915060006122428383612802565b509050600087612253866001613334565b81518110612263576122636133ec565b60200260200101519050600080836001600160a01b0316866001600160a01b03161461229157826000612295565b6000835b91509150600060028a516122a9919061338d565b88106122b557886122e2565b6000546122e2906001600160a01b0316878c6122d28c6002613334565b815181106107e1576107e16133ec565b6000549091506122fc906001600160a01b03168888612014565b6040516336cd320560e11b815260048101859052602481018490526001600160a01b0383811660448301529190911690636d9a640a90606401600060405180830381600087803b15801561234f57600080fd5b505af1158015612363573d6000803e3d6000fd5b50505050505050505050508080612379906133bb565b9150506121da565b50505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916123e391906131e5565b6000604051808303816000865af19150503d8060008114612420576040519150601f19603f3d011682016040523d82523d6000602084013e612425565b606091505b509150915081801561244f57508051158061244f57508080602001905181019061244f9190613006565b6124b15760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b60648201526084016103df565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516124e291906131e5565b60006040518083038185875af1925050503d806000811461251f576040519150601f19603f3d011682016040523d82523d6000602084013e612524565b606091505b50509050806125ae5760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a4016103df565b505050565b6000805460405163e6a4390560e01b81526001600160a01b03898116600483015288811660248301528392839291169063e6a439059060440160206040518083038186803b15801561260457600080fd5b505afa158015612618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263c9190612db4565b6001600160a01b031614156126d4576000546040516364e329cb60e11b81526001600160a01b038a8116600483015289811660248301529091169063c9c6539690604401602060405180830381600087803b15801561269a57600080fd5b505af11580156126ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d29190612db4565b505b6000805481906126ee906001600160a01b03168b8b61299f565b91509150816000148015612700575080155b15612710578793508692506127f5565b600061271d898484612b75565b905087811161278157858110156127765760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f315f414d4f554e5400000060448201526064016103df565b8894509250826127f3565b600061278e898486612b75565b90508981111561279d57600080fd5b878110156127ed5760405162461bcd60e51b815260206004820152601d60248201527f526f757465723a20494e53554646494349454e545f305f414d4f554e5400000060448201526064016103df565b94508793505b505b5050965096945050505050565b600080826001600160a01b0316846001600160a01b031614156128675760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f414444524553534553000000000060448201526064016103df565b826001600160a01b0316846001600160a01b03161061288757828461288a565b83835b90925090506001600160a01b0382166128dc5760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b60448201526064016103df565b9250929050565b6000811580612907575082826128f9818361336e565b9250612905908361334c565b145b6103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b60448201526064016103df565b6000826129578382613334565b91508110156103b65760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b60448201526064016103df565b60008060006129ae8585612802565b5090506000806129bf888888612014565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401604080518083038186803b1580156129f657600080fd5b505afa158015612a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2e9190613028565b6001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614612a64578082612a67565b81815b90999098509650505050505050565b6000808411612ad25760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b60648201526084016103df565b600083118015612ae25750600082115b612b2e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c4951554944495459000060448201526064016103df565b6000612b466103e8612b4086886128e3565b906128e3565b90506000612b5a6103e5612b408689612c26565b9050612b6b6001611cfd838561334c565b9695505050505050565b6000808411612bbc5760405162461bcd60e51b8152602060048201526013602482015272125394d551919250d251539517d05353d55395606a1b60448201526064016103df565b600083118015612bcc5750600082115b612c115760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b60448201526064016103df565b82612c1c85846128e3565b610391919061334c565b600082612c33838261338d565b91508111156103b65760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b60448201526064016103df565b8035612c8781613418565b919050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b85010111156128dc57600080fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff613402565b8260051b604051601f19603f83011681018181108482111715612d2457612d24613402565b60405284815283810192508684018288018501891015612d4357600080fd5b600092505b85831015612d6d57612d5981612c7c565b845292840192600192909201918401612d48565b50979650505050505050565b80516001600160701b0381168114612c8757600080fd5b600060208284031215612da257600080fd5b8135612dad81613418565b9392505050565b600060208284031215612dc657600080fd5b8151612dad81613418565b600080600080600080600060e0888a031215612dec57600080fd5b8735612df781613418565b96506020880135612e0781613418565b955060408801359450606088013593506080880135925060a0880135612e2c81613418565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b031215612e6057600080fd5b8835612e6b81613418565b97506020890135612e7b81613418565b965060408901359550606089013594506080890135935060a0890135925060c0890135612ea781613418565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215612ed857600080fd5b8635612ee381613418565b95506020870135945060408701359350606087013592506080870135612f0881613418565b8092505060a087013590509295509295509295565b60008060008060008060008060e0898b031215612f3957600080fd5b883567ffffffffffffffff811115612f5057600080fd5b612f5c8b828c01612c8c565b9099509750506020890135955060408901359450606089013593506080890135925060a0890135612f8c81613418565b8092505060c089013590509295985092959890939650565b60008060008060008060c08789031215612fbd57600080fd5b863567ffffffffffffffff811115612fd457600080fd5b612fe089828a01612cd1565b9650506020870135945060408701359350606087013592506080870135612f0881613418565b60006020828403121561301857600080fd5b81518015158114612dad57600080fd5b6000806040838503121561303b57600080fd5b61304483612d79565b915061305260208401612d79565b90509250929050565b60006020828403121561306d57600080fd5b5051919050565b60008060008060006080868803121561308c57600080fd5b85359450602086013567ffffffffffffffff8111156130aa57600080fd5b6130b688828901612c8c565b90955093505060408601356130ca81613418565b949793965091946060013592915050565b600080604083850312156130ee57600080fd5b82359150602083013567ffffffffffffffff81111561310c57600080fd5b61311885828601612cd1565b9150509250929050565b6000806040838503121561313557600080fd5b505080516020909101519092909150565b60008060008060008060a0878903121561315f57600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561318457600080fd5b61319089828a01612c8c565b90955093505060608701356131a481613418565b80925050608087013590509295509295509295565b6000806000606084860312156131ce57600080fd5b505081359360208301359350604090920135919050565b6000825160005b8181101561320657602081860181015185830152016131ec565b81811115613215576000828501525b509190910192915050565b6020808252825182820181905260009190848201906040850190845b818110156132585783518352928401929184019160010161323c565b50909695505050505050565b6020808252601490820152730a4deeae8cae47440929cac82989288bea082a8960631b604082015260600190565b6020808252601e908201527f526f757465723a204558434553534956455f494e5055545f414d4f554e540000604082015260600190565b6020808252600f908201526e149bdd5d195c8e8811561412549151608a1b604082015260600190565b60208082526022908201527f526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55604082015261139560f21b606082015260800190565b60008219821115613347576133476133d6565b500190565b60008261336957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613388576133886133d6565b500290565b60008282101561339f5761339f6133d6565b500390565b6000816133b3576133b36133d6565b506000190190565b60006000198214156133cf576133cf6133d6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461342d57600080fd5b5056fea26469706673582212208d0347b698ede02582681341f3d0731e07e8b75877604cdd90701fe46fb5519f64736f6c63430008070033000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f36ae63d89983e3aea8aaad1086c3280eb01438d
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

16839:16263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17324:15;;-1:-1:-1;;;;;17324:15:0;17310:10;:29;17302:38;;;;;;16839:16263;;;;;32131:240;;;;;;;;;;-1:-1:-1;32131:240:0;;;;;:::i;:::-;;:::i;:::-;;;19704:25:1;;;19692:2;19677:18;32131:240:0;;;;;;;;32867:232;;;;;;;;;;-1:-1:-1;32867:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27069:669::-;;;;;;;;;;-1:-1:-1;27069:669:0;;;;;:::i;:::-;;:::i;25393:829::-;;;;;;;;;;-1:-1:-1;25393:829:0;;;;;:::i;:::-;;:::i;:::-;;;;19914:25:1;;;19970:2;19955:18;;19948:34;;;;19887:18;25393:829:0;19740:248:1;16942:39:0;;;;;;;;;;-1:-1:-1;16942:39:0;;;;-1:-1:-1;;;;;16942:39:0;;;;;;-1:-1:-1;;;;;10044:32:1;;;10026:51;;10014:2;9999:18;16942:39:0;9880:203:1;20603:2284:0;;;;;;:::i;:::-;;:::i;:::-;;;;20545:25:1;;;20601:2;20586:18;;20579:34;;;;20629:18;;;20622:34;20533:2;20518:18;20603:2284:0;20343:319:1;27746:610:0;;;;;;;;;;-1:-1:-1;27746:610:0;;;;;:::i;:::-;;:::i;19287:1308::-;;;;;;:::i;:::-;;:::i;31130:993::-;;;;;;:::i;:::-;;:::i;18339:940::-;;;;;;;;;;-1:-1:-1;18339:940:0;;;;;:::i;:::-;;:::i;24517:868::-;;;;;;;;;;-1:-1:-1;24517:868:0;;;;;:::i;:::-;;:::i;16904:31::-;;;;;;;;;;-1:-1:-1;16904:31:0;;;;-1:-1:-1;;;;;16904:31:0;;;28364:861;;;;;;:::i;:::-;;:::i;32627:232::-;;;;;;;;;;-1:-1:-1;32627:232:0;;;;;:::i;:::-;;:::i;30152:970::-;;;;;;;;;;-1:-1:-1;30152:970:0;;;;;:::i;:::-;;:::i;17434:897::-;;;;;;;;;;-1:-1:-1;17434:897:0;;;;;:::i;:::-;;:::i;29233:911::-;;;;;;;;;;-1:-1:-1;29233:911:0;;;;;:::i;:::-;;:::i;32131:240::-;32274:17;32311:52;32331:8;32341:9;32352:10;32311:19;:52::i;:::-;32304:59;32131:240;-1:-1:-1;;;;32131:240:0:o;32867:232::-;33066:7;;32997:24;;33046:45;;-1:-1:-1;;;;;33066:7:0;33075:9;33086:4;33046:19;:45::i;:::-;33039:52;;32867:232;;;;;:::o;27069:669::-;27292:24;27273:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;;;;;;;;;27360:7:::1;::::0;27339:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;27360:7:0::1;::::0;27369:8;;27339:45;27379:4;;;;;;27339:45;;::::1;::::0;27379:4;;27339:45;27379:4;27339:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27339:20:0::1;::::0;-1:-1:-1;;;27339:45:0:i:1;:::-;27329:55;;27448:12;27417:7;27442:1;27425:7;:14;:18;;;;:::i;:::-;27417:27;;;;;;;;:::i;:::-;;;;;;;:43;;27395:127;;;;-1:-1:-1::0;;;27395:127:0::1;;;;;;;:::i;:::-;27533:162;27571:4;;27576:1;27571:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27633;::::0;;27593:10:::1;::::0;27618:41:::1;::::0;-1:-1:-1;;;;;27633:7:0::1;::::0;27642:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27651:4;;27656:1;27651:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;27618:14;:41::i;:::-;27674:7;27682:1;27674:10;;;;;;;;:::i;:::-;;;;;;;27533:23;:162::i;:::-;27706:24;27712:7;27721:4;;27706:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27727:2:0;;-1:-1:-1;27706:5:0::1;::::0;-1:-1:-1;;27706:24:0:i:1;:::-;27069:669:::0;;;;;;;;;:::o;25393:829::-;25692:19;25713:28;25664:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;25847:15:::1;::::0;25797:218:::1;::::0;25827:5;;-1:-1:-1;;;;;25847:15:0::1;25877:9:::0;25901:14;25930:23;25976:4:::1;25996:8:::0;25797:15:::1;:218::i;:::-;25759:256:::0;;-1:-1:-1;25759:256:0;-1:-1:-1;26026:43:0::1;26046:5:::0;26053:2;25759:256;26026:19:::1;:43::i;:::-;26097:15;::::0;26080:64:::1;::::0;-1:-1:-1;;;26080:64:0;;::::1;::::0;::::1;19704:25:1::0;;;-1:-1:-1;;;;;26097:15:0;;::::1;::::0;26080:42:::1;::::0;19677:18:1;;26080:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26155:59;26189:2;26193:20;26155:33;:59::i;:::-;25393:829:::0;;;;;;;;;;:::o;20603:2284::-;20960:19;20994:28;21037:17;20918:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;21118:15:::1;::::0;21107:7;;-1:-1:-1;;;;;21118:15:0;;::::1;::::0;21107:4;;21118:15:::1;::::0;21107:7:::1;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;21107:26:0::1;;21099:59;;;;-1:-1:-1::0;;;21099:59:0::1;;;;;;;:::i;:::-;21169:24;21230:7:::0;;21196:99:::1;::::0;-1:-1:-1;;;;;21230:7:0::1;21252:13:::0;21280:4;21196:19:::1;:99::i;:::-;21169:126;;21330:9;21316:7;21324:1;21316:10;;;;;;;;:::i;:::-;;;;;;;:23;;21308:66;;;;-1:-1:-1::0;;;21308:66:0::1;;;;;;;:::i;:::-;21402:15;::::0;21434:10;;-1:-1:-1;;;;;21402:15:0;;::::1;::::0;21385:41:::1;::::0;21434:7;;21402:15:::1;::::0;21434:10:::1;;;;:::i;:::-;;;;;;;21385:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;21489:15;;;;;;;;;-1:-1:-1::0;;;;;21489:15:0::1;-1:-1:-1::0;;;;;21482:32:0::1;;21533:41;21548:7;::::0;::::1;;;;;;-1:-1:-1::0;;;;;21548:7:0::1;21557:4;21562:1;21557:7;;;;;;;;:::i;:::-;;;;;;;21566:4;21571:1;21566:7;;;;;;;;:::i;:::-;;;;;;;21533:14;:41::i;:::-;21593:7;21601:1;21593:10;;;;;;;;:::i;:::-;;;;;;;21482:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;21482:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21460:169;;;::::0;::::1;;21642:24;21648:7;21657:4;21663:2;21642:5;:24::i;:::-;21715:23;21701:7;21709:1;21701:10;;;;;;;;:::i;:::-;;;;;;;:37;;21679:132;;;::::0;-1:-1:-1;;;21679:132:0;;16362:2:1;21679:132:0::1;::::0;::::1;16344:21:1::0;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:43;16544:19;;21679:132:0::1;16160:409:1::0;21679:132:0::1;21849:13;21865:4;21884:1;21870:4;:11;:15;;;;:::i;:::-;21865:21;;;;;;;;:::i;:::-;;;;;;;21849:37;;21897:29;21941:7;21949:1;21941:10;;;;;;;;:::i;:::-;;;;;;;21929:9;:22;;;;:::i;:::-;21897:54;;22000:233;22028:5;22048:15;;;;;;;;;-1:-1:-1::0;;;;;22048:15:0::1;22078:7;22103:1;22086:7;:14;:18;;;;:::i;:::-;22078:27;;;;;;;;:::i;:::-;;;;;;;22120:21;22156:7;22181:1;22164:7;:14;:18;;;;:::i;:::-;22156:27;;;;;;;;:::i;:::-;;;;;;;22198:24;22000:13;:233::i;:::-;22246:12;22276:7:::0;;;22292:15;21962:271;;-1:-1:-1;21962:271:0;;-1:-1:-1;22246:12:0;22261:47:::1;::::0;-1:-1:-1;;;;;22276:7:0;;::::1;::::0;22285:5;;22292:15:::1;22261:14;:47::i;:::-;22246:62;;22321:61;22345:5;22352:10;22364:4;22370:11;22321:23;:61::i;:::-;22412:15;;;;;;;;;-1:-1:-1::0;;;;;22412:15:0::1;-1:-1:-1::0;;;;;22395:41:0::1;;22458:20;22395:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;22519:15:0::1;::::0;22512:60:::1;::::0;-1:-1:-1;;;22512:60:0;;-1:-1:-1;;;;;10969:32:1;;;22512:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;22519:15:0;;::::1;::::0;-1:-1:-1;22512:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;22512:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22504:69;;;::::0;::::1;;22598:20;::::0;-1:-1:-1;;;22598:20:0;;-1:-1:-1;;;;;10044:32:1;;;22598:20:0::1;::::0;::::1;10026:51:1::0;22598:16:0;::::1;::::0;::::1;::::0;9999:18:1;;22598:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22586:32;;22671:7;22679:1;22671:10;;;;;;;;:::i;:::-;;;;;;;22648:20;:33;;;;:::i;:::-;22635:9;:47;22631:209;;;22697:143;22749:10;22814:7;22822:1;22814:10;;;;;;;;:::i;:::-;;;;;;;22791:20;:33;;;;:::i;:::-;22778:47;::::0;:9:::1;:47;:::i;:::-;22697:33;:143::i;:::-;21071:1816;;;;20603:2284:::0;;;;;;;;;;;:::o;27746:610::-;27969:24;27950:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28036:7:::1;::::0;28016:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28036:7:0::1;::::0;28045:9;;28016:45;28056:4;;;;;;28016:45;;::::1;::::0;28056:4;;28016:45;28056:4;28016:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28016:19:0::1;::::0;-1:-1:-1;;;28016:45:0:i:1;:::-;28006:55;;28094:11;28080:7;28088:1;28080:10;;;;;;;;:::i;:::-;;;;;;;:25;;28072:68;;;;-1:-1:-1::0;;;28072:68:0::1;;;;;;;:::i;19287:1308::-:0;19625:19;19659:28;19702:17;19583:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;19833:15:::1;::::0;19785:198:::1;::::0;19813:5;;-1:-1:-1;;;;;19833:15:0::1;19863:18:::0;19896:9:::1;19920:14:::0;19949:23;19785:13:::1;:198::i;:::-;19994:12;20024:7:::0;;;20040:15;19747:236;;-1:-1:-1;19747:236:0;;-1:-1:-1;19994:12:0;20009:47:::1;::::0;-1:-1:-1;;;;;20024:7:0;;::::1;::::0;20033:5;;20040:15:::1;20009:14;:47::i;:::-;19994:62;;20067:61;20091:5;20098:10;20110:4;20116:11;20067:23;:61::i;:::-;20156:15;;;;;;;;;-1:-1:-1::0;;;;;20156:15:0::1;-1:-1:-1::0;;;;;20139:41:0::1;;20202:20;20139:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20261:15:0::1;::::0;20254:60:::1;::::0;-1:-1:-1;;;20254:60:0;;-1:-1:-1;;;;;10969:32:1;;;20254:60:0::1;::::0;::::1;10951:51:1::0;11018:18;;;11011:34;;;20261:15:0;;::::1;::::0;-1:-1:-1;20254:32:0::1;::::0;-1:-1:-1;10924:18:1;;;-1:-1:-1;20254:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20246:69;;;::::0;::::1;;20338:20;::::0;-1:-1:-1;;;20338:20:0;;-1:-1:-1;;;;;10044:32:1;;;20338:20:0::1;::::0;::::1;10026:51:1::0;20338:16:0;::::1;::::0;::::1;::::0;9999:18:1;;20338:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20326:32;;20385:20;20373:9;:32;20369:179;;;20420:128;20472:10;20501:32;20513:20:::0;20501:9:::1;:32;:::i;20420:128::-;19736:859;19287:1308:::0;;;;;;;;;;;:::o;31130:993::-;31386:24;31358:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;31447:15:::1;::::0;-1:-1:-1;;;;;31447:15:0::1;31436:4:::0;;31447:15:::1;31436:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31436:26:0::1;;31428:59;;;;-1:-1:-1::0;;;31428:59:0::1;;;;;;;:::i;:::-;31528:7;::::0;31508:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;31528:7:0::1;::::0;31537:9;;31508:45;31548:4;;;;;;31508:45;;::::1;::::0;31548:4;;31508:45;31548:4;31508:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31508:19:0::1;::::0;-1:-1:-1;;;31508:45:0:i:1;:::-;31498:55;;31586:9;31572:7;31580:1;31572:10;;;;;;;;:::i;:::-;;;;;;;:23;;31564:66;;;;-1:-1:-1::0;;;31564:66:0::1;;;;;;;:::i;:::-;31658:15;::::0;31690:10;;-1:-1:-1;;;;;31658:15:0;;::::1;::::0;31641:41:::1;::::0;31690:7;;31658:15:::1;::::0;31690:10:::1;;;;:::i;:::-;;;;;;;31641:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;31743:15:0::1;::::0;::::1;31802:7:::0;;-1:-1:-1;;;;;31743:15:0;;::::1;::::0;-1:-1:-1;31736:32:0::1;::::0;-1:-1:-1;31787:41:0::1;::::0;-1:-1:-1;31802:7:0;;::::1;::::0;31811:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;31820:4;;31825:1;31820:7;;;;;;;:::i;31787:41::-;31847:7;31855:1;31847:10;;;;;;;;:::i;:::-;;;;;;;31736:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;31736:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31714:169;;;::::0;::::1;;31894:24;31900:7;31909:4;;31894:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31915:2:0;;-1:-1:-1;31894:5:0::1;::::0;-1:-1:-1;;31894:24:0:i:1;:::-;31945:7;31953:1;31945:10;;;;;;;;:::i;:::-;;;;;;;31933:9;:22;31929:159;;;31970:118;32022:10;32063:7;32071:1;32063:10;;;;;;;;:::i;:::-;;;;;;;32051:9;:22;;;;:::i;31970:118::-;31130:993:::0;;;;;;;;:::o;18339:940::-;18635:17;18616:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;18665:14:::1;18682:4;;18687:1;18682:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18665:24:::0;-1:-1:-1;18700:14:0::1;18717:4:::0;;18722:15:::1;18736:1;18717:4:::0;18722:15:::1;:::i;:::-;18717:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18700:38;;18751:24;18778:152;18817:13;18845:15;18875:4;;18894:2;18911:8;18778:24;:152::i;:::-;18751:179;;18943:23;18980:7;18988:1;18980:10;;;;;;;;:::i;:::-;;;;;;;18969:8;:21;;;;:::i;:::-;18943:47;;19019:252;19046:6;19067;19088:7;19113:1;19096:7;:14;:18;;;;:::i;:::-;19088:27;;;;;;;;:::i;:::-;;;;;;;19130:15;19160:7;19185:1;19168:7;:14;:18;;;;:::i;:::-;19160:27;;;;;;;;:::i;:::-;;;;;;;19202:18;19235:2;19252:8;19019:12;:252::i;:::-;19001:270;;;;;;;;;18654:625;;;;18339:940:::0;;;;;;;;;;;:::o;24517:868::-;24811:15;24828;24783:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;24861:12:::1;24891:7:::0;;24876:39:::1;::::0;-1:-1:-1;;;;;24891:7:0::1;24900:6:::0;24908;24876:14:::1;:39::i;:::-;24926:54;::::0;-1:-1:-1;;;24926:54:0;;24952:10:::1;24926:54;::::0;::::1;10637:34:1::0;-1:-1:-1;;;;;24926:25:0;::::1;10687:18:1::0;;;10680:43;;;10739:18;;;10732:34;;;24861:54:0;;-1:-1:-1;24926:25:0::1;::::0;10572:18:1;;24926:54:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25028:20:0::1;::::0;-1:-1:-1;;;25028:20:0;;-1:-1:-1;;;;;10044:32:1;;;25028:20:0::1;::::0;::::1;10026:51:1::0;24992:15:0::1;::::0;;;25028:16;::::1;::::0;::::1;::::0;9999:18:1;;25028:20:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24991:57;;;;25060:14;25080:33;25098:6;25106;25080:17;:33::i;:::-;25059:54;;;25155:6;-1:-1:-1::0;;;;;25145:16:0::1;:6;-1:-1:-1::0;;;;;25145:16:0::1;;:84;;25212:7;25221;25145:84;;;25178:7;25187;25145:84;25124:105:::0;;-1:-1:-1;25124:105:0;-1:-1:-1;25248:21:0;;::::1;;25240:63;;;::::0;-1:-1:-1;;;25240:63:0;;16776:2:1;25240:63:0::1;::::0;::::1;16758:21:1::0;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;25240:63:0::1;16574:353:1::0;25240:63:0::1;25333:10;25322:7;:21;;25314:63;;;::::0;-1:-1:-1;;;25314:63:0;;14069:2:1;25314:63:0::1;::::0;::::1;14051:21:1::0;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;25314:63:0::1;13867:353:1::0;25314:63:0::1;24850:535;;;;24517:868:::0;;;;;;;;;;;:::o;28364:861::-;28623:24;28595:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;28684:15:::1;::::0;-1:-1:-1;;;;;28684:15:0::1;28673:4:::0;;28684:15:::1;28673:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28673:26:0::1;;28665:59;;;;-1:-1:-1::0;;;28665:59:0::1;;;;;;;:::i;:::-;28766:7;::::0;28745:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;28766:7:0::1;::::0;28775:9:::1;::::0;28745:46;28786:4;;;;;;28745:46;;::::1;::::0;28786:4;;28745:46;28786:4;28745:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28745:20:0::1;::::0;-1:-1:-1;;;28745:46:0:i:1;:::-;28735:56;;28855:12;28824:7;28849:1;28832:7;:14;:18;;;;:::i;:::-;28824:27;;;;;;;;:::i;:::-;;;;;;;:43;;28802:127;;;;-1:-1:-1::0;;;28802:127:0::1;;;;;;;:::i;:::-;28957:15;::::0;28989:10;;-1:-1:-1;;;;;28957:15:0;;::::1;::::0;28940:41:::1;::::0;28989:7;;28957:15:::1;::::0;28989:10:::1;;;;:::i;:::-;;;;;;;28940:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29042:15:0::1;::::0;::::1;29101:7:::0;;-1:-1:-1;;;;;29042:15:0;;::::1;::::0;-1:-1:-1;29035:32:0::1;::::0;-1:-1:-1;29086:41:0::1;::::0;-1:-1:-1;29101:7:0;;::::1;::::0;29110:4;;;;:7;::::1;;;;:::i;29086:41::-;29146:7;29154:1;29146:10;;;;;;;;:::i;:::-;;;;;;;29035:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;10969:32:1;;;;10951:51;;11033:2;11018:18;;11011:34;10939:2;10924:18;;10777:274;29035:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29013:169;;;::::0;::::1;;29193:24;29199:7;29208:4;;29193:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29214:2:0;;-1:-1:-1;29193:5:0::1;::::0;-1:-1:-1;;29193:24:0:i:1;32627:232::-:0;32827:7;;32757:24;;32806:45;;-1:-1:-1;;;;;32827:7:0;32836:8;32846:4;32806:20;:45::i;30152:970::-;30385:24;30366:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;30469:15:::1;::::0;;-1:-1:-1;;;;;30469:15:0::1;::::0;30444:4;;;;30449:15:::1;::::0;30444:4;30449:15:::1;:::i;:::-;30444:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30444:40:0::1;;30422:110;;;;-1:-1:-1::0;;;30422:110:0::1;;;;;;;:::i;:::-;30574:7;::::0;30553:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;30574:7:0::1;::::0;30583:8;;30553:45;30593:4;;;;;;30553:45;;::::1;::::0;30593:4;;30553:45;30593:4;30553:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;30553:20:0::1;::::0;-1:-1:-1;;;30553:45:0:i:1;:::-;30543:55;;30662:12;30631:7;30656:1;30639:7;:14;:18;;;;:::i;:::-;30631:27;;;;;;;;:::i;:::-;;;;;;;:43;;30609:127;;;;-1:-1:-1::0;;;30609:127:0::1;;;;;;;:::i;:::-;30747:162;30785:4;;30790:1;30785:7;;;;;;;:::i;30747:162::-;30920:35;30926:7;30935:4;;30920:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30949:4:0::1;::::0;-1:-1:-1;30920:5:0::1;::::0;-1:-1:-1;;30920:35:0:i:1;:::-;30983:15;::::0;;31017:14;;-1:-1:-1;;;;;30983:15:0;;::::1;::::0;30966:42:::1;::::0;31009:7;;31017:18:::1;::::0;::::1;:::i;:::-;31009:27;;;;;;;;:::i;:::-;;;;;;;30966:71;;;;;;;;;;;;;19704:25:1::0;;19692:2;19677:18;;19558:177;30966:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31048:66;31082:2;31086:7;31111:1;31094:7;:14;:18;;;;:::i;:::-;31086:27;;;;;;;;:::i;:::-;;;;;;;31048:33;:66::i;17434:897::-:0;17777:15;17807;17837:17;17735:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;17903:174:::1;17931:6;17952;17973:14;18002;18031:10;18056;17903:13;:174::i;:::-;18088:12;18118:7:::0;;17882:195;;-1:-1:-1;17882:195:0;;-1:-1:-1;18088:12:0;18103:39:::1;::::0;-1:-1:-1;;;;;18118:7:0::1;18127:6:::0;18135;18103:14:::1;:39::i;:::-;18088:54;;18153:58;18177:6;18185:10;18197:4;18203:7;18153:23;:58::i;:::-;18222;18246:6;18254:10;18266:4;18272:7;18222:23;:58::i;:::-;18303:20;::::0;-1:-1:-1;;;18303:20:0;;-1:-1:-1;;;;;10044:32:1;;;18303:20:0::1;::::0;::::1;10026:51:1::0;18303:16:0;::::1;::::0;::::1;::::0;9999:18:1;;18303:20:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18291:32;;17871:460;17434:897:::0;;;;;;;;;;;;;:::o;29233:911::-;29466:24;29447:8;17201:15;17189:8;:27;;17181:55;;;;-1:-1:-1;;;17181:55:0;;;;;;;:::i;:::-;29550:15:::1;::::0;;-1:-1:-1;;;;;29550:15:0::1;::::0;29525:4;;;;29530:15:::1;::::0;29525:4;29530:15:::1;:::i;:::-;29525:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29525:40:0::1;;29503:110;;;;-1:-1:-1::0;;;29503:110:0::1;;;;;;;:::i;:::-;29654:7;::::0;29634:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;29654:7:0::1;::::0;29663:9;;29634:45;29674:4;;;;;;29634:45;;::::1;::::0;29674:4;;29634:45;29674:4;29634:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;29634:19:0::1;::::0;-1:-1:-1;;;29634:45:0:i:1;:::-;29624:55;;29712:11;29698:7;29706:1;29698:10;;;;;;;;:::i;:::-;;;;;;;:25;;29690:68;;;;-1:-1:-1::0;;;29690:68:0::1;;;;;;;:::i;6694:589::-:0;6830:17;6879:1;6868:8;:12;6860:58;;;;-1:-1:-1;;;6860:58:0;;19358:2:1;6860:58:0;;;19340:21:1;19397:2;19377:18;;;19370:30;19436:34;19416:18;;;19409:62;-1:-1:-1;;;19487:18:1;;;19480:31;19528:19;;6860:58:0;19156:397:1;6860:58:0;6963:1;6951:9;:13;:31;;;;;6981:1;6968:10;:14;6951:31;6929:111;;;;-1:-1:-1;;;6929:111:0;;17951:2:1;6929:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;6929:111:0;17749:354:1;6929:111:0;7051:23;7077:17;:8;7090:3;7077:12;:17::i;:::-;7051:43;-1:-1:-1;7105:17:0;7125:31;7051:43;7145:10;7125:19;:31::i;:::-;7105:51;-1:-1:-1;7167:19:0;7189:40;7213:15;7189:19;:9;7203:4;7189:13;:19::i;:::-;:23;;:40::i;:::-;7167:62;-1:-1:-1;7252:23:0;7167:62;7252:9;:23;:::i;:::-;7240:35;6694:589;-1:-1:-1;;;;;;;6694:589:0:o;8654:640::-;8792:24;8852:1;8837:4;:11;:16;;8829:49;;;;-1:-1:-1;;;8829:49:0;;18310:2:1;8829:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8829:49:0;18108:344:1;8829:49:0;8913:4;:11;8899:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8899:26:0;;8889:36;;8966:9;8936:7;8961:1;8944:7;:14;:18;;;;:::i;:::-;8936:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;8991:9;9017:1;9003:4;:11;:15;;;;:::i;:::-;8991:27;;8986:301;9020:5;;8986:301;;9048:17;;9089:108;9119:7;9145:4;9150:5;9154:1;9150;:5;:::i;:::-;9145:11;;;;;;;;:::i;:::-;;;;;;;9175:4;9180:1;9175:7;;;;;;;;:::i;:::-;;;;;;;9089:11;:108::i;:::-;9047:150;;;;9229:46;9241:7;9249:1;9241:10;;;;;;;;:::i;:::-;;;;;;;9253:9;9264:10;9229:11;:46::i;:::-;9212:7;9220:5;9224:1;9220;:5;:::i;:::-;9212:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9032:255;;9027:3;;;;;:::i;:::-;;;;8986:301;;;;8654:640;;;;;:::o;8027:619::-;8165:24;8225:1;8210:4;:11;:16;;8202:49;;;;-1:-1:-1;;;8202:49:0;;18310:2:1;8202:49:0;;;18292:21:1;18349:2;18329:18;;;18322:30;-1:-1:-1;;;18368:18:1;;;18361:50;18428:18;;8202:49:0;18108:344:1;8202:49:0;8286:4;:11;8272:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8272:26:0;;8262:36;;8322:8;8309:7;8317:1;8309:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8346:9;8341:298;8375:1;8361:4;:11;:15;;;;:::i;:::-;8357:1;:19;8341:298;;;8399:17;8418:18;8440:108;8470:7;8496:4;8501:1;8496:7;;;;;;;;:::i;:::-;;;;;;;8522:4;8527:1;8531;8527:5;;;;:::i;:::-;8522:11;;;;;;;;:::i;8440:108::-;8398:150;;;;8580:47;8593:7;8601:1;8593:10;;;;;;;;:::i;:::-;;;;;;;8605:9;8616:10;8580:12;:47::i;:::-;8563:7;8571:5;:1;8575;8571:5;:::i;:::-;8563:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8383:256;;8378:3;;;;;:::i;:::-;;;;8341:298;;4237:204;4392:41;;-1:-1:-1;;;4392:41:0;;-1:-1:-1;;;;;10318:15:1;;;4392:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;4360:12:0;;4392:25;;;;;;10235:18:1;;4392:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5274:522::-;5559:51;;;-1:-1:-1;;;;;10655:15:1;;;5559:51:0;;;10637:34:1;10707:15;;;10687:18;;;10680:43;10739:18;;;;10732:34;;;5559:51:0;;;;;;;;;;10572:18:1;;;;5559:51:0;;;;;;;-1:-1:-1;;;;;5559:51:0;-1:-1:-1;;;5559:51:0;;;5534:87;;-1:-1:-1;;;;5534:10:0;;;;:87;;5559:51;5534:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5498:123;;;;5654:7;:57;;;;-1:-1:-1;5666:11:0;;:16;;:44;;;5697:4;5686:24;;;;;;;;;;;;:::i;:::-;5632:156;;;;-1:-1:-1;;;5632:156:0;;13651:2:1;5632:156:0;;;13633:21:1;13690:2;13670:18;;;13663:30;13729:34;13709:18;;;13702:62;-1:-1:-1;;;13780:18:1;;;13773:47;13837:19;;5632:156:0;13449:413:1;5632:156:0;5408:388;;5274:522;;;;:::o;26230:831::-;26365:9;26360:694;26394:1;26380:4;:11;:15;;;;:::i;:::-;26376:1;:19;26360:694;;;26418:13;26433:14;26452:4;26457:1;26452:7;;;;;;;;:::i;:::-;;;;;;;26461:4;26466:1;26470;26466:5;;;;:::i;:::-;26461:11;;;;;;;;:::i;:::-;;;;;;;26417:56;;;;26489:14;26509:32;26527:5;26534:6;26509:17;:32::i;:::-;-1:-1:-1;26488:53:0;-1:-1:-1;26556:17:0;26576:7;26584:5;:1;26588;26584:5;:::i;:::-;26576:14;;;;;;;;:::i;:::-;;;;;;;26556:34;;26606:18;26626;26657:6;-1:-1:-1;;;;;26648:15:0;:5;-1:-1:-1;;;;;26648:15:0;;:101;;26727:9;26746:1;26648:101;;;26692:1;26696:9;26648:101;26605:144;;;;26764:10;26795:1;26781:4;:11;:15;;;;:::i;:::-;26777:1;:19;:106;;26880:3;26777:106;;;26831:7;;26816:44;;-1:-1:-1;;;;;26831:7:0;26840:6;26848:4;26853:5;:1;26857;26853:5;:::i;:::-;26848:11;;;;;;;;:::i;26816:44::-;26919:7;;26764:119;;-1:-1:-1;26904:38:0;;-1:-1:-1;;;;;26919:7:0;26928:5;26935:6;26904:14;:38::i;:::-;26898:144;;-1:-1:-1;;;26898:144:0;;;;;20195:25:1;;;20236:18;;;20229:34;;;-1:-1:-1;;;;;20299:32:1;;;20279:18;;;20272:60;26898:50:0;;;;;;;20168:18:1;;26898:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26402:652;;;;;;;26397:3;;;;;:::i;:::-;;;;26360:694;;;;26230:831;;;:::o;5804:473::-;6050:45;;;-1:-1:-1;;;;;10969:32:1;;;6050:45:0;;;10951:51:1;11018:18;;;;11011:34;;;6050:45:0;;;;;;;;;;10924:18:1;;;;6050:45:0;;;;;;;-1:-1:-1;;;;;6050:45:0;-1:-1:-1;;;6050:45:0;;;6025:81;;-1:-1:-1;;;;6025:10:0;;;;:81;;6050:45;6025:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5989:117;;;;6139:7;:57;;;;-1:-1:-1;6151:11:0;;:16;;:44;;;6182:4;6171:24;;;;;;;;;;;;:::i;:::-;6117:152;;;;-1:-1:-1;;;6117:152:0;;17537:2:1;6117:152:0;;;17519:21:1;17576:2;17556:18;;;17549:30;17615:34;17595:18;;;17588:62;-1:-1:-1;;;17666:18:1;;;17659:43;17719:19;;6117:152:0;17335:409:1;6117:152:0;5911:366;;5804:473;;;:::o;6285:287::-;6409:12;;;6369;6409;;;;;;;;;-1:-1:-1;;;;;6387:7:0;;;6402:5;;6387:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6368:54;;;6455:7;6433:131;;;;-1:-1:-1;;;6433:131:0;;14427:2:1;6433:131:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;14576:34;14556:18;;;14549:62;-1:-1:-1;;;14627:19:1;;;14620:41;14678:19;;6433:131:0;14225:478:1;6433:131:0;6357:215;6285:287;;:::o;22895:1614::-;23116:15;23174:7;;23165:41;;-1:-1:-1;;;23165:41:0;;-1:-1:-1;;;;;10318:15:1;;;23165:41:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23116:15:0;;;;23174:7;;;23165:25;;10235:18:1;;23165:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;23165:55:0;;23161:132;;;23246:7;;23237:44;;-1:-1:-1;;;23237:44:0;;-1:-1:-1;;;;;10318:15:1;;;23237:44:0;;;10300:34:1;10370:15;;;10350:18;;;10343:43;23246:7:0;;;;23237:28;;10235:18:1;;23237:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23161:132;23304:16;23375:7;;23304:16;;23342:93;;-1:-1:-1;;;;;23375:7:0;23397:6;23418;23342:18;:93::i;:::-;23303:132;;;;23450:8;23462:1;23450:13;:30;;;;-1:-1:-1;23467:13:0;;23450:30;23446:1056;;;23519:14;;-1:-1:-1;23535:14:0;;-1:-1:-1;23446:1056:0;;;23583:22;23608:114;23639:14;23672:8;23699;23608:12;:114::i;:::-;23583:139;;23759:14;23741;:32;23737:754;;23842:10;23824:14;:28;;23794:131;;;;-1:-1:-1;;;23794:131:0;;14069:2:1;23794:131:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:31;14127:18;;;14120:59;14196:18;;23794:131:0;13867:353:1;23794:131:0;23966:14;;-1:-1:-1;23982:14:0;-1:-1:-1;23982:14:0;23737:754;;;24038:22;24063:130;24098:14;24135:8;24166;24063:12;:130::i;:::-;24038:155;;24238:14;24220;:32;;24212:41;;;;;;24320:10;24302:14;:28;;24272:131;;;;-1:-1:-1;;;24272:131:0;;16776:2:1;24272:131:0;;;16758:21:1;16815:2;16795:18;;;16788:30;16854:31;16834:18;;;16827:59;16903:18;;24272:131:0;16574:353:1;24272:131:0;24444:14;-1:-1:-1;24460:14:0;;-1:-1:-1;23737:754:0;23568:934;23446:1056;23150:1359;;22895:1614;;;;;;;;;:::o;3842:387::-;3944:14;3960;4010:6;-1:-1:-1;;;;;4000:16:0;:6;-1:-1:-1;;;;;4000:16:0;;;3992:56;;;;-1:-1:-1;;;3992:56:0;;16006:2:1;3992:56:0;;;15988:21:1;16045:2;16025:18;;;16018:30;16084:29;16064:18;;;16057:57;16131:18;;3992:56:0;15804:351:1;3992:56:0;4087:6;-1:-1:-1;;;;;4078:15:0;:6;-1:-1:-1;;;;;4078:15:0;;:79;;4142:6;4150;4078:79;;;4110:6;4118;4078:79;4059:98;;-1:-1:-1;4059:98:0;-1:-1:-1;;;;;;4176:20:0;;4168:53;;;;-1:-1:-1;;;4168:53:0;;14910:2:1;4168:53:0;;;14892:21:1;14949:2;14929:18;;;14922:30;-1:-1:-1;;;14968:18:1;;;14961:50;15028:18;;4168:53:0;14708:344:1;4168:53:0;3842:387;;;;;:::o;3550:151::-;3608:9;3638:6;;;:30;;-1:-1:-1;3667:1:0;3662;3653:5;3662:1;3667;3653:5;:::i;:::-;3649:9;-1:-1:-1;3648:15:0;;3649:9;3648:15;:::i;:::-;:20;3638:30;3630:63;;;;-1:-1:-1;;;3630:63:0;;12594:2:1;3630:63:0;;;12576:21:1;12633:2;12613:18;;;12606:30;-1:-1:-1;;;12652:18:1;;;12645:50;12712:18;;3630:63:0;12392:344:1;3259:137:0;3317:9;3362:1;3352:5;3356:1;3362;3352:5;:::i;:::-;3348:9;;;3347:16;;3339:49;;;;-1:-1:-1;;;3339:49:0;;13302:2:1;3339:49:0;;;13284:21:1;13341:2;13321:18;;;13314:30;-1:-1:-1;;;13360:18:1;;;13353:50;13420:18;;3339:49:0;13100:344:1;4788:478:0;4915:16;4933;4963:14;4983:26;4994:6;5002;4983:10;:26::i;:::-;4962:47;;;5021:16;5039;5079:32;5087:7;5096:6;5104;5079:7;:32::i;:::-;-1:-1:-1;;;;;5059:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5020:116:0;;;-1:-1:-1;;;;;5020:116:0;;;5180:6;-1:-1:-1;;;;;5170:16:0;:6;-1:-1:-1;;;;;5170:16:0;;:88;;5239:8;5249;5170:88;;;5203:8;5213;5170:88;5147:111;;;;-1:-1:-1;4788:478:0;-1:-1:-1;;;;;;;4788:478:0:o;7404:541::-;7540:16;7589:1;7577:9;:13;7569:60;;;;-1:-1:-1;;;7569:60:0;;15603:2:1;7569:60:0;;;15585:21:1;15642:2;15622:18;;;15615:30;15681:34;15661:18;;;15654:62;-1:-1:-1;;;15732:18:1;;;15725:32;15774:19;;7569:60:0;15401:398:1;7569:60:0;7674:1;7662:9;:13;:31;;;;;7692:1;7679:10;:14;7662:31;7640:111;;;;-1:-1:-1;;;7640:111:0;;17951:2:1;7640:111:0;;;17933:21:1;17990:2;17970:18;;;17963:30;18029:32;18009:18;;;18002:60;18079:18;;7640:111:0;17749:354:1;7640:111:0;7762:17;7782:34;7811:4;7782:24;:9;7796;7782:13;:24::i;:::-;:28;;:34::i;:::-;7762:54;-1:-1:-1;7827:19:0;7849:34;7879:3;7849:25;:10;7864:9;7849:14;:25::i;:34::-;7827:56;-1:-1:-1;7905:32:0;7935:1;7906:23;7827:56;7906:9;:23;:::i;7905:32::-;7894:43;7404:541;-1:-1:-1;;;;;;7404:541:0:o;4449:331::-;4574:15;4620:1;4610:7;:11;4602:43;;;;-1:-1:-1;;;4602:43:0;;18659:2:1;4602:43:0;;;18641:21:1;18698:2;18678:18;;;18671:30;-1:-1:-1;;;18717:18:1;;;18710:49;18776:18;;4602:43:0;18457:343:1;4602:43:0;4675:1;4664:8;:12;:28;;;;;4691:1;4680:8;:12;4664:28;4656:63;;;;-1:-1:-1;;;4656:63:0;;19007:2:1;4656:63:0;;;18989:21:1;19046:2;19026:18;;;19019:30;-1:-1:-1;;;19065:18:1;;;19058:52;19127:18;;4656:63:0;18805:346:1;4656:63:0;4764:8;4740:21;:7;4752:8;4740:11;:21::i;:::-;:32;;;;:::i;3404:138::-;3462:9;3507:1;3497:5;3501:1;3507;3497:5;:::i;:::-;3493:9;;;3492:16;;3484:50;;;;-1:-1:-1;;;3484:50:0;;11895:2:1;3484:50:0;;;11877:21:1;11934:2;11914:18;;;11907:30;-1:-1:-1;;;11953:18:1;;;11946:51;12014:18;;3484:50:0;11693:345:1;14:134;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:367::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:55;;298:1;295;288:12;247:55;-1:-1:-1;321:20:1;;364:18;353:30;;350:50;;;396:1;393;386:12;350:50;433:4;425:6;421:17;409:29;;493:3;486:4;476:6;473:1;469:14;461:6;457:27;453:38;450:47;447:67;;;510:1;507;500:12;525:919;579:5;632:3;625:4;617:6;613:17;609:27;599:55;;650:1;647;640:12;599:55;686:6;673:20;712:4;735:18;772:2;768;765:10;762:36;;;778:18;;:::i;:::-;824:2;821:1;817:10;856:2;850:9;919:2;915:7;910:2;906;902:11;898:25;890:6;886:38;974:6;962:10;959:22;954:2;942:10;939:18;936:46;933:72;;;985:18;;:::i;:::-;1021:2;1014:22;1071:18;;;1105:15;;;;-1:-1:-1;1140:15:1;;;1174;;;1170:24;;1167:33;-1:-1:-1;1164:53:1;;;1213:1;1210;1203:12;1164:53;1235:1;1226:10;;1245:169;1259:2;1256:1;1253:9;1245:169;;;1316:23;1335:3;1316:23;:::i;:::-;1304:36;;1360:12;;;;1277:1;1270:9;;;;;1392:12;;1245:169;;;-1:-1:-1;1432:6:1;525:919;-1:-1:-1;;;;;;;525:919:1:o;1449:188::-;1528:13;;-1:-1:-1;;;;;1570:42:1;;1560:53;;1550:81;;1627:1;1624;1617:12;1642:247;1701:6;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;1809:9;1796:23;1828:31;1853:5;1828:31;:::i;:::-;1878:5;1642:247;-1:-1:-1;;;1642:247:1:o;1894:251::-;1964:6;2017:2;2005:9;1996:7;1992:23;1988:32;1985:52;;;2033:1;2030;2023:12;1985:52;2065:9;2059:16;2084:31;2109:5;2084:31;:::i;2150:805::-;2263:6;2271;2279;2287;2295;2303;2311;2364:3;2352:9;2343:7;2339:23;2335:33;2332:53;;;2381:1;2378;2371:12;2332:53;2420:9;2407:23;2439:31;2464:5;2439:31;:::i;:::-;2489:5;-1:-1:-1;2546:2:1;2531:18;;2518:32;2559:33;2518:32;2559:33;:::i;:::-;2611:7;-1:-1:-1;2665:2:1;2650:18;;2637:32;;-1:-1:-1;2716:2:1;2701:18;;2688:32;;-1:-1:-1;2767:3:1;2752:19;;2739:33;;-1:-1:-1;2824:3:1;2809:19;;2796:33;2838;2796;2838;:::i;:::-;2890:7;2880:17;;;2944:3;2933:9;2929:19;2916:33;2906:43;;2150:805;;;;;;;;;;:::o;2960:874::-;3082:6;3090;3098;3106;3114;3122;3130;3138;3191:3;3179:9;3170:7;3166:23;3162:33;3159:53;;;3208:1;3205;3198:12;3159:53;3247:9;3234:23;3266:31;3291:5;3266:31;:::i;:::-;3316:5;-1:-1:-1;3373:2:1;3358:18;;3345:32;3386:33;3345:32;3386:33;:::i;:::-;3438:7;-1:-1:-1;3492:2:1;3477:18;;3464:32;;-1:-1:-1;3543:2:1;3528:18;;3515:32;;-1:-1:-1;3594:3:1;3579:19;;3566:33;;-1:-1:-1;3646:3:1;3631:19;;3618:33;;-1:-1:-1;3703:3:1;3688:19;;3675:33;3717;3675;3717;:::i;:::-;3769:7;3759:17;;;3823:3;3812:9;3808:19;3795:33;3785:43;;2960:874;;;;;;;;;;;:::o;3839:663::-;3943:6;3951;3959;3967;3975;3983;4036:3;4024:9;4015:7;4011:23;4007:33;4004:53;;;4053:1;4050;4043:12;4004:53;4092:9;4079:23;4111:31;4136:5;4111:31;:::i;:::-;4161:5;-1:-1:-1;4213:2:1;4198:18;;4185:32;;-1:-1:-1;4264:2:1;4249:18;;4236:32;;-1:-1:-1;4315:2:1;4300:18;;4287:32;;-1:-1:-1;4371:3:1;4356:19;;4343:33;4385;4343;4385;:::i;:::-;4437:7;4427:17;;;4491:3;4480:9;4476:19;4463:33;4453:43;;3839:663;;;;;;;;:::o;4507:916::-;4647:6;4655;4663;4671;4679;4687;4695;4703;4756:3;4744:9;4735:7;4731:23;4727:33;4724:53;;;4773:1;4770;4763:12;4724:53;4813:9;4800:23;4846:18;4838:6;4835:30;4832:50;;;4878:1;4875;4868:12;4832:50;4917:70;4979:7;4970:6;4959:9;4955:22;4917:70;:::i;:::-;5006:8;;-1:-1:-1;4891:96:1;-1:-1:-1;;5088:2:1;5073:18;;5060:32;;-1:-1:-1;5139:2:1;5124:18;;5111:32;;-1:-1:-1;5190:2:1;5175:18;;5162:32;;-1:-1:-1;5241:3:1;5226:19;;5213:33;;-1:-1:-1;5296:3:1;5281:19;;5268:33;5310:31;5268:33;5310:31;:::i;:::-;5360:5;5350:15;;;5412:3;5401:9;5397:19;5384:33;5374:43;;4507:916;;;;;;;;;;;:::o;5428:758::-;5557:6;5565;5573;5581;5589;5597;5650:3;5638:9;5629:7;5625:23;5621:33;5618:53;;;5667:1;5664;5657:12;5618:53;5707:9;5694:23;5740:18;5732:6;5729:30;5726:50;;;5772:1;5769;5762:12;5726:50;5795:61;5848:7;5839:6;5828:9;5824:22;5795:61;:::i;:::-;5785:71;;;5903:2;5892:9;5888:18;5875:32;5865:42;;5954:2;5943:9;5939:18;5926:32;5916:42;;6005:2;5994:9;5990:18;5977:32;5967:42;;6059:3;6048:9;6044:19;6031:33;6073:31;6098:5;6073:31;:::i;6191:277::-;6258:6;6311:2;6299:9;6290:7;6286:23;6282:32;6279:52;;;6327:1;6324;6317:12;6279:52;6359:9;6353:16;6412:5;6405:13;6398:21;6391:5;6388:32;6378:60;;6434:1;6431;6424:12;6473:293;6552:6;6560;6613:2;6601:9;6592:7;6588:23;6584:32;6581:52;;;6629:1;6626;6619:12;6581:52;6652:40;6682:9;6652:40;:::i;:::-;6642:50;;6711:49;6756:2;6745:9;6741:18;6711:49;:::i;:::-;6701:59;;6473:293;;;;;:::o;6771:184::-;6841:6;6894:2;6882:9;6873:7;6869:23;6865:32;6862:52;;;6910:1;6907;6900:12;6862:52;-1:-1:-1;6933:16:1;;6771:184;-1:-1:-1;6771:184:1:o;6960:709::-;7073:6;7081;7089;7097;7105;7158:3;7146:9;7137:7;7133:23;7129:33;7126:53;;;7175:1;7172;7165:12;7126:53;7211:9;7198:23;7188:33;;7272:2;7261:9;7257:18;7244:32;7299:18;7291:6;7288:30;7285:50;;;7331:1;7328;7321:12;7285:50;7370:70;7432:7;7423:6;7412:9;7408:22;7370:70;:::i;:::-;7459:8;;-1:-1:-1;7344:96:1;-1:-1:-1;;7544:2:1;7529:18;;7516:32;7557:31;7516:32;7557:31;:::i;:::-;6960:709;;;;-1:-1:-1;6960:709:1;;7659:2;7644:18;7631:32;;6960:709;-1:-1:-1;;6960:709:1:o;7674:416::-;7767:6;7775;7828:2;7816:9;7807:7;7803:23;7799:32;7796:52;;;7844:1;7841;7834:12;7796:52;7880:9;7867:23;7857:33;;7941:2;7930:9;7926:18;7913:32;7968:18;7960:6;7957:30;7954:50;;;8000:1;7997;7990:12;7954:50;8023:61;8076:7;8067:6;8056:9;8052:22;8023:61;:::i;:::-;8013:71;;;7674:416;;;;;:::o;8095:245::-;8174:6;8182;8235:2;8223:9;8214:7;8210:23;8206:32;8203:52;;;8251:1;8248;8241:12;8203:52;-1:-1:-1;;8274:16:1;;8330:2;8315:18;;;8309:25;8274:16;;8309:25;;-1:-1:-1;8095:245:1:o;8345:778::-;8467:6;8475;8483;8491;8499;8507;8560:3;8548:9;8539:7;8535:23;8531:33;8528:53;;;8577:1;8574;8567:12;8528:53;8613:9;8600:23;8590:33;;8670:2;8659:9;8655:18;8642:32;8632:42;;8725:2;8714:9;8710:18;8697:32;8752:18;8744:6;8741:30;8738:50;;;8784:1;8781;8774:12;8738:50;8823:70;8885:7;8876:6;8865:9;8861:22;8823:70;:::i;:::-;8912:8;;-1:-1:-1;8797:96:1;-1:-1:-1;;8997:2:1;8982:18;;8969:32;9010:31;8969:32;9010:31;:::i;:::-;9060:5;9050:15;;;9112:3;9101:9;9097:19;9084:33;9074:43;;8345:778;;;;;;;;:::o;9128:316::-;9205:6;9213;9221;9274:2;9262:9;9253:7;9249:23;9245:32;9242:52;;;9290:1;9287;9280:12;9242:52;-1:-1:-1;;9313:23:1;;;9383:2;9368:18;;9355:32;;-1:-1:-1;9434:2:1;9419:18;;;9406:32;;9128:316;-1:-1:-1;9128:316:1:o;9449:426::-;9578:3;9616:6;9610:13;9641:1;9651:129;9665:6;9662:1;9659:13;9651:129;;;9763:4;9747:14;;;9743:25;;9737:32;9724:11;;;9717:53;9680:12;9651:129;;;9798:6;9795:1;9792:13;9789:48;;;9833:1;9824:6;9819:3;9815:16;9808:27;9789:48;-1:-1:-1;9853:16:1;;;;;9449:426;-1:-1:-1;;9449:426:1:o;11056:632::-;11227:2;11279:21;;;11349:13;;11252:18;;;11371:22;;;11198:4;;11227:2;11450:15;;;;11424:2;11409:18;;;11198:4;11493:169;11507:6;11504:1;11501:13;11493:169;;;11568:13;;11556:26;;11637:15;;;;11602:12;;;;11529:1;11522:9;11493:169;;;-1:-1:-1;11679:3:1;;11056:632;-1:-1:-1;;;;;;11056:632:1:o;12043:344::-;12245:2;12227:21;;;12284:2;12264:18;;;12257:30;-1:-1:-1;;;12318:2:1;12303:18;;12296:50;12378:2;12363:18;;12043:344::o;12741:354::-;12943:2;12925:21;;;12982:2;12962:18;;;12955:30;13021:32;13016:2;13001:18;;12994:60;13086:2;13071:18;;12741:354::o;15057:339::-;15259:2;15241:21;;;15298:2;15278:18;;;15271:30;-1:-1:-1;;;15332:2:1;15317:18;;15310:45;15387:2;15372:18;;15057:339::o;16932:398::-;17134:2;17116:21;;;17173:2;17153:18;;;17146:30;17212:34;17207:2;17192:18;;17185:62;-1:-1:-1;;;17278:2:1;17263:18;;17256:32;17320:3;17305:19;;16932:398::o;20667:128::-;20707:3;20738:1;20734:6;20731:1;20728:13;20725:39;;;20744:18;;:::i;:::-;-1:-1:-1;20780:9:1;;20667:128::o;20800:217::-;20840:1;20866;20856:132;;20910:10;20905:3;20901:20;20898:1;20891:31;20945:4;20942:1;20935:15;20973:4;20970:1;20963:15;20856:132;-1:-1:-1;21002:9:1;;20800:217::o;21022:168::-;21062:7;21128:1;21124;21120:6;21116:14;21113:1;21110:21;21105:1;21098:9;21091:17;21087:45;21084:71;;;21135:18;;:::i;:::-;-1:-1:-1;21175:9:1;;21022:168::o;21195:125::-;21235:4;21263:1;21260;21257:8;21254:34;;;21268:18;;:::i;:::-;-1:-1:-1;21305:9:1;;21195:125::o;21325:136::-;21364:3;21392:5;21382:39;;21401:18;;:::i;:::-;-1:-1:-1;;;21437:18:1;;21325:136::o;21466:135::-;21505:3;-1:-1:-1;;21526:17:1;;21523:43;;;21546:18;;:::i;:::-;-1:-1:-1;21593:1:1;21582:13;;21466:135::o;21606:127::-;21667:10;21662:3;21658:20;21655:1;21648:31;21698:4;21695:1;21688:15;21722:4;21719:1;21712:15;21738:127;21799:10;21794:3;21790:20;21787:1;21780:31;21830:4;21827:1;21820:15;21854:4;21851:1;21844:15;21870:127;21931:10;21926:3;21922:20;21919:1;21912:31;21962:4;21959:1;21952:15;21986:4;21983:1;21976:15;22002:131;-1:-1:-1;;;;;22077:31:1;;22067:42;;22057:70;;22123:1;22120;22113:12;22057:70;22002:131;:::o

Swarm Source

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