Contract 0x172eda9C686F507DAa1c20Df2868552d6382d69F

 

Contract Overview

Balance:
0 BNB

BNB Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd2066eca5155f32c1cf23f7b3f8c54c8ca094f1fdbe24be9b3b077b34650e471Remove Liquidity...118206762021-10-16 11:01:051 day 7 hrs ago0x3b9760566d344fbbdf1adfa811d6e9d74b5a6562 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00087985
0x8cd998c7309dcefa085f9bca2e4fba4110ecfe51c41429ec35feafbf899d6ee8Swap Exact Token...118026352021-10-15 19:54:441 day 22 hrs ago0x500899672e3cd240be796ecf73cb7aca54fa5afb IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060373
0x725300bdbcedbd5036df982e948935a056ae9a9046eae182be1239753ff2b2e1Remove Liquidity...118024692021-10-15 19:46:261 day 22 hrs ago0x500899672e3cd240be796ecf73cb7aca54fa5afb IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00083295
0xb6f742bb1afe02d662937360727ca63fa7227469003c85cb680f867eba3d9e3fAdd Liquidity118024142021-10-15 19:43:411 day 22 hrs ago0x500899672e3cd240be796ecf73cb7aca54fa5afb IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00093118
0xd2edb965b485b28cfb264ac7d9d13c8b2c646918194bddbdeef2bb1b96a1c5b3Swap Exact Token...117947042021-10-15 13:17:062 days 4 hrs ago0x8cffa8ddab28cca20e9adf8c61b40397717eb951 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.0006923
0xb01eea633b471b9b0508953be1c40a3d0ff42bbb1fa9f14d87e8cfb621e9792dRemove Liquidity...117420362021-10-13 17:14:074 days 1 hr ago0x6d851f023ee70d138249a746eb35e43229a1dac8 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00087599
0xe0e44878fb7ef05a7d193bc7b3bc8403db307e9b066b98d0fbc421f3cabad465Remove Liquidity...117420272021-10-13 17:13:404 days 1 hr ago0x6d851f023ee70d138249a746eb35e43229a1dac8 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00099839
0x1009d5524a9bc5a8451a8f0b397f3c362057f77c75dac2b9930f959bd1bce60aSwap Exact Token...117377652021-10-13 13:34:514 days 4 hrs ago0x8cffa8ddab28cca20e9adf8c61b40397717eb951 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060214
0x1aef886c5802626d14d0f1aefb3abee01a76780b6e74de35112fef20aec89116Swap Exact Token...117377462021-10-13 13:33:544 days 4 hrs ago0x8cffa8ddab28cca20e9adf8c61b40397717eb951 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060208
0x69f38b390d0fd952688564cdc64fcfe479a1bd99fb2bd2bb1bde63ca4742eab6Swap Exact Token...117377292021-10-13 13:33:034 days 4 hrs ago0x8cffa8ddab28cca20e9adf8c61b40397717eb951 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060214
0x700626aab094b5cdfed9d60ef85f1d3f5fcdc533e2198cbaab19af00cf27cf38Remove Liquidity...117259612021-10-13 3:25:204 days 14 hrs ago0x772ea409a11a5453d815a5f543db4867f6ddc11b IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00110208
0x6328d40fbb9518f6657ffc2f68b4326367557202f562260f2276e009bf559865Swap Exact Token...116972992021-10-12 3:25:045 days 14 hrs ago0x6844cf42c9953a06bb93ea2d5ca725e8c7cd8561 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060214
0x7259a9eb3b8a9e2c3b428566a40ec00b6ed4c9c82fc8decae0c91e80a3a7cf10Swap Exact Token...116880882021-10-11 19:42:575 days 22 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060237
0xf316c2a43d0f03a5297bf1281cbc2e76a91a5955841ed33743f64473f2fc8b6cSwap Exact Token...116880692021-10-11 19:42:005 days 22 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00067737
0x3adc79011c68556ebfa1f552f3991e3cb7c8475601f74303570337af1cc07145Swap Exact Token...116877592021-10-11 19:26:305 days 22 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060237
0xd52711d321a7e7eb8b885e1cfe6987d7a22326bf598e3bc2c50a5e0bb5cb73f3Swap Exact Token...116877492021-10-11 19:26:005 days 22 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00067737
0xb387f4d12345a539dffb89d621322e9e1313cf857ec033912ccf9659bfc7d0a7Swap Exact Token...116842062021-10-11 15:50:326 days 2 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060231
0x44c74c998568f79eda9c2c77e17325f6289dfb5005429b0acbf31ba9e202059aSwap Exact Token...116841942021-10-11 15:49:506 days 2 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060237
0x4829971acfb8e9c570c765e4872d2cb272cceaae7e3096e3366e073f177c1bfaSwap Exact Token...116841852021-10-11 15:49:186 days 2 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060237
0x41bb5309bda9dad5a4b30fbd3eb30c488c943ec6052a7415b4da8291e92883ceSwap Exact Token...116841772021-10-11 15:48:536 days 2 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060237
0xdfcf0aac8d357750591a6ee006cd7e99d8adcdd60bd1a77f7d0c57392320ecc7Swap Exact Token...116841692021-10-11 15:48:236 days 2 hrs ago0x1f5697aa6bb2f97ad7e88b8aa927e1377f0c2f8d IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00067737
0x7d0ffb73686a7dfeb8e58af5e524c8cbd6fe7c44e9af6bedf529079b0a367cc8Swap Exact Token...116616562021-10-10 20:59:536 days 21 hrs ago0x500899672e3cd240be796ecf73cb7aca54fa5afb IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00060379
0xe216eb42546c7c80e9d9348569d9534ed5a68f04b57695043a41e2f8e85cc3b4Swap Exact Token...116494942021-10-10 10:46:017 days 7 hrs ago0x8cffa8ddab28cca20e9adf8c61b40397717eb951 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.0006923
0x3ee3396f5f8710646feed7db97a66b826a85ee120949a3e864abe815632d644bSwap Exact Token...116472792021-10-10 8:55:127 days 9 hrs ago0x88c1f1b867608b586c5f280df3c7d2ec32375835 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00067714
0x133987273d96d7c6bb4dfc7836c2ebe2a450a1ef139904ac9f93d2768e9348d4Swap Exact Token...116472612021-10-10 8:54:187 days 9 hrs ago0x88c1f1b867608b586c5f280df3c7d2ec32375835 IN  0x172eda9c686f507daa1c20df2868552d6382d69f0 BNB0.00068055
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x725300bdbcedbd5036df982e948935a056ae9a9046eae182be1239753ff2b2e1118024692021-10-15 19:46:261 day 22 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x500899672e3cd240be796ecf73cb7aca54fa5afb0.025977448289535662 BNB
0x725300bdbcedbd5036df982e948935a056ae9a9046eae182be1239753ff2b2e1118024692021-10-15 19:46:261 day 22 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.025977448289535662 BNB
0xd2edb965b485b28cfb264ac7d9d13c8b2c646918194bddbdeef2bb1b96a1c5b3117947042021-10-15 13:17:062 days 4 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x8cffa8ddab28cca20e9adf8c61b40397717eb9510.001257647815136415 BNB
0xd2edb965b485b28cfb264ac7d9d13c8b2c646918194bddbdeef2bb1b96a1c5b3117947042021-10-15 13:17:062 days 4 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.001257647815136415 BNB
0xe0e44878fb7ef05a7d193bc7b3bc8403db307e9b066b98d0fbc421f3cabad465117420272021-10-13 17:13:404 days 1 hr ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x6d851f023ee70d138249a746eb35e43229a1dac81.635253141691945592 BNB
0xe0e44878fb7ef05a7d193bc7b3bc8403db307e9b066b98d0fbc421f3cabad465117420272021-10-13 17:13:404 days 1 hr ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f1.635253141691945592 BNB
0xe216eb42546c7c80e9d9348569d9534ed5a68f04b57695043a41e2f8e85cc3b4116494942021-10-10 10:46:017 days 7 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x8cffa8ddab28cca20e9adf8c61b40397717eb9510.017059756870676951 BNB
0xe216eb42546c7c80e9d9348569d9534ed5a68f04b57695043a41e2f8e85cc3b4116494942021-10-10 10:46:017 days 7 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.017059756870676951 BNB
0xec3de53b6b8f92ee3919f8718a95049d748f19296cd546af73f776144a89668d116472522021-10-10 8:53:517 days 9 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x88c1f1b867608b586c5f280df3c7d2ec323758350.100183932260112086 BNB
0xec3de53b6b8f92ee3919f8718a95049d748f19296cd546af73f776144a89668d116472522021-10-10 8:53:517 days 9 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.100183932260112086 BNB
0x46160e2fc83dbf6e00a446a63ce302b567f0b42e38166f9a4b05fe145cdda22c113775352021-09-30 23:11:1516 days 19 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x6ad532bc06eac836e4d576faaad206cefecf39270.010433737065576694 BNB
0x46160e2fc83dbf6e00a446a63ce302b567f0b42e38166f9a4b05fe145cdda22c113775352021-09-30 23:11:1516 days 19 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.010433737065576694 BNB
0x3e56082b612f4b5795fc9f1d24b7cd78b942e8de91fe4c583dba4adc2a32ad8d108549992021-09-12 17:10:4535 days 1 hr ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x7b884f449bf8f96f3a166509e231055430e131d70.062854159545743948 BNB
0x3e56082b612f4b5795fc9f1d24b7cd78b942e8de91fe4c583dba4adc2a32ad8d108549992021-09-12 17:10:4535 days 1 hr ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.062854159545743948 BNB
0x89fdf0d96674476eceb8f492b342e424d5d14e284c5a54ca08d19d02cbb8b231107738102021-09-09 20:55:2237 days 21 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x79e3e10072d82ad450306ef79d7833e4755fa5030.00992590777968618 BNB
0x89fdf0d96674476eceb8f492b342e424d5d14e284c5a54ca08d19d02cbb8b231107738102021-09-09 20:55:2237 days 21 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.00992590777968618 BNB
0xe1b801d94969dc5f70e50a862ba85e32f806f20f431abe239c8162f5fd217d10107730192021-09-09 20:15:2437 days 21 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f Binance: WBNB Token0.01 BNB
0xed1ca21fb38771ae5678f0e257af580f65beb94f198ebc5e806bc2e22a543ee4105548442021-09-02 4:38:3945 days 13 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69fKiyomi Finance: Deployer0.000014362363452037 BNB
0xed1ca21fb38771ae5678f0e257af580f65beb94f198ebc5e806bc2e22a543ee4105548442021-09-02 4:38:3945 days 13 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f Binance: WBNB Token0.001366995356723785 BNB
0x0312c9c26933a76c953935c900c18a1fc3339bad3b8802c100f8b793693b45dc102677942021-08-23 2:31:0055 days 15 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f Binance: WBNB Token0.000247899469924011 BNB
0x2700beb82ce35eab17b7ebf104889ca805eb0013fe27e3a08aa8c840d0d7cdeb102671892021-08-23 2:00:4555 days 16 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x6d851f023ee70d138249a746eb35e43229a1dac80.000252632737361311 BNB
0x2700beb82ce35eab17b7ebf104889ca805eb0013fe27e3a08aa8c840d0d7cdeb102671892021-08-23 2:00:4555 days 16 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.000252632737361311 BNB
0x430f658eb3565ee45377e2ca5f15d9bc699b132892ec237579e7c312acdbcfd2102671272021-08-23 1:57:3955 days 16 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f Binance: WBNB Token0.000252632737361312 BNB
0xf79730dc824480e1eae15fa4f7272f0e784dadee67e4fc7fcfa408b02cddbef1101534652021-08-19 2:33:3259 days 15 hrs ago 0x172eda9c686f507daa1c20df2868552d6382d69f0x6844cf42c9953a06bb93ea2d5ca725e8c7cd85610.041899162800395813 BNB
0xf79730dc824480e1eae15fa4f7272f0e784dadee67e4fc7fcfa408b02cddbef1101534652021-08-19 2:33:3259 days 15 hrs ago Binance: WBNB Token 0x172eda9c686f507daa1c20df2868552d6382d69f0.041899162800395813 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KiyomiRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-06-14
*/

/**
 *Submitted for verification at BscScan.com on 2021-04-23
*/

// File: @uniswap\lib\contracts\libraries\TransferHelper.sol

pragma solidity >=0.6.0;

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

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

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

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

// File: contracts\interfaces\IKiyomiRouter01.sol

pragma solidity >=0.6.2;

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

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

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

// File: contracts\interfaces\IKiyomiRouter02.sol

pragma solidity >=0.6.2;

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

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

// File: contracts\interfaces\IKiyomiFactory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

    function INIT_CODE_PAIR_HASH() external view returns (bytes32);
}

// File: contracts\libraries\SafeMath.sol

pragma solidity =0.6.6;

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

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

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

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

// File: contracts\interfaces\IKiyomiPair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: contracts\libraries\KiyomiLibrary.sol

pragma solidity >=0.5.0;



library KiyomiLibrary {
    using SafeMath for uint;

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

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

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

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

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

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

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

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

// File: contracts\interfaces\IERC20.sol

pragma solidity >=0.5.0;

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

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

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

// File: contracts\interfaces\IWETH.sol

pragma solidity >=0.5.0;

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

// File: contracts\KiyomiRouter.sol

pragma solidity =0.6.6;







contract KiyomiRouter is IKiyomiRouter02 {
    using SafeMath for uint;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

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

60c060405234801561001057600080fd5b506040516200494e3803806200494e8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6147c9620001856000398061019f5280610d445280610d7f5280610e8052806110b0528061144e52806115c652806119a15280611aad5280611b635280611c3b5280611d935280611e1b528061206a52806120ef528061219e5280612274528061231b528061238f52806128b05280612b375280612b8d5280612bc15280612c355280612ddf5280612f345280612fbc525080610f205280610ff7528061117652806111af52806112f452806114ee52806115a4528061171e5280611ce05280611e4d5280611fba52806123c152806126245280612835528061285e528061288e5280612a055280612b6b5280612e845280612fee52806138f052806139335280613c165280613d9c528061420652806142cd528061434d52506147c96000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610ba1578063f305d71914610c21578063fb3bdb4114610c67576101c8565b8063c45a015514610a62578063d06ca61f14610a77578063ded9382a14610b2e576101c8565b8063af2979eb116100b0578063af2979eb1461092c578063b6f9de951461097f578063baa2abde14610a05576101c8565b80638803dbee1461082d578063ad5c4648146108c5578063ad615dec146108f6576101c8565b80634a25d94a11610138578063791ac94711610112578063791ac947146106d95780637ff36ab51461077157806385f8c259146107f7576101c8565b80634a25d94a146105365780635b0d5984146105ce5780635c11d79514610641576101c8565b80631f00ca74116101695780631f00ca74146103695780632195995c1461042057806338ed17391461049e576101c8565b806302751cec146101cd578063054d50d41461023957806318cbafe514610281576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c657fe5b005b600080fd5b3480156101d957600080fd5b50610220600480360360c08110156101f057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ced565b6040805192835260208301919091528051918290030190f35b34801561024557600080fd5b5061026f6004803603606081101561025c57600080fd5b5080359060208101359060400135610e11565b60408051918252519081900360200190f35b34801561028d57600080fd5b50610319600480360360a08110156102a457600080fd5b8135916020810135918101906060810160408201356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460208302840111640100000000831117156102ff57600080fd5b91935091506001600160a01b038135169060200135610e26565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561035557818101518382015260200161033d565b505050509050019250505060405180910390f35b34801561037557600080fd5b506103196004803603604081101561038c57600080fd5b813591908101906040810160208201356401000000008111156103ae57600080fd5b8201836020820111156103c057600080fd5b803590602001918460208302840111640100000000831117156103e257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061116f945050505050565b34801561042c57600080fd5b50610220600480360361016081101561044457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111a5565b3480156104aa57600080fd5b50610319600480360360a08110156104c157600080fd5b8135916020810135918101906060810160408201356401000000008111156104e857600080fd5b8201836020820111156104fa57600080fd5b8035906020019184602083028401116401000000008311171561051c57600080fd5b91935091506001600160a01b03813516906020013561129f565b34801561054257600080fd5b50610319600480360360a081101561055957600080fd5b81359160208101359181019060608101604082013564010000000081111561058057600080fd5b82018360208201111561059257600080fd5b803590602001918460208302840111640100000000831117156105b457600080fd5b91935091506001600160a01b0381351690602001356113f4565b3480156105da57600080fd5b5061026f60048036036101408110156105f257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561159c565b34801561064d57600080fd5b506101c6600480360360a081101561066457600080fd5b81359160208101359181019060608101604082013564010000000081111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111640100000000831117156106bf57600080fd5b91935091506001600160a01b0381351690602001356116aa565b3480156106e557600080fd5b506101c6600480360360a08110156106fc57600080fd5b81359160208101359181019060608101604082013564010000000081111561072357600080fd5b82018360208201111561073557600080fd5b8035906020019184602083028401116401000000008311171561075757600080fd5b91935091506001600160a01b038135169060200135611949565b6103196004803603608081101561078757600080fd5b813591908101906040810160208201356401000000008111156107a957600080fd5b8201836020820111156107bb57600080fd5b803590602001918460208302840111640100000000831117156107dd57600080fd5b91935091506001600160a01b038135169060200135611be9565b34801561080357600080fd5b5061026f6004803603606081101561081a57600080fd5b5080359060208101359060400135611f58565b34801561083957600080fd5b50610319600480360360a081101561085057600080fd5b81359160208101359181019060608101604082013564010000000081111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111640100000000831117156108ab57600080fd5b91935091506001600160a01b038135169060200135611f65565b3480156108d157600080fd5b506108da612068565b604080516001600160a01b039092168252519081900360200190f35b34801561090257600080fd5b5061026f6004803603606081101561091957600080fd5b508035906020810135906040013561208c565b34801561093857600080fd5b5061026f600480360360c081101561094f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612099565b6101c66004803603608081101561099557600080fd5b813591908101906040810160208201356401000000008111156109b757600080fd5b8201836020820111156109c957600080fd5b803590602001918460208302840111640100000000831117156109eb57600080fd5b91935091506001600160a01b038135169060200135612224565b348015610a1157600080fd5b50610220600480360360e0811015610a2857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356125cc565b348015610a6e57600080fd5b506108da612833565b348015610a8357600080fd5b5061031960048036036040811015610a9a57600080fd5b81359190810190604081016020820135640100000000811115610abc57600080fd5b820183602082011115610ace57600080fd5b80359060200191846020830284011164010000000083111715610af057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612857945050505050565b348015610b3a57600080fd5b506102206004803603610140811015610b5257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612884565b348015610bad57600080fd5b50610c036004803603610100811015610bc557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612998565b60408051938452602084019290925282820152519081900360600190f35b610c03600480360360c0811015610c3757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612ade565b61031960048036036080811015610c7d57600080fd5b81359190810190604081016020820135640100000000811115610c9f57600080fd5b820183602082011115610cb157600080fd5b80359060200191846020830284011164010000000083111715610cd357600080fd5b91935091506001600160a01b038135169060200135612d8d565b6000808242811015610d3e576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b610d6d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6125cc565b9093509150610d7d89868561312b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610de357600080fd5b505af1158015610df7573d6000803e3d6000fd5b50505050610e0585836132c3565b50965096945050505050565b6000610e1e8484846133bb565b949350505050565b60608142811015610e76576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610eb057fe5b905060200201356001600160a01b03166001600160a01b031614610f1b576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b610f797f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134ab92505050565b91508682600184510381518110610f8c57fe5b60200260200101511015610fd15760405162461bcd60e51b81526004018080602001828103825260288152602001806146236028913960400191505060405180910390fd5b61106f86866000818110610fe157fe5b905060200201356001600160a01b0316336110557f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061102357fe5b905060200201356001600160a01b03168b8b600181811061104057fe5b905060200201356001600160a01b03166135f7565b8560008151811061106257fe5b60200260200101516136cf565b6110ae82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613841915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110ed57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561112b57600080fd5b505af115801561113f573d6000803e3d6000fd5b50505050611164848360018551038151811061115757fe5b60200260200101516132c3565b509695505050505050565b606061119c7f00000000000000000000000000000000000000000000000000000000000000008484613a87565b90505b92915050565b60008060006111d57f00000000000000000000000000000000000000000000000000000000000000008f8f6135f7565b90506000876111e4578c6111e8565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561125e57600080fd5b505af1158015611272573d6000803e3d6000fd5b505050506112858f8f8f8f8f8f8f6125cc565b809450819550505050509b509b9950505050505050505050565b606081428110156112ef576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b61134d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134ab92505050565b9150868260018451038151811061136057fe5b602002602001015110156113a55760405162461bcd60e51b81526004018080602001828103825260288152602001806146236028913960400191505060405180910390fd5b6113b586866000818110610fe157fe5b61116482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613841915050565b60608142811015611444576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061147e57fe5b905060200201356001600160a01b03166001600160a01b0316146114e9576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6115477f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a8792505050565b9150868260008151811061155757fe5b60200260200101511115610fd15760405162461bcd60e51b81526004018080602001828103825260248152602001806146706024913960400191505060405180910390fd5b6000806115ea7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006135f7565b90506000866115f9578b6115fd565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561167357600080fd5b505af1158015611687573d6000803e3d6000fd5b505050506116998d8d8d8d8d8d612099565b9d9c50505050505050505050505050565b80428110156116f8576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b61176d8585600081811061170857fe5b905060200201356001600160a01b0316336117677f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b905060200201356001600160a01b03168a8a600181811061104057fe5b8a6136cf565b60008585600019810181811061177f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d602081101561180e57600080fd5b50516040805160208881028281018201909352888252929350611850929091899189918291850190849080828437600092019190915250889250613bbf915050565b86611902828888600019810181811061186557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d60208110156118f457600080fd5b50519063ffffffff613eea16565b101561193f5760405162461bcd60e51b81526004018080602001828103825260288152602001806146236028913960400191505060405180910390fd5b5050505050505050565b8042811015611997576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106119d157fe5b905060200201356001600160a01b03166001600160a01b031614611a3c576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b611a4c8585600081811061170857fe5b611a8a858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613bbf915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611af457600080fd5b505afa158015611b08573d6000803e3d6000fd5b505050506040513d6020811015611b1e57600080fd5b5051905086811015611b615760405162461bcd60e51b81526004018080602001828103825260288152602001806146236028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b5050505061193f84826132c3565b60608142811015611c39576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c7057fe5b905060200201356001600160a01b03166001600160a01b031614611cdb576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b611d397f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134ab92505050565b91508682600184510381518110611d4c57fe5b60200260200101511015611d915760405162461bcd60e51b81526004018080602001828103825260288152602001806146236028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611dcd57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e0057600080fd5b505af1158015611e14573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e797f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b84600081518110611e8657fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611edd57600080fd5b505af1158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051611f0f57fe5b611f4e82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613841915050565b5095945050505050565b6000610e1e848484613f42565b60608142811015611fb5576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b6120137f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a8792505050565b9150868260008151811061202357fe5b602002602001015111156113a55760405162461bcd60e51b81526004018080602001828103825260248152602001806146706024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e1e848484614032565b600081428110156120e9576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b612118887f000000000000000000000000000000000000000000000000000000000000000089898930896125cc565b604080516370a0823160e01b8152306004820152905191945061219c92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561216b57600080fd5b505afa15801561217f573d6000803e3d6000fd5b505050506040513d602081101561219557600080fd5b505161312b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561220257600080fd5b505af1158015612216573d6000803e3d6000fd5b5050505061116484836132c3565b8042811015612272576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106122a957fe5b905060200201356001600160a01b03166001600160a01b031614612314576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123ed7f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561243d57600080fd5b505af1158015612451573d6000803e3d6000fd5b505050506040513d602081101561246757600080fd5b505161246f57fe5b60008686600019810181811061248157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124e657600080fd5b505afa1580156124fa573d6000803e3d6000fd5b505050506040513d602081101561251057600080fd5b505160408051602089810282810182019093528982529293506125529290918a918a918291850190849080828437600092019190915250899250613bbf915050565b87611902828989600019810181811061256757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b600080824281101561261d576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b600061264a7f00000000000000000000000000000000000000000000000000000000000000008c8c6135f7565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156126a557600080fd5b505af11580156126b9573d6000803e3d6000fd5b505050506040513d60208110156126cf57600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561273557600080fd5b505af1158015612749573d6000803e3d6000fd5b505050506040513d604081101561275f57600080fd5b508051602090910151909250905060006127798e8e6140de565b509050806001600160a01b03168e6001600160a01b03161461279c57818361279f565b82825b90975095508a8710156127e35760405162461bcd60e51b81526004018080602001828103825260238152602001806146df6023913960400191505060405180910390fd5b898610156128225760405162461bcd60e51b81526004018080602001828103825260238152602001806146bc6023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061119c7f000000000000000000000000000000000000000000000000000000000000000084846134ab565b60008060006128d47f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006135f7565b90506000876128e3578c6128e7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506129838e8e8e8e8e8e610ced565b909f909e509c50505050505050505050505050565b600080600083428110156129eb576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b6129f98c8c8c8c8c8c6141bc565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008e8e6135f7565b9050612a398d3383886136cf565b612a458c3383876136cf565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612a9d57600080fd5b505af1158015612ab1573d6000803e3d6000fd5b505050506040513d6020811015612ac757600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612b31576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b612b5f8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6141bc565b90945092506000612bb17f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006135f7565b9050612bbf8b3383886136cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c1a57600080fd5b505af1158015612c2e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612cb357600080fd5b505af1158015612cc7573d6000803e3d6000fd5b505050506040513d6020811015612cdd57600080fd5b5051612ce557fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b505050506040513d6020811015612d6757600080fd5b5051925034841015612d7f57612d7f338534036132c3565b505096509650969350505050565b60608142811015612ddd576040805162461bcd60e51b815260206004820152601560248201527412da5e5bdb5a549bdd5d195c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612e1457fe5b905060200201356001600160a01b03166001600160a01b031614612e7f576040805162461bcd60e51b815260206004820152601a60248201527f4b69796f6d69526f757465723a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b612edd7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a8792505050565b91503482600081518110612eed57fe5b60200260200101511115612f325760405162461bcd60e51b81526004018080602001828103825260248152602001806146706024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612f6e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612fa157600080fd5b505af1158015612fb5573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61301a7f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b8460008151811061302757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561307e57600080fd5b505af1158015613092573d6000803e3d6000fd5b505050506040513d60208110156130a857600080fd5b50516130b057fe5b6130ef82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613841915050565b816000815181106130fc57fe5b6020026020010151341115611f4e57611f4e338360008151811061311c57fe5b602002602001015134036132c3565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b602083106131d65780518252601f1990920191602091820191016131b7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613238576040519150601f19603f3d011682016040523d82523d6000602084013e61323d565b606091505b509150915081801561326b57508051158061326b575080806020019051602081101561326857600080fd5b50515b6132bc576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061330f5780518252601f1990920191602091820191016132f0565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613371576040519150601f19603f3d011682016040523d82523d6000602084013e613376565b606091505b50509050806133b65760405162461bcd60e51b815260040180806020018281038252602381526020018061472b6023913960400191505060405180910390fd5b505050565b60008084116133fb5760405162461bcd60e51b81526004018080602001828103825260288152602001806146946028913960400191505060405180910390fd5b60008311801561340b5750600082115b6134465760405162461bcd60e51b815260040180806020018281038252602581526020018061464b6025913960400191505060405180910390fd5b600061345a856126f763ffffffff61446216565b9050600061346e828563ffffffff61446216565b90506000613494836134888861271063ffffffff61446216565b9063ffffffff6144ce16565b905080828161349f57fe5b04979650505050505050565b6060600282511015613504576040805162461bcd60e51b815260206004820152601b60248201527f4b69796f6d694c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561351c57600080fd5b50604051908082528060200260200182016040528015613546578160200160208202803683370190505b509050828160008151811061355757fe5b60200260200101818152505060005b60018351038110156135ef576000806135a98786858151811061358557fe5b602002602001015187866001018151811061359c57fe5b6020026020010151614526565b915091506135cb8484815181106135bc57fe5b602002602001015183836133bb565b8484600101815181106135da57fe5b60209081029190910101525050600101613566565b509392505050565b600080600061360685856140de565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fd51800534fb90a0046affb1bd473f66c25eafcc6365c834d47b890ad8431fd0a609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137695780518252601f19909201916020918201910161374a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b50915091508180156137fe5750805115806137fe57508080602001905160208110156137fb57600080fd5b50515b6138395760405162461bcd60e51b815260040180806020018281038252602481526020018061474e6024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613a815760008084838151811061385f57fe5b602002602001015185846001018151811061387657fe5b602002602001015191509150600061388e83836140de565b50905060008785600101815181106138a257fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138d0578260006138d4565b6000835b91509150600060028a510388106138eb578861392c565b61392c7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061391f57fe5b60200260200101516135f7565b90506139597f000000000000000000000000000000000000000000000000000000000000000088886135f7565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613996576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613a075781810151838201526020016139ef565b50505050905090810190601f168015613a345780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613a5657600080fd5b505af1158015613a6a573d6000803e3d6000fd5b505060019099019850613844975050505050505050565b50505050565b6060600282511015613ae0576040805162461bcd60e51b815260206004820152601b60248201527f4b69796f6d694c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613af857600080fd5b50604051908082528060200260200182016040528015613b22578160200160208202803683370190505b5090508281600183510381518110613b3657fe5b60209081029190910101528151600019015b80156135ef57600080613b7887866001860381518110613b6457fe5b602002602001015187868151811061359c57fe5b91509150613b9a848481518110613b8b57fe5b60200260200101518383613f42565b846001850381518110613ba957fe5b6020908102919091010152505060001901613b48565b60005b60018351038110156133b657600080848381518110613bdd57fe5b6020026020010151858460010181518110613bf457fe5b6020026020010151915091506000613c0c83836140de565b5090506000613c3c7f000000000000000000000000000000000000000000000000000000000000000085856135f7565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613c7d57600080fd5b505afa158015613c91573d6000803e3d6000fd5b505050506040513d6060811015613ca757600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613ce4578284613ce7565b83835b91509150613d45828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b9550613d528683836133bb565b945050505050600080856001600160a01b0316886001600160a01b031614613d7c57826000613d80565b6000835b91509150600060028c51038a10613d97578a613dcb565b613dcb7f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061391f57fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613e6e578181015183820152602001613e56565b50505050905090810190601f168015613e9b5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613ebd57600080fd5b505af1158015613ed1573d6000803e3d6000fd5b50506001909b019a50613bc29950505050505050505050565b8082038281111561119f576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613f825760405162461bcd60e51b81526004018080602001828103825260298152602001806147026029913960400191505060405180910390fd5b600083118015613f925750600082115b613fcd5760405162461bcd60e51b815260040180806020018281038252602581526020018061464b6025913960400191505060405180910390fd5b6000613ff1612710613fe5868863ffffffff61446216565b9063ffffffff61446216565b9050600061400b6126f7613fe5868963ffffffff613eea16565b9050614028600182848161401b57fe5b049063ffffffff6144ce16565b9695505050505050565b60008084116140725760405162461bcd60e51b81526004018080602001828103825260228152602001806146016022913960400191505060405180910390fd5b6000831180156140825750600082115b6140bd5760405162461bcd60e51b815260040180806020018281038252602581526020018061464b6025913960400191505060405180910390fd5b826140ce858463ffffffff61446216565b816140d557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156141325760405162461bcd60e51b81526004018080602001828103825260228152602001806147726022913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614152578284614155565b83835b90925090506001600160a01b0382166141b5576040805162461bcd60e51b815260206004820152601b60248201527f4b69796f6d694c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561424f57600080fd5b505afa158015614263573d6000803e3d6000fd5b505050506040513d602081101561427957600080fd5b50516001600160a01b0316141561434557604080517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561431857600080fd5b505af115801561432c573d6000803e3d6000fd5b505050506040513d602081101561434257600080fd5b50505b6000806143737f00000000000000000000000000000000000000000000000000000000000000008b8b614526565b91509150816000148015614385575080155b1561439557879350869250614455565b60006143a2898484614032565b90508781116143f557858110156143ea5760405162461bcd60e51b81526004018080602001828103825260238152602001806146bc6023913960400191505060405180910390fd5b889450925082614453565b6000614402898486614032565b90508981111561440e57fe5b8781101561444d5760405162461bcd60e51b81526004018080602001828103825260238152602001806146df6023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061447d5750508082028282828161447a57fe5b04145b61119f576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561119f576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061453585856140de565b5090506145438686866135f7565b506000806145528888886135f7565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561458a57600080fd5b505afa15801561459e573d6000803e3d6000fd5b505050506040513d60608110156145b457600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b03878116908416146145ee5780826145f1565b81815b9099909850965050505050505056fe4b69796f6d694c6962726172793a20494e53554646494349454e545f414d4f554e544b69796f6d69526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544b69796f6d694c6962726172793a20494e53554646494349454e545f4c49515549444954594b69796f6d69526f757465723a204558434553534956455f494e5055545f414d4f554e544b69796f6d694c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544b69796f6d69526f757465723a20494e53554646494349454e545f425f414d4f554e544b69796f6d69526f757465723a20494e53554646494349454e545f415f414d4f554e544b69796f6d694c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444b69796f6d694c6962726172793a204944454e544943414c5f414444524553534553a2646970667358221220881ac74043b77ccde988cfbf81181c713f13ae665d5fa8665767c7dba741329164736f6c634300060600330000000000000000000000006ede69a323cd8da745d4288466178dc2a825bec0000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

0000000000000000000000006ede69a323cd8da745d4288466178dc2a825bec0000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x6ede69a323cd8da745d4288466178dc2a825bec0
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000006ede69a323cd8da745d4288466178dc2a825bec0
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Deployed ByteCode Sourcemap

16332:18334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16803:10;-1:-1:-1;;;;;16817:4:0;16803:18;;16796:26;;;;16332:18334;;12:1:-1;9;2:12;20902:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20902:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20902:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33622:259;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33622:259:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33622:259:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27999:838;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27999:838:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27999:838:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27999:838:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27999:838:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27999:838:0;;-1:-1:-1;27999:838:0;-1:-1:-1;;;;;;27999:838:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27999:838:0;;;;;;;;;;;;;;;;;34413:250;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34413:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34413:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34413:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34413:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34413:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34413:250:0;;-1:-1:-1;34413:250:0;;-1:-1:-1;;;;;34413:250:0:i;21581:671::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21581:671:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21581:671:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25258:619::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25258:619:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25258:619:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25258:619:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25258:619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25258:619:0;;-1:-1:-1;25258:619:0;-1:-1:-1;;;;;;25258:619:0;;;;;;;;:::i;27177:816::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27177:816:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27177:816:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;27177:816:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27177:816:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27177:816:0;;-1:-1:-1;27177:816:0;-1:-1:-1;;;;;;27177:816:0;;;;;;;;:::i;23706:712::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23706:712:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23706:712:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30990:708::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30990:708:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30990:708:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;30990:708:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30990:708:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30990:708:0;;-1:-1:-1;30990:708:0;-1:-1:-1;;;;;;30990:708:0;;;;;;;;:::i;32551:834::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32551:834:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32551:834:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;32551:834:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32551:834:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32551:834:0;;-1:-1:-1;32551:834:0;-1:-1:-1;;;;;;32551:834:0;;;;;;;;:::i;26486:685::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26486:685:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;26486:685:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26486:685:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26486:685:0;;-1:-1:-1;26486:685:0;-1:-1:-1;;;;;;26486:685:0;;;;;;;;:::i;33889:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33889:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33889:258:0;;;;;;;;;;;;:::i;25883:597::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25883:597:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25883:597:0;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;25883:597:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25883:597:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25883:597:0;;-1:-1:-1;25883:597:0;-1:-1:-1;;;;;;25883:597:0;;;;;;;;:::i;16460:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16460:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;16460:38:0;;;;;;;;;;;;;;33429:185;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33429:185:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33429:185:0;;;;;;;;;;;;:::i;23000:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23000:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23000:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31704:841::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31704:841:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;31704:841:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31704:841:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31704:841:0;;-1:-1:-1;31704:841:0;-1:-1:-1;;;;;;31704:841:0;;;;;;;;:::i;20049:847::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20049:847:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20049:847:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16412:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16412:41:0;;;:::i;34155:250::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34155:250:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34155:250:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;34155:250:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34155:250:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34155:250:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34155:250:0;;-1:-1:-1;34155:250:0;;-1:-1:-1;;;;;34155:250:0:i;22258:663::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22258:663:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22258:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18300:732::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18300:732:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18300:732:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;19038:968;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19038:968:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28843:798::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28843:798:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;28843:798:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28843:798:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28843:798:0;;-1:-1:-1;28843:798:0;-1:-1:-1;;;;;;28843:798:0;;;;;;;;:::i;20902:673::-;21139:16;21157:14;21120:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;21211:196:::1;21241:5;21261:4;21280:9;21304:14;21333:12;21368:4;21388:8;21211:15;:196::i;:::-;21184:223:::0;;-1:-1:-1;21184:223:0;-1:-1:-1;21418:51:0::1;21446:5:::0;21453:2;21184:223;21418:27:::1;:51::i;:::-;21486:4;-1:-1:-1::0;;;;;21480:20:0::1;;21501:9;21480:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21480:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21480:31:0;;;;21522:45;21553:2;21557:9;21522:30;:45::i;:::-;20902:673:::0;;;;;;;;;;:::o;33622:259::-;33775:14;33814:59;33841:8;33851:9;33862:10;33814:26;:59::i;:::-;33807:66;33622:259;-1:-1:-1;;;;33622:259:0:o;27999:838::-;28213:21;28185:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28285:4:0::1;28260:29;:4:::0;;-1:-1:-1;;28265:15:0;;28260:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28260:21:0::1;-1:-1:-1::0;;;;;28260:29:0::1;;28252:68;;;::::0;;-1:-1:-1;;;28252:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28341:52;28369:7;28378:8;28388:4;;28341:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28341:27:0::1;::::0;-1:-1:-1;;;28341:52:0:i:1;:::-;28331:62;;28443:12;28412:7;28437:1;28420:7;:14;:18;28412:27;;;;;;;;;;;;;;:43;;28404:96;;;;-1:-1:-1::0;;;28404:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28511:138;28557:4;;28562:1;28557:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28557:7:0::1;28566:10;28578:48;28600:7;28609:4;;28614:1;28609:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28609:7:0::1;28618:4;;28623:1;28618:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28618:7:0::1;28578:21;:48::i;:::-;28628:7;28636:1;28628:10;;;;;;;;;;;;;;28511:31;:138::i;:::-;28660:35;28666:7;28675:4;;28660:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28689:4:0::1;::::0;-1:-1:-1;28660:5:0::1;::::0;-1:-1:-1;;28660:35:0:i:1;:::-;28712:4;-1:-1:-1::0;;;;;28706:20:0::1;;28727:7;28752:1;28735:7;:14;:18;28727:27;;;;;;;;;;;;;;28706:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28706:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28706:49:0;;;;28766:63;28797:2;28801:7;28826:1;28809:7;:14;:18;28801:27;;;;;;;;;;;;;;28766:30;:63::i;:::-;27999:838:::0;;;;;;;;;:::o;34413:250::-;34557:21;34603:52;34630:7;34639:9;34650:4;34603:26;:52::i;:::-;34596:59;;34413:250;;;;;:::o;21581:671::-;21887:12;21901;21926;21941:46;21963:7;21972:6;21980;21941:21;:46::i;:::-;21926:61;;21998:10;22011;:33;;22035:9;22011:33;;;-1:-1:-1;;22011:33:0;22055:77;;;-1:-1:-1;;;22055:77:0;;22080:10;22055:77;;;;22100:4;22055:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21998:46;;-1:-1:-1;;;;;;22055:24:0;;;;;:77;;;;;-1:-1:-1;;22055:77:0;;;;;;;;-1:-1:-1;22055:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;22055:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22055:77:0;;;;22164:80;22180:6;22188;22196:9;22207:10;22219;22231:2;22235:8;22164:15;:80::i;:::-;22143:101;;;;;;;;21581:671;;;;;;;;;;;;;;;;:::o;25258:619::-;25482:21;25463:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;25526:52:::1;25554:7;25563:8;25573:4;;25526:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25526:27:0::1;::::0;-1:-1:-1;;;25526:52:0:i:1;:::-;25516:62;;25628:12;25597:7;25622:1;25605:7;:14;:18;25597:27;;;;;;;;;;;;;;:43;;25589:96;;;;-1:-1:-1::0;;;25589:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25696:138;25742:4;;25747:1;25742:7;;;;;;25696:138;25845:24;25851:7;25860:4;;25845:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25866:2:0;;-1:-1:-1;25845:5:0::1;::::0;-1:-1:-1;;25845:24:0:i:1;27177:816::-:0;27391:21;27363:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27463:4:0::1;27438:29;:4:::0;;-1:-1:-1;;27443:15:0;;27438:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27438:21:0::1;-1:-1:-1::0;;;;;27438:29:0::1;;27430:68;;;::::0;;-1:-1:-1;;;27430:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27519:52;27546:7;27555:9;27566:4;;27519:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27519:26:0::1;::::0;-1:-1:-1;;;27519:52:0:i:1;:::-;27509:62;;27604:11;27590:7;27598:1;27590:10;;;;;;;;;;;;;;:25;;27582:74;;;;-1:-1:-1::0;;;27582:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23706:712:::0;24024:14;24051:12;24066:43;24088:7;24097:5;24104:4;24066:21;:43::i;:::-;24051:58;;24120:10;24133;:33;;24157:9;24133:33;;;-1:-1:-1;;24133:33:0;24177:77;;;-1:-1:-1;;;24177:77:0;;24202:10;24177:77;;;;24222:4;24177:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24120:46;;-1:-1:-1;;;;;;24177:24:0;;;;;:77;;;;;-1:-1:-1;;24177:77:0;;;;;;;;-1:-1:-1;24177:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;24177:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24177:77:0;;;;24277:133;24339:5;24346:9;24357:14;24373:12;24387:2;24391:8;24277:47;:133::i;:::-;24265:145;23706:712;-1:-1:-1;;;;;;;;;;;;;23706:712:0:o;30990:708::-;31224:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;31245:136:::1;31291:4;;31296:1;31291:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31291:7:0::1;31300:10;31312:48;31334:7;31343:4;;31348:1;31343:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31343:7:0::1;31352:4;;31357:1;31352:7;;;;;;31312:48;31362:8;31245:31;:136::i;:::-;31392:18;31420:4:::0;;-1:-1:-1;;31425:15:0;;31420:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31420:21:0::1;-1:-1:-1::0;;;;;31413:39:0::1;;31453:2;31413:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31413:43:0::1;-1:-1:-1::0;;;;;31413:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31413:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31413:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31413:43:0;31467:44:::1;::::0;;31413:43:::1;31467:44:::0;;::::1;::::0;;;;;;;;;;;31413:43;;-1:-1:-1;31467:44:0::1;::::0;;;31502:4;;;;;;31467:44;::::1;::::0;31502:4;;31467:44;31502:4;31467:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31508:2:0;;-1:-1:-1;31467:34:0::1;::::0;-1:-1:-1;;31467:44:0:i:1;:::-;31610:12:::0;31544:62:::1;31592:13:::0;31551:4;;-1:-1:-1;;31556:15:0;;31551:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31551:21:0::1;-1:-1:-1::0;;;;;31544:39:0::1;;31584:2;31544:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31544:43:0::1;-1:-1:-1::0;;;;;31544:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31544:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31544:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31544:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31522:168;;;;-1:-1:-1::0;;;31522:168:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16621:1;30990:708:::0;;;;;;;:::o;32551:834::-;32818:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32877:4:0::1;32852:29;:4:::0;;-1:-1:-1;;32857:15:0;;32852:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32852:21:0::1;-1:-1:-1::0;;;;;32852:29:0::1;;32844:68;;;::::0;;-1:-1:-1;;;32844:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32923:136;32969:4;;32974:1;32969:7;;;;;;32923:136;33070:55;33105:4;;33070:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;33119:4:0::1;::::0;-1:-1:-1;33070:34:0::1;::::0;-1:-1:-1;;33070:55:0:i:1;:::-;33153:37;::::0;;-1:-1:-1;;;33153:37:0;;33184:4:::1;33153:37;::::0;::::1;::::0;;;33136:14:::1;::::0;-1:-1:-1;;;;;33160:4:0::1;33153:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;33153:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33153:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;33153:37:0;;-1:-1:-1;33209:25:0;;::::1;;33201:78;;;;-1:-1:-1::0;;;33201:78:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33296:4;-1:-1:-1::0;;;;;33290:20:0::1;;33311:9;33290:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33290:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33290:31:0;;;;33332:45;33363:2;33367:9;33332:30;:45::i;26486:685::-:0;26702:21;26674:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;26760:4:::1;-1:-1:-1::0;;;;;26749:15:0::1;:4;;26754:1;26749:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26749:7:0::1;-1:-1:-1::0;;;;;26749:15:0::1;;26741:54;;;::::0;;-1:-1:-1;;;26741:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26816:53;26844:7;26853:9;26864:4;;26816:53;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26816:27:0::1;::::0;-1:-1:-1;;;26816:53:0:i:1;:::-;26806:63;;26919:12;26888:7;26913:1;26896:7;:14;:18;26888:27;;;;;;;;;;;;;;:43;;26880:96;;;;-1:-1:-1::0;;;26880:96:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26993:4;-1:-1:-1::0;;;;;26987:19:0::1;;27014:7;27022:1;27014:10;;;;;;;;;;;;;;26987:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26987:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26987:40:0;;;;;27051:4;-1:-1:-1::0;;;;;27045:20:0::1;;27066:48;27088:7;27097:4;;27102:1;27097:7;;;;;;27066:48;27116:7;27124:1;27116:10;;;;;;;;;;;;;;27045:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;27045:82:0::1;-1:-1:-1::0;;;;;27045:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27045:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27045:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27045:82:0;27038:90:::1;;;;27139:24;27145:7;27154:4;;27139:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27160:2:0;;-1:-1:-1;27139:5:0::1;::::0;-1:-1:-1;;27139:24:0:i:1;:::-;26486:685:::0;;;;;;;;:::o;33889:258::-;34042:13;34080:59;34106:9;34117;34128:10;34080:25;:59::i;25883:597::-;26107:21;26088:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;26151:52:::1;26178:7;26187:9;26198:4;;26151:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26151:26:0::1;::::0;-1:-1:-1;;;26151:52:0:i:1;:::-;26141:62;;26236:11;26222:7;26230:1;26222:10;;;;;;;;;;;;;;:25;;26214:74;;;;-1:-1:-1::0;;;26214:74:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16460:38:::0;;;:::o;33429:185::-;33526:12;33558:48;33578:7;33587:8;33597;33558:19;:48::i;23000:700::-;23266:14;23247:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;23309:196:::1;23339:5;23359:4;23378:9;23402:14;23431:12;23466:4;23486:8;23309:15;:196::i;:::-;23555:38;::::0;;-1:-1:-1;;;23555:38:0;;23587:4:::1;23555:38;::::0;::::1;::::0;;;23293:212;;-1:-1:-1;23516:78:0::1;::::0;-1:-1:-1;23544:5:0;;23551:2;;-1:-1:-1;;;;;23555:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;;:23;:38;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;23555:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23555:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23555:38:0;23516:27:::1;:78::i;:::-;23611:4;-1:-1:-1::0;;;;;23605:20:0::1;;23626:9;23605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23605:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23605:31:0;;;;23647:45;23678:2;23682:9;23647:30;:45::i;31704:841::-:0;31964:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;32009:4:::1;-1:-1:-1::0;;;;;31998:15:0::1;:4;;32003:1;31998:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31998:7:0::1;-1:-1:-1::0;;;;;31998:15:0::1;;31990:54;;;::::0;;-1:-1:-1;;;31990:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32055:13;32071:9;32055:25;;32097:4;-1:-1:-1::0;;;;;32091:19:0::1;;32118:8;32091:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32091:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32091:38:0;;;;;32153:4;-1:-1:-1::0;;;;;32147:20:0::1;;32168:48;32190:7;32199:4;;32204:1;32199:7;;;;;;32168:48;32218:8;32147:80;;;;;;;;;;;;;-1:-1:-1::0;;;;;32147:80:0::1;-1:-1:-1::0;;;;;32147:80:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32147:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32147:80:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32147:80:0;32140:88:::1;;;;32239:18;32267:4:::0;;-1:-1:-1;;32272:15:0;;32267:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32267:21:0::1;-1:-1:-1::0;;;;;32260:39:0::1;;32300:2;32260:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32260:43:0::1;-1:-1:-1::0;;;;;32260:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32260:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32260:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32260:43:0;32314:44:::1;::::0;;32260:43:::1;32314:44:::0;;::::1;::::0;;;;;;;;;;;32260:43;;-1:-1:-1;32314:44:0::1;::::0;;;32349:4;;;;;;32314:44;::::1;::::0;32349:4;;32314:44;32349:4;32314:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32355:2:0;;-1:-1:-1;32314:34:0::1;::::0;-1:-1:-1;;32314:44:0:i:1;:::-;32457:12:::0;32391:62:::1;32439:13:::0;32398:4;;-1:-1:-1;;32403:15:0;;32398:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32398:21:0::1;-1:-1:-1::0;;;;;32391:39:0::1;;32431:2;32391:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32391:43:0::1;-1:-1:-1::0;;;;;32391:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;20049:847:0::0;20303:12;20317;20284:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;20342:12:::1;20357:46;20379:7;20388:6;20396;20357:21;:46::i;:::-;20414:59;::::0;;-1:-1:-1;;;20414:59:0;;20445:10:::1;20414:59;::::0;::::1;::::0;-1:-1:-1;;;;;20414:30:0;::::1;:59:::0;;;;;;;;;;;;;;20342:61;;-1:-1:-1;20414:30:0;;::::1;::::0;:59;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20414:30:0;:59;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20414:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20414:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20541:26:0::1;::::0;;;;;-1:-1:-1;;;;;20541:26:0;;::::1;;::::0;::::1;::::0;;;20511:12:::1;::::0;;;20541:22;;::::1;::::0;::::1;::::0;:26;;;;;;;;;;;20511:12;20541:22;:26;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20541:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20541:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20541:26:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20541:26:0;-1:-1:-1;20579:14:0::1;20598:40;20623:6:::0;20631;20598:24:::1;:40::i;:::-;20578:60;;;20680:6;-1:-1:-1::0;;;;;20670:16:0::1;:6;-1:-1:-1::0;;;;;20670:16:0::1;;:58;;20711:7;20720;20670:58;;;20690:7;20699;20670:58;20649:79:::0;;-1:-1:-1;20649:79:0;-1:-1:-1;20747:21:0;;::::1;;20739:69;;;;-1:-1:-1::0;;;20739:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20838:10;20827:7;:21;;20819:69;;;;-1:-1:-1::0;;;20819:69:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16621:1;;;;20049:847:::0;;;;;;;;;;;:::o;16412:41::-;;;:::o;34155:250::-;34299:21;34345:52;34373:7;34382:8;34392:4;34345:27;:52::i;22258:663::-;22547:16;22565:14;22592:12;22607:43;22629:7;22638:5;22645:4;22607:21;:43::i;:::-;22592:58;;22661:10;22674;:33;;22698:9;22674:33;;;-1:-1:-1;;22674:33:0;22718:77;;;-1:-1:-1;;;22718:77:0;;22743:10;22718:77;;;;22763:4;22718:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22661:46;;-1:-1:-1;;;;;;22718:24:0;;;;;:77;;;;;-1:-1:-1;;22718:77:0;;;;;;;;-1:-1:-1;22718:24:0;:77;;;2:2:-1;;;;27:1;24;17:12;2:2;22718:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22718:77:0;;;;22833:80;22852:5;22859:9;22870:14;22886:12;22900:2;22904:8;22833:18;:80::i;:::-;22806:107;;;;-1:-1:-1;22258:663:0;-1:-1:-1;;;;;;;;;;;;;22258:663:0:o;18300:732::-;18588:12;18602;18616:14;18569:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;18664:85:::1;18678:6;18686;18694:14;18710;18726:10;18738;18664:13;:85::i;:::-;18643:106:::0;;-1:-1:-1;18643:106:0;-1:-1:-1;18760:12:0::1;18775:46;18797:7;18806:6:::0;18814;18775:21:::1;:46::i;:::-;18760:61;;18832:66;18864:6;18872:10;18884:4;18890:7;18832:31;:66::i;:::-;18909;18941:6;18949:10;18961:4;18967:7;18909:31;:66::i;:::-;19010:4;-1:-1:-1::0;;;;;18998:22:0::1;;19021:2;18998:26;;;;;;;;;;;;;-1:-1:-1::0;;;;;18998:26:0::1;-1:-1:-1::0;;;;;18998:26:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18998:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18998:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18998:26:0;18300:732;;;;-1:-1:-1;18998:26:0;;-1:-1:-1;18300:732:0;;-1:-1:-1;;;;;;;;;18300:732:0:o;19038:968::-;19291:16;19309:14;19325;19272:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;19379:176:::1;19407:5;19427:4;19446:18;19479:9;19503:14;19532:12;19379:13;:176::i;:::-;19352:203:::0;;-1:-1:-1;19352:203:0;-1:-1:-1;19566:12:0::1;19581:43;19603:7;19612:5:::0;19619:4:::1;19581:21;:43::i;:::-;19566:58;;19635:69;19667:5;19674:10;19686:4;19692:11;19635:31;:69::i;:::-;19721:4;-1:-1:-1::0;;;;;19715:19:0::1;;19742:9;19715:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19715:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19715:39:0;;;;;19778:4;-1:-1:-1::0;;;;;19772:20:0::1;;19793:4;19799:9;19772:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19772:37:0::1;-1:-1:-1::0;;;;;19772:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19772:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19772:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19772:37:0;19765:45:::1;;;;19845:4;-1:-1:-1::0;;;;;19833:22:0::1;;19856:2;19833:26;;;;;;;;;;;;;-1:-1:-1::0;;;;;19833:26:0::1;-1:-1:-1::0;;;;;19833:26:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19833:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19833:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19833:26:0;;-1:-1:-1;19910:9:0::1;:21:::0;-1:-1:-1;19906:92:0::1;;;19933:65;19964:10;19988:9;19976;:21;19933:30;:65::i;:::-;16621:1;19038:968:::0;;;;;;;;;;;:::o;28843:798::-;29056:21;29028:8;16569:15;16557:8;:27;;16549:61;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;-1:-1:-1;;;16549:61:0;;;;;;;;;;;;;;;29114:4:::1;-1:-1:-1::0;;;;;29103:15:0::1;:4;;29108:1;29103:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;29103:7:0::1;-1:-1:-1::0;;;;;29103:15:0::1;;29095:54;;;::::0;;-1:-1:-1;;;29095:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29170:52;29197:7;29206:9;29217:4;;29170:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29170:26:0::1;::::0;-1:-1:-1;;;29170:52:0:i:1;:::-;29160:62;;29255:9;29241:7;29249:1;29241:10;;;;;;;;;;;;;;:23;;29233:72;;;;-1:-1:-1::0;;;29233:72:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29322:4;-1:-1:-1::0;;;;;29316:19:0::1;;29343:7;29351:1;29343:10;;;;;;;;;;;;;;29316:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29316:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29316:40:0;;;;;29380:4;-1:-1:-1::0;;;;;29374:20:0::1;;29395:48;29417:7;29426:4;;29431:1;29426:7;;;;;;29395:48;29445:7;29453:1;29445:10;;;;;;;;;;;;;;29374:82;;;;;;;;;;;;;-1:-1:-1::0;;;;;29374:82:0::1;-1:-1:-1::0;;;;;29374:82:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29374:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29374:82:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29374:82:0;29367:90:::1;;;;29468:24;29474:7;29483:4;;29468:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29489:2:0;;-1:-1:-1;29468:5:0::1;::::0;-1:-1:-1;;29468:24:0:i:1;:::-;29555:7;29563:1;29555:10;;;;;;;;;;;;;;29543:9;:22;29539:94;;;29567:66;29598:10;29622:7;29630:1;29622:10;;;;;;;;;;;;;;29610:9;:22;29567:30;:66::i;670:361::-:0;865:45;;;-1:-1:-1;;;;;865:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;865:45:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;865:45:0;179:29:-1;160:49;;854:57:0;;;;819:12;;833:17;;854:10;;;;865:45;854:57;;;25:18:-1;854:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;854:57:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;818:93:0;;;;930:7;:57;;;;-1:-1:-1;942:11:0;;:16;;:44;;;973:4;962:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;962:24:0;942:44;922:101;;;;;-1:-1:-1;;;922:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;670:361;;;;;:::o;1449:195::-;1557:12;;;1519;1557;;;;;;;;;-1:-1:-1;;;;;1536:7:0;;;1550:5;;1536:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1536:34:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1518:52:0;;;1589:7;1581:55;;;;-1:-1:-1;;;1581:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1449:195;;;:::o;12811:513::-;12904:14;12950:1;12939:8;:12;12931:65;;;;-1:-1:-1;;;12931:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13027:1;13015:9;:13;:31;;;;;13045:1;13032:10;:14;13015:31;13007:81;;;;-1:-1:-1;;;13007:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13099:20;13122:18;:8;13135:4;13122:18;:12;:18;:::i;:::-;13099:41;-1:-1:-1;13151:14:0;13168:31;13099:41;13188:10;13168:31;:19;:31;:::i;:::-;13151:48;-1:-1:-1;13210:16:0;13229:41;13254:15;13229:20;:9;13243:5;13229:20;:13;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;13210:60;;13305:11;13293:9;:23;;;;;;;12811:513;-1:-1:-1;;;;;;;12811:513:0:o;13995:508::-;14096:21;14153:1;14138:4;:11;:16;;14130:56;;;;;-1:-1:-1;;;14130:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14218:4;:11;14207:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14207:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14207:23:0;;14197:33;;14254:8;14241:7;14249:1;14241:10;;;;;;;;;;;;;:21;;;;;14278:6;14273:223;14304:1;14290:4;:11;:15;14286:1;:19;14273:223;;;14328:14;14344:15;14363:42;14375:7;14384:4;14389:1;14384:7;;;;;;;;;;;;;;14393:4;14398:1;14402;14398:5;14393:11;;;;;;;;;;;;;;14363;:42::i;:::-;14327:78;;;;14437:47;14450:7;14458:1;14450:10;;;;;;;;;;;;;;14462:9;14473:10;14437:12;:47::i;:::-;14420:7;14428:1;14432;14428:5;14420:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14307:3:0;;14273:223;;;;13995:508;;;;;:::o;11294:478::-;11383:12;11409:14;11425;11443:26;11454:6;11462;11443:10;:26::i;:::-;11607:32;;;-1:-1:-1;;11607:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11607:32:0;;;;;11597:43;;;;;;11510:251;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11510:251:0;;;;;;;11500:262;;;;;;;;;11294:478;-1:-1:-1;;;;;11294:478:0:o;1039:402::-;1264:51;;;-1:-1:-1;;;;;1264:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1264:51:0;;;;;;;25:18:-1;;61:17;;96:58;182:15;-1:-1;;;179:29;160:49;;1253:63:0;;;;1218:12;;1232:17;;1253:10;;;;1264:51;1253:63;;;25:18:-1;1253:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1253:63:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1217:99:0;;;;1335:7;:57;;;;-1:-1:-1;1347:11:0;;:16;;:44;;;1378:4;1367:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1367:24:0;1347:44;1327:106;;;;-1:-1:-1;;;1327:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1039:402;;;;;;:::o;24529:723::-;24636:6;24631:614;24662:1;24648:4;:11;:15;24644:1;:19;24631:614;;;24686:13;24701:14;24720:4;24725:1;24720:7;;;;;;;;;;;;;;24729:4;24734:1;24738;24734:5;24729:11;;;;;;;;;;;;;;24685:56;;;;24757:14;24776:39;24801:5;24808:6;24776:24;:39::i;:::-;24756:59;;;24830:14;24847:7;24855:1;24859;24855:5;24847:14;;;;;;;;;;;;;;24830:31;;24877:15;24894;24922:6;-1:-1:-1;;;;;24913:15:0;:5;-1:-1:-1;;;;;24913:15:0;;:61;;24955:9;24971:1;24913:61;;;24937:1;24941:9;24913:61;24876:98;;;;24989:10;25020:1;25006:4;:11;:15;25002:1;:19;:79;;25078:3;25002:79;;;25024:51;25046:7;25055:6;25063:4;25068:1;25072;25068:5;25063:11;;;;;;;;;;;;;;25024:21;:51::i;:::-;24989:92;;25108:45;25130:7;25139:5;25146:6;25108:21;:45::i;:::-;-1:-1:-1;;;;;25096:63:0;;25178:10;25190;25202:2;25216:1;25206:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25206:12:0;87:42:-1;143:17;;-1:-1;25206:12:0;;25096:137;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25096:137:0;-1:-1:-1;;;;;25096:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25096:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25096:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24665:3:0;;;;;-1:-1:-1;24631:614:0;;-1:-1:-1;;;;;;;;24631:614:0;;;24529:723;;;:::o;14584:529::-;14685:21;14742:1;14727:4;:11;:16;;14719:56;;;;;-1:-1:-1;;;14719:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14807:4;:11;14796:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14796:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14796:23:0;;14786:33;;14860:9;14830:7;14855:1;14838:7;:14;:18;14830:27;;;;;;;;;;;;;;;;;:39;14894:11;;-1:-1:-1;;14894:15:0;14880:226;14911:5;;14880:226;;14939:14;14955:15;14974:42;14986:7;14995:4;15004:1;15000;:5;14995:11;;;;;;;;;;;;;;15008:4;15013:1;15008:7;;;;;;;14974:42;14938:78;;;;15048:46;15060:7;15068:1;15060:10;;;;;;;;;;;;;;15072:9;15083:10;15048:11;:46::i;:::-;15031:7;15043:1;15039;:5;15031:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14918:3:0;14880:226;;29788:1196;29901:6;29896:1081;29927:1;29913:4;:11;:15;29909:1;:19;29896:1081;;;29951:13;29966:14;29985:4;29990:1;29985:7;;;;;;;;;;;;;;29994:4;29999:1;30003;29999:5;29994:11;;;;;;;;;;;;;;29950:56;;;;30022:14;30041:39;30066:5;30073:6;30041:24;:39::i;:::-;30021:59;;;30095:16;30126:45;30148:7;30157:5;30164:6;30126:21;:45::i;:::-;30095:77;;30187:16;30218:17;30306:13;30321;30339:4;-1:-1:-1;;;;;30339:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30339:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30339:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30339:18:0;;;;;;;30305:52;;;;;-1:-1:-1;30305:52:0;;-1:-1:-1;30373:17:0;;-1:-1:-1;;;;;30414:15:0;;;;;;;:61;;30456:8;30466;30414:61;;;30433:8;30443;30414:61;30372:103;;;;30504:56;30547:12;30511:5;-1:-1:-1;;;;;30504:23:0;;30536:4;30504:38;;;;;;;;;;;;;-1:-1:-1;;;;;30504:38:0;-1:-1:-1;;;;;30504:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30504:56:0;30490:70;;30590:68;30617:11;30630:12;30644:13;30590:26;:68::i;:::-;30575:83;;29896:1081;;;;30689:15;30706;30734:6;-1:-1:-1;;;;;30725:15:0;:5;-1:-1:-1;;;;;30725:15:0;;:67;;30770:12;30789:1;30725:67;;;30749:1;30753:12;30725:67;30688:104;;;;30807:10;30838:1;30824:4;:11;:15;30820:1;:19;:79;;30896:3;30820:79;;;30842:51;30864:7;30873:6;30881:4;30886:1;30890;30886:5;30881:11;;;;;;;30842:51;30952:12;;;30962:1;30952:12;;;;;;;;;;30914:51;;;;;;;;;;;;;;;-1:-1:-1;;;;;30914:51:0;;;;;;;;;;;;;;;;;;;;;;30807:92;;-1:-1:-1;30914:9:0;;;;;;30924:10;;30936;;30807:92;;30952:12;;30914:51;;;;;;;;30952:12;;30914:51;;;;30952:12;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30914:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30914:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29930:3:0;;;;;-1:-1:-1;29896:1081:0;;-1:-1:-1;;;;;;;;;;29896:1081:0;7805:129;7889:5;;;7884:16;;;;7876:50;;;;;-1:-1:-1;;;7876:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13445:468;13538:13;13584:1;13572:9;:13;13564:67;;;;-1:-1:-1;;;13564:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13662:1;13650:9;:13;:31;;;;;13680:1;13667:10;:14;13650:31;13642:81;;;;-1:-1:-1;;;13642:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13734:14;13751:35;13780:5;13751:24;:9;13765;13751:24;:13;:24;:::i;:::-;:28;:35;:28;:35;:::i;:::-;13734:52;-1:-1:-1;13797:16:0;13816:35;13846:4;13816:25;:10;13831:9;13816:25;:14;:25;:::i;:35::-;13797:54;;13873:32;13903:1;13886:11;13874:9;:23;;;;;;;13873:32;:29;:32;:::i;:::-;13862:43;13445:468;-1:-1:-1;;;;;;13445:468:0:o;12374:315::-;12456:12;12499:1;12489:7;:11;12481:58;;;;-1:-1:-1;;;12481:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12569:1;12558:8;:12;:28;;;;;12585:1;12574:8;:12;12558:28;12550:78;;;;-1:-1:-1;;;12550:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12673:8;12649:21;:7;12661:8;12649:21;:11;:21;:::i;:::-;:32;;;;;;;12374:315;-1:-1:-1;;;;12374:315:0:o;10859:343::-;10934:14;10950;10995:6;-1:-1:-1;;;;;10985:16:0;:6;-1:-1:-1;;;;;10985:16:0;;;10977:63;;;;-1:-1:-1;;;10977:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11079:6;-1:-1:-1;;;;;11070:15:0;:6;-1:-1:-1;;;;;11070:15:0;;:53;;11108:6;11116;11070:53;;;11089:6;11097;11070:53;11051:72;;-1:-1:-1;11051:72:0;-1:-1:-1;;;;;;11142:20:0;;11134:60;;;;;-1:-1:-1;;;11134:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10859:343;;;;;:::o;16925:1369::-;17238:47;;;;;;-1:-1:-1;;;;;17238:47:0;;;;;;;;;;;;;;;;17143:12;;;;;;17253:7;17238:31;;;;;;:47;;;;;;;;;;;;;;;:31;:47;;;2:2:-1;;;;27:1;24;17:12;2:2;17238:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17238:47:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17238:47:0;-1:-1:-1;;;;;17238:61:0;;17234:144;;;17316:50;;;;;;-1:-1:-1;;;;;17316:50:0;;;;;;;;;;;;;;;;17331:7;17316:34;;;;;;:50;;;;;;;;;;;;;;;-1:-1:-1;17316:34:0;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;17316:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17316:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17234:144:0;17389:13;17404;17421:50;17447:7;17456:6;17464;17421:25;:50::i;:::-;17388:83;;;;17486:8;17498:1;17486:13;:30;;;;-1:-1:-1;17503:13:0;;17486:30;17482:805;;;17555:14;;-1:-1:-1;17571:14:0;;-1:-1:-1;17482:805:0;;;17619:19;17641:55;17661:14;17677:8;17687;17641:19;:55::i;:::-;17619:77;;17733:14;17715;:32;17711:565;;17794:10;17776:14;:28;;17768:76;;;;-1:-1:-1;;;17768:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17885:14;;-1:-1:-1;17901:14:0;-1:-1:-1;17901:14:0;17711:565;;;17957:19;17979:55;17999:14;18015:8;18025;17979:19;:55::i;:::-;17957:77;;18078:14;18060;:32;;18053:40;;;;18138:10;18120:14;:28;;18112:76;;;;-1:-1:-1;;;18112:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18229:14;-1:-1:-1;18245:14:0;;-1:-1:-1;17711:565:0;17482:805;;16925:1369;;;;;;;;;;;:::o;7942:142::-;7994:6;8021;;;:30;;-1:-1:-1;;8036:5:0;;;8050:1;8045;8036:5;8045:1;8031:15;;;;;:20;8021:30;8013:63;;;;;-1:-1:-1;;;8013:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7669:128;7753:5;;;7748:16;;;;7740:49;;;;;-1:-1:-1;;;7740:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11830:431;11923:13;11938;11965:14;11984:26;11995:6;12003;11984:10;:26::i;:::-;11964:46;;;12021:32;12029:7;12038:6;12046;12021:7;:32::i;:::-;;12065:13;12080;12110:32;12118:7;12127:6;12135;12110:7;:32::i;:::-;-1:-1:-1;;;;;12098:57:0;;:59;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12098:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12098:59:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12098:59:0;;;;;;;12064:93;;;;;-1:-1:-1;12064:93:0;;-1:-1:-1;;;;;;12191:16:0;;;;;;;:62;;12234:8;12244;12191:62;;;12211:8;12221;12191:62;12168:85;;;;-1:-1:-1;11830:431:0;-1:-1:-1;;;;;;;11830:431:0:o

Swarm Source

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