Contract 0xbe4ab2603140f134869cb32ab4bc56d762ae900b 2

Contract Overview

Balance:
0 HT

HT Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x8ffd76cf1758b1407c0a554357b3852ba703bef5ed55bfb5398e1126571fae17Swap Exact Token...(pending)2022-01-20 2:06:196 secs ago0xdca397cd68985af82a18bf7347d8b410087156f7 IN 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT(Pending)
0x156e0ff10d440157504abc934acce93a60a7fd27228ad56683b79077b1d1b99dSwap ETH For Exa...119084302022-01-19 19:08:426 hrs 57 mins ago0x4fcb14aaa019ebad4b1a37b59750fc367ecaa038 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.004443779780788 HT0.0003194052.5
0x534a7b45daf1744724d1524b4af00f0d31d8fef5a669a2663bd54a8e41808f53Swap Exact Token...119070092022-01-19 17:57:398 hrs 8 mins ago0xe38c2cc64d58f6f7b7d9180ec360c19356286a77 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.000422792.5
0x7a501f5df446183fbae157a835041acb5bf1b1621018cc96cc8993be989283bcSwap Exact ETH F...119046172022-01-19 15:58:0310 hrs 8 mins ago0x6126dc26c7b110be9664690f7b94f00662988075 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.006 HT0.0005336152.5
0x79666b14ad9b14f3b6c9a5ac3ecc44a6313e6fc02a29ebc87e507a3f41874d21Swap Exact ETH F...119043852022-01-19 15:46:2710 hrs 19 mins ago0x29426988b147aada75e0e0eeca2e4a83b668d87b IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.52 HT0.000694012.5
0x9f68048c4740539661c7a049698df65e63167057eda1c8ea388596451cf05506Swap Exact ETH F...119036702022-01-19 15:10:4210 hrs 55 mins ago0x6126dc26c7b110be9664690f7b94f00662988075 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b67.9088229275 HT0.00038507252.5
0x23732e392c33444db71848a575b3bf8c90b832dc8a515079a9cd167c35fa3e36Swap Exact Token...119035912022-01-19 15:06:4510 hrs 59 mins ago0x3d3f69e5a9953d44f36e7d81564aed490e44a345 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042743252.5
0xc170be094d26a734511444428f22a748119dbd8e9250a2a73153e31ea91e2beeSwap Exact ETH F...119033522022-01-19 14:54:4811 hrs 11 mins ago0x6126dc26c7b110be9664690f7b94f00662988075 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b10.5510311138 HT0.00038507252.5
0x6b610dfd13d95da4bb3dcb756732b9103d003389fe3aff11a8f8a68887f3abb9Swap Exact Token...119022622022-01-19 14:00:1812 hrs 6 mins ago0xfe1161849d370f2e8477a51e4b3c312ba2e48091 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.000384689252.25
0xe510268b47f080bbadca0a0802b5cb5cd23e49f292c25c51c4c318af179c0de2Swap Exact Token...119011422022-01-19 13:04:1813 hrs 2 mins ago0x1d4fbcd79f040ebfc96e1e1a654ca4d952f10bee IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042740252.5
0x04d353d0e379909ff7da0cba961b1497f5737b75b5ef373a53287e3be4d0b461Swap Exact Token...118999822022-01-19 12:06:1814 hrs ago0xbc4a3d8f6125f0105de4cfb6585fe1f4c9e274ea IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.0005277782.25
0xef04af8ec0d910d5a8665a76aa477d3b6fbe4bf8f9f621344610da2462bc96d2Remove Liquidity...118999142022-01-19 12:02:5414 hrs 3 mins ago0xbc4a3d8f6125f0105de4cfb6585fe1f4c9e274ea IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.000614769752.25
0xf21b258ce8454f8af09aa075395966ee876f12a95b839d94c243681109ea5caeSwap Exact Token...118956102022-01-19 8:27:4217 hrs 38 mins ago0x378a42acc3102fb1a5473852ffec09348bdacd9c IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042740252.5
0xd13ef6eaa9eb155a87844fc94c1e936063c4984a56b2ff2c727be508a0b4fc1eSwap Exact ETH F...118952112022-01-19 8:07:4517 hrs 58 mins ago0xbbc5f0c00e3ac5a45f97d5370031bd5d47871334 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b2.61930198591782 HT0.000420860252.25
0xb6240218c9be0a649c587eee61ce1a5c7fe52742fea893841432e3935e876ff1Swap Exact Token...118951762022-01-19 8:06:0018 hrs ago0xbbc5f0c00e3ac5a45f97d5370031bd5d47871334 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.000384635252.25
0xc43929720a620317435560cdedd6986acc27275d8c9f6ea57d9ec9ad85bc016cSwap Exact Token...118943132022-01-19 7:22:5118 hrs 43 mins ago0x47b7dc3340330c6d2ee5f83a91d7222ecb34eabe IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00029938252.5
0x423f75b77b46f5ea8b2d88a5585db8fd03c5bb1b0cc92f9d84afb4b100d089ceSwap Exact Token...118918692022-01-19 5:20:3920 hrs 45 mins ago0xf6541d03963151a8f6cdafbfeea594f866247aa6 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00039696252.5
0xe167de2a700eec2f0d265d5a272aee48bc474fad558d1c739cfbe76bdfcd85c5Swap Exact Token...118917642022-01-19 5:15:2420 hrs 51 mins ago0xc97db36bfaa0165f354193225b02deddefca7697 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042740252.5
0x15a8034c0c1a46c614993d1f190899dcdde9da45b3f51fab00d7cf964fad42a5Remove Liquidity118912462022-01-19 4:49:3021 hrs 16 mins ago0x7c50cccb9c21b0939dfe64215b461aacea993cbf IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00195291252.5
0x033b5ac73abc6c41859d4646035a6982bd1595e8d63d0d8f336634ab48d2bc4fSwap Exact Token...118904872022-01-19 4:11:3321 hrs 54 mins ago0xf72b5412e0d25733195d6eb8c81237dd8c1c3bd8 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042740252.5
0x7105b0114eb283449e8c9783153562e4784354e7aa0a63bcd1f7002b3366196bSwap Exact ETH F...118899752022-01-19 3:45:5722 hrs 20 mins ago0xc8673285fd5ab1f61a735b8e6bdb66b9abe87cd2 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.01 HT0.000455952.5
0xe3687859ae18783121879e4e096277e35e98af210b933fb15e0356e14807f430Swap Exact Token...118887962022-01-19 2:47:0023 hrs 19 mins ago0xa047cf5f3ff2812e0b31206a600920c113f5ec48 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.000698172.5
0x42649f0fdd052249f7757c8bce6f839712c29ec4f47c4c68916ba80b628a4a5fSwap Exact Token...118886082022-01-19 2:37:3623 hrs 28 mins ago0x03e50df75e268cfdde5ed2a24982597598cc080b IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042740252.5
0xc1ffd7e636259ea6e68d5eb0ecdc547739f94a784718031499d78ae6ed8396d4Swap Exact Token...118841602022-01-18 22:55:121 day 3 hrs ago0xe2ac0007c1fe62583760d5e73e374b0998101722 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b0 HT0.00042737252.5
0xe74bc16f8af289696057d5578dddffdc91095fbc5ae50c0cd56b5978041bebbeSwap Exact ETH F...118755492022-01-18 15:44:391 day 10 hrs ago0x5c1752ecb0ff8e2f3cb27a40d36a0d8b0bc92694 IN  0xbe4ab2603140f134869cb32ab4bc56d762ae900b2.7 HT0.00042782252.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xd2a88b9cfe16d1942f39aef4c38f448fc359261efb122737d96318da6cea58ce119106712022-01-19 21:00:455 hrs 5 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token0.105763721551215627 HT
0xd2a88b9cfe16d1942f39aef4c38f448fc359261efb122737d96318da6cea58ce119106712022-01-19 21:00:455 hrs 5 mins ago HTFly: FC Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.105763721551215627 HT
0xd2a88b9cfe16d1942f39aef4c38f448fc359261efb122737d96318da6cea58ce119106712022-01-19 21:00:455 hrs 5 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b HTFly: FC Token0.317291164653646883 HT
0xd2a88b9cfe16d1942f39aef4c38f448fc359261efb122737d96318da6cea58ce119106712022-01-19 21:00:455 hrs 5 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.317291164653646883 HT
0x156e0ff10d440157504abc934acce93a60a7fd27228ad56683b79077b1d1b99d119084302022-01-19 19:08:426 hrs 57 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0x4fcb14aaa019ebad4b1a37b59750fc367ecaa0380.00002210835711835 HT
0x156e0ff10d440157504abc934acce93a60a7fd27228ad56683b79077b1d1b99d119084302022-01-19 19:08:426 hrs 57 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token0.004421671423670065 HT
0x7a501f5df446183fbae157a835041acb5bf1b1621018cc96cc8993be989283bc119046172022-01-19 15:58:0310 hrs 8 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token0.006 HT
0x79666b14ad9b14f3b6c9a5ac3ecc44a6313e6fc02a29ebc87e507a3f41874d21119043852022-01-19 15:46:2710 hrs 19 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token0.52 HT
0x9f68048c4740539661c7a049698df65e63167057eda1c8ea388596451cf05506119036702022-01-19 15:10:4210 hrs 55 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token67.9088229275 HT
0x23732e392c33444db71848a575b3bf8c90b832dc8a515079a9cd167c35fa3e36119035912022-01-19 15:06:4510 hrs 59 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0x3d3f69e5a9953d44f36e7d81564aed490e44a34579.089970684295099472 HT
0x23732e392c33444db71848a575b3bf8c90b832dc8a515079a9cd167c35fa3e36119035912022-01-19 15:06:4510 hrs 59 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b79.089970684295099472 HT
0xc170be094d26a734511444428f22a748119dbd8e9250a2a73153e31ea91e2bee119033522022-01-19 14:54:4811 hrs 11 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b Huobi: Wrapped Huobi Token10.5510311138 HT
0x6b610dfd13d95da4bb3dcb756732b9103d003389fe3aff11a8f8a68887f3abb9119022622022-01-19 14:00:1812 hrs 6 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0xfe1161849d370f2e8477a51e4b3c312ba2e4809183.459776805140655179 HT
0x6b610dfd13d95da4bb3dcb756732b9103d003389fe3aff11a8f8a68887f3abb9119022622022-01-19 14:00:1812 hrs 6 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b83.459776805140655179 HT
0xe510268b47f080bbadca0a0802b5cb5cd23e49f292c25c51c4c318af179c0de2119011422022-01-19 13:04:1813 hrs 2 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0x1d4fbcd79f040ebfc96e1e1a654ca4d952f10bee1.953557152725765714 HT
0xe510268b47f080bbadca0a0802b5cb5cd23e49f292c25c51c4c318af179c0de2119011422022-01-19 13:04:1813 hrs 2 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b1.953557152725765714 HT
0x04d353d0e379909ff7da0cba961b1497f5737b75b5ef373a53287e3be4d0b461118999822022-01-19 12:06:1814 hrs ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0xbc4a3d8f6125f0105de4cfb6585fe1f4c9e274ea0.078362147905051649 HT
0x04d353d0e379909ff7da0cba961b1497f5737b75b5ef373a53287e3be4d0b461118999822022-01-19 12:06:1814 hrs ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.078362147905051649 HT
0xef04af8ec0d910d5a8665a76aa477d3b6fbe4bf8f9f621344610da2462bc96d2118999142022-01-19 12:02:5414 hrs 3 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0xbc4a3d8f6125f0105de4cfb6585fe1f4c9e274ea0.897160137043772647 HT
0xef04af8ec0d910d5a8665a76aa477d3b6fbe4bf8f9f621344610da2462bc96d2118999142022-01-19 12:02:5414 hrs 3 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.897160137043772647 HT
0x6045647d0a125373a17de6671cf76684306638f677b2dc8cc9ee1f32b97cfc20118984262022-01-19 10:48:3015 hrs 17 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0x9abd9a0ca65c485a51834a2bd3c64e1441d360690.020222389066074643 HT
0x6045647d0a125373a17de6671cf76684306638f677b2dc8cc9ee1f32b97cfc20118984262022-01-19 10:48:3015 hrs 17 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0.020222389066074643 HT
0xf21b258ce8454f8af09aa075395966ee876f12a95b839d94c243681109ea5cae118956102022-01-19 8:27:4217 hrs 38 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0x378a42acc3102fb1a5473852ffec09348bdacd9c17.16883817949416689 HT
0xf21b258ce8454f8af09aa075395966ee876f12a95b839d94c243681109ea5cae118956102022-01-19 8:27:4217 hrs 38 mins ago Huobi: Wrapped Huobi Token 0xbe4ab2603140f134869cb32ab4bc56d762ae900b17.16883817949416689 HT
0xe0c9d2d38150cfb0f463cc2505ad7d87a129f3c7ac881c595bd2f88041d1fdda118952802022-01-19 8:11:1217 hrs 55 mins ago 0xbe4ab2603140f134869cb32ab4bc56d762ae900b0xb069829d5f893367989bcbe357a96ec53370e20c0.152759267281311655 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PippiRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-03-08
*/

// File: @uniswap/v2-core/contracts/interfaces/IPippiFactory.sol

pragma solidity >=0.5.0;

interface IPippiFactory {
    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;
}

// 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/IPippiRouter01.sol

pragma solidity >=0.6.2;

interface IPippiRouter01 {
    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/IPippiRouter02.sol

pragma solidity >=0.6.2;


interface IPippiRouter02 is IPippiRouter01 {
    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: @uniswap/v2-core/contracts/interfaces/IPippiPair.sol

pragma solidity >=0.5.0;

interface IPippiPair {
    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/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/libraries/PippiLibrary.sol

pragma solidity >=0.5.0;



library PippiLibrary {
    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, 'PippiLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'PippiLibrary: 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'd805d4c8a7fb3567167020352386905de5d4bd188fe2284675e3ed584653df75' // 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,) = IPippiPair(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, 'PippiLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'PippiLibrary: 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, 'PippiLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'PippiLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'PippiLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'PippiLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(998);
        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, 'PippiLibrary: 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, 'PippiLibrary: 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/PippiRouter.sol

pragma solidity =0.6.6;








contract PippiRouter is IPippiRouter02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'PippiRouter: 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 (IPippiFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IPippiFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = PippiLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = PippiLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'PippiRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = PippiLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'PippiRouter: 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 = PippiLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IPippiPair(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 = PippiLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IPippiPair(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 = PippiLibrary.pairFor(factory, tokenA, tokenB);
        IPippiPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IPippiPair(pair).burn(to);
        (address token0,) = PippiLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'PippiRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'PippiRouter: 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 = PippiLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IPippiPair(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 = PippiLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IPippiPair(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 = PippiLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IPippiPair(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,) = PippiLibrary.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 ? PippiLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IPippiPair(PippiLibrary.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 = PippiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PippiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PippiLibrary.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 = PippiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PippiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PippiLibrary.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, 'PippiRouter: INVALID_PATH');
        amounts = PippiLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PippiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PippiLibrary.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, 'PippiRouter: INVALID_PATH');
        amounts = PippiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'PippiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PippiLibrary.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, 'PippiRouter: INVALID_PATH');
        amounts = PippiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'PippiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PippiLibrary.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, 'PippiRouter: INVALID_PATH');
        amounts = PippiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'PippiRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(PippiLibrary.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,) = PippiLibrary.sortTokens(input, output);
            IPippiPair pair = IPippiPair(PippiLibrary.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 = PippiLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? PippiLibrary.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, PippiLibrary.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,
            'PippiRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'PippiRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(PippiLibrary.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,
            'PippiRouter: 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, 'PippiRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, PippiLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'PippiRouter: 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 PippiLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return PippiLibrary.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"}]

60c060405234801561001057600080fd5b5060405162004750380380620047508339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6145cb620001856000398061015f5280610ce45280610d1f5280610e16528061103452806113be528061152452806118eb52806119e55280611a9b5280611b695280611caf5280611d375280611f7c5280611ff752806120a652806121725280612207528061227b528061277952806129ec5280612a425280612a765280612aea5280612c8a5280612dcd5280612e55525080610ea45280610f7b52806110fa5280611133528061126e528061144c528061150252806116725280611bfc5280611d695280611ecc52806122ad528061250652806126fe5280612727528061275752806128c45280612a205280612d1d5280612e87528061372e52806137715280613a545280613bd3528061400352806140b1528061413152506145cb6000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610dc6565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506110f3945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff6101008201351690610120810135906101400135611129565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611223565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561136e565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356114fa565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611608565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b03813516906020013561189d565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b21565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e74565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611e81565b34801561088157600080fd5b5061088a611f7a565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611f9e565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fab565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561212c565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124b8565b348015610a1c57600080fd5b5061088a6126fc565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612720945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561274d565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612861565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561299d565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c42565b6000808242811015610cde576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124b8565b9093509150610d1d898685612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da5858361312e565b50965096945050505050565b6000610dbe848484613226565b949350505050565b60608142811015610e0c576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e4657fe5b905060200201356001600160a01b03166001600160a01b031614610e9f576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b610efd7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110610f1057fe5b60200260200101511015610f555760405162461bcd60e51b81526004018080602001828103825260278152602001806143cc6027913960400191505060405180910390fd5b610ff386866000818110610f6557fe5b905060200201356001600160a01b031633610fd97f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fa757fe5b905060200201356001600160a01b03168b8b6001818110610fc457fe5b905060200201356001600160a01b0316613462565b85600081518110610fe657fe5b6020026020010151613522565b6110328287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061367f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061107157fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110af57600080fd5b505af11580156110c3573d6000803e3d6000fd5b505050506110e884836001855103815181106110db57fe5b602002602001015161312e565b509695505050505050565b60606111207f000000000000000000000000000000000000000000000000000000000000000084846138c5565b90505b92915050565b60008060006111597f00000000000000000000000000000000000000000000000000000000000000008f8f613462565b9050600087611168578c61116c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156111e257600080fd5b505af11580156111f6573d6000803e3d6000fd5b505050506112098f8f8f8f8f8f8f6124b8565b809450819550505050509b509b9950505050505050505050565b60608142811015611269576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6112c77f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b915086826001845103815181106112da57fe5b6020026020010151101561131f5760405162461bcd60e51b81526004018080602001828103825260278152602001806143cc6027913960400191505060405180910390fd5b61132f86866000818110610f6557fe5b6110e88287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b606081428110156113b4576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113ee57fe5b905060200201356001600160a01b03166001600160a01b031614611447576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b6114a57f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b915086826000815181106114b557fe5b60200260200101511115610f555760405162461bcd60e51b81526004018080602001828103825260238152602001806144a46023913960400191505060405180910390fd5b6000806115487f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050600086611557578b61155b565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115d157600080fd5b505af11580156115e5573d6000803e3d6000fd5b505050506115f78d8d8d8d8d8d611fab565b9d9c50505050505050505050505050565b804281101561164c576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6116c18585600081811061165c57fe5b905060200201356001600160a01b0316336116bb7f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b905060200201356001600160a01b03168a8a6001818110610fc457fe5b8a613522565b6000858560001981018181106116d357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b505160408051602088810282810182019093528882529293506117a49290918991899182918501908490808284376000920191909152508892506139fd915050565b8661185682888860001981018181106117b957fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b505afa158015611832573d6000803e3d6000fd5b505050506040513d602081101561184857600080fd5b50519063ffffffff613d0816565b10156118935760405162461bcd60e51b81526004018080602001828103825260278152602001806143cc6027913960400191505060405180910390fd5b5050505050505050565b80428110156118e1576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061191b57fe5b905060200201356001600160a01b03166001600160a01b031614611974576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b6119848585600081811061165c57fe5b6119c28585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506139fd915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a2c57600080fd5b505afa158015611a40573d6000803e3d6000fd5b505050506040513d6020811015611a5657600080fd5b5051905086811015611a995760405162461bcd60e51b81526004018080602001828103825260278152602001806143cc6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611aff57600080fd5b505af1158015611b13573d6000803e3d6000fd5b50505050611893848261312e565b60608142811015611b67576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611b9e57fe5b905060200201356001600160a01b03166001600160a01b031614611bf7576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b611c557f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331692505050565b91508682600184510381518110611c6857fe5b60200260200101511015611cad5760405162461bcd60e51b81526004018080602001828103825260278152602001806143cc6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611ce957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1c57600080fd5b505af1158015611d30573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d957f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110611da257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611df957600080fd5b505af1158015611e0d573d6000803e3d6000fd5b505050506040513d6020811015611e2357600080fd5b5051611e2b57fe5b611e6a8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b5095945050505050565b6000610dbe848484613d58565b60608142811015611ec7576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b611f257f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91508682600081518110611f3557fe5b6020026020010151111561131f5760405162461bcd60e51b81526004018080602001828103825260238152602001806144a46023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610dbe848484613e48565b60008142811015611ff1576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b612020887f000000000000000000000000000000000000000000000000000000000000000089898930896124b8565b604080516370a0823160e01b815230600482015290519194506120a492508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b5051612fc4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561210a57600080fd5b505af115801561211e573d6000803e3d6000fd5b505050506110e8848361312e565b8042811015612170576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121a757fe5b905060200201356001600160a01b03166001600160a01b031614612200576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561226057600080fd5b505af1158015612274573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6122d97f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561232957600080fd5b505af115801561233d573d6000803e3d6000fd5b505050506040513d602081101561235357600080fd5b505161235b57fe5b60008686600019810181811061236d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123d257600080fd5b505afa1580156123e6573d6000803e3d6000fd5b505050506040513d60208110156123fc57600080fd5b5051604080516020898102828101820190935289825292935061243e9290918a918a9182918501908490808284376000920191909152508992506139fd915050565b87611856828989600019810181811061245357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b60008082428110156124ff576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b600061252c7f00000000000000000000000000000000000000000000000000000000000000008c8c613462565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561258757600080fd5b505af115801561259b573d6000803e3d6000fd5b505050506040513d60208110156125b157600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156125fe57600080fd5b505af1158015612612573d6000803e3d6000fd5b505050506040513d604081101561262857600080fd5b508051602090910151909250905060006126428e8e613ef4565b509050806001600160a01b03168e6001600160a01b031614612665578183612668565b82825b90975095508a8710156126ac5760405162461bcd60e51b815260040180806020018281038252602281526020018061450d6022913960400191505060405180910390fd5b898610156126eb5760405162461bcd60e51b81526004018080602001828103825260228152602001806144eb6022913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111207f00000000000000000000000000000000000000000000000000000000000000008484613316565b600080600061279d7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613462565b90506000876127ac578c6127b0565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561282657600080fd5b505af115801561283a573d6000803e3d6000fd5b5050505061284c8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128aa576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b6128b88c8c8c8c8c8c613fd2565b909450925060006128ea7f00000000000000000000000000000000000000000000000000000000000000008e8e613462565b90506128f88d338388613522565b6129048c338387613522565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561295c57600080fd5b505af1158015612970573d6000803e3d6000fd5b505050506040513d602081101561298657600080fd5b5051949d939c50939a509198505050505050505050565b600080600083428110156129e6576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b612a148a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fd2565b90945092506000612a667f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613462565b9050612a748b338388613522565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612acf57600080fd5b505af1158015612ae3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612b6857600080fd5b505af1158015612b7c573d6000803e3d6000fd5b505050506040513d6020811015612b9257600080fd5b5051612b9a57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612bf257600080fd5b505af1158015612c06573d6000803e3d6000fd5b505050506040513d6020811015612c1c57600080fd5b5051925034841015612c3457612c343385340361312e565b505096509650969350505050565b60608142811015612c88576040805162461bcd60e51b8152602060048201526014602482015260008051602061452f833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612cbf57fe5b905060200201356001600160a01b03166001600160a01b031614612d18576040805162461bcd60e51b81526020600482015260196024820152600080516020614463833981519152604482015290519081900360640190fd5b612d767f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506138c592505050565b91503482600081518110612d8657fe5b60200260200101511115612dcb5760405162461bcd60e51b81526004018080602001828103825260238152602001806144a46023913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e0757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e3a57600080fd5b505af1158015612e4e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612eb37f00000000000000000000000000000000000000000000000000000000000000008989600081811061169e57fe5b84600081518110612ec057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f1757600080fd5b505af1158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051612f4957fe5b612f888287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061367f915050565b81600081518110612f9557fe5b6020026020010151341115611e6a57611e6a3383600081518110612fb557fe5b6020026020010151340361312e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130415780518252601f199092019160209182019101613022565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130a3576040519150601f19603f3d011682016040523d82523d6000602084013e6130a8565b606091505b50915091508180156130d65750805115806130d657508080602001905160208110156130d357600080fd5b50515b613127576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061317a5780518252601f19909201916020918201910161315b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131dc576040519150601f19603f3d011682016040523d82523d6000602084013e6131e1565b606091505b50509050806132215760405162461bcd60e51b815260040180806020018281038252602381526020018061454f6023913960400191505060405180910390fd5b505050565b60008084116132665760405162461bcd60e51b815260040180806020018281038252602781526020018061441b6027913960400191505060405180910390fd5b6000831180156132765750600082115b6132b15760405162461bcd60e51b81526004018080602001828103825260248152602001806144c76024913960400191505060405180910390fd5b60006132c5856103e663ffffffff61424616565b905060006132d9828563ffffffff61424616565b905060006132ff836132f3886103e863ffffffff61424616565b9063ffffffff6142a916565b905080828161330a57fe5b04979650505050505050565b606060028251101561336f576040805162461bcd60e51b815260206004820152601a60248201527f50697070694c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561338757600080fd5b506040519080825280602002602001820160405280156133b1578160200160208202803683370190505b50905082816000815181106133c257fe5b60200260200101818152505060005b600183510381101561345a57600080613414878685815181106133f057fe5b602002602001015187866001018151811061340757fe5b60200260200101516142f8565b9150915061343684848151811061342757fe5b60200260200101518383613226565b84846001018151811061344557fe5b602090810291909101015250506001016133d1565b509392505050565b60008060006134718585613ef4565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fd805d4c8a7fb3567167020352386905de5d4bd188fe2284675e3ed584653df75609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106135a75780518252601f199092019160209182019101613588565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613609576040519150601f19603f3d011682016040523d82523d6000602084013e61360e565b606091505b509150915081801561363c57508051158061363c575080806020019051602081101561363957600080fd5b50515b6136775760405162461bcd60e51b81526004018080602001828103825260248152602001806145726024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156138bf5760008084838151811061369d57fe5b60200260200101518584600101815181106136b457fe5b60200260200101519150915060006136cc8383613ef4565b50905060008785600101815181106136e057fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461370e57826000613712565b6000835b91509150600060028a51038810613729578861376a565b61376a7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061375d57fe5b6020026020010151613462565b90506137977f00000000000000000000000000000000000000000000000000000000000000008888613462565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156137d4576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561384557818101518382015260200161382d565b50505050905090810190601f1680156138725780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561389457600080fd5b505af11580156138a8573d6000803e3d6000fd5b505060019099019850613682975050505050505050565b50505050565b606060028251101561391e576040805162461bcd60e51b815260206004820152601a60248201527f50697070694c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561393657600080fd5b50604051908082528060200260200182016040528015613960578160200160208202803683370190505b509050828160018351038151811061397457fe5b60209081029190910101528151600019015b801561345a576000806139b6878660018603815181106139a257fe5b602002602001015187868151811061340757fe5b915091506139d88484815181106139c957fe5b60200260200101518383613d58565b8460018503815181106139e757fe5b6020908102919091010152505060001901613986565b60005b600183510381101561322157600080848381518110613a1b57fe5b6020026020010151858460010181518110613a3257fe5b6020026020010151915091506000613a4a8383613ef4565b5090506000613a7a7f00000000000000000000000000000000000000000000000000000000000000008585613462565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613abb57600080fd5b505afa158015613acf573d6000803e3d6000fd5b505050506040513d6060811015613ae557600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613b1b578284613b1e565b83835b91509150613b7c828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561181e57600080fd5b9550613b89868383613226565b945050505050600080856001600160a01b0316886001600160a01b031614613bb357826000613bb7565b6000835b91509150600060028c51038a10613bce578a613c02565b613c027f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061375d57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613c8c578181015183820152602001613c74565b50505050905090810190601f168015613cb95780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613cdb57600080fd5b505af1158015613cef573d6000803e3d6000fd5b50506001909b019a50613a009950505050505050505050565b80820382811115611123576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613d985760405162461bcd60e51b81526004018080602001828103825260288152602001806143f36028913960400191505060405180910390fd5b600083118015613da85750600082115b613de35760405162461bcd60e51b81526004018080602001828103825260248152602001806144c76024913960400191505060405180910390fd5b6000613e076103e8613dfb868863ffffffff61424616565b9063ffffffff61424616565b90506000613e216103e6613dfb868963ffffffff613d0816565b9050613e3e6001828481613e3157fe5b049063ffffffff6142a916565b9695505050505050565b6000808411613e885760405162461bcd60e51b81526004018080602001828103825260218152602001806144836021913960400191505060405180910390fd5b600083118015613e985750600082115b613ed35760405162461bcd60e51b81526004018080602001828103825260248152602001806144c76024913960400191505060405180910390fd5b82613ee4858463ffffffff61424616565b81613eeb57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613f485760405162461bcd60e51b81526004018080602001828103825260218152602001806144426021913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613f68578284613f6b565b83835b90925090506001600160a01b038216613fcb576040805162461bcd60e51b815260206004820152601a60248201527f50697070694c6962726172793a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561404c57600080fd5b505afa158015614060573d6000803e3d6000fd5b505050506040513d602081101561407657600080fd5b50516001600160a01b0316141561412957604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b1580156140fc57600080fd5b505af1158015614110573d6000803e3d6000fd5b505050506040513d602081101561412657600080fd5b50505b6000806141577f00000000000000000000000000000000000000000000000000000000000000008b8b6142f8565b91509150816000148015614169575080155b1561417957879350869250614239565b6000614186898484613e48565b90508781116141d957858110156141ce5760405162461bcd60e51b81526004018080602001828103825260228152602001806144eb6022913960400191505060405180910390fd5b889450925082614237565b60006141e6898486613e48565b9050898111156141f257fe5b878110156142315760405162461bcd60e51b815260040180806020018281038252602281526020018061450d6022913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806142615750508082028282828161425e57fe5b04145b611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611123576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006143078585613ef4565b509050614315868686613462565b50600080614324888888613462565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561435c57600080fd5b505afa158015614370573d6000803e3d6000fd5b505050506040513d606081101561438657600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146143b95780826143bc565b81815b9099909850965050505050505056fe5069707069526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e5450697070694c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5450697070694c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5450697070694c6962726172793a204944454e544943414c5f4144445245535345535069707069526f757465723a20494e56414c49445f504154480000000000000050697070694c6962726172793a20494e53554646494349454e545f414d4f554e545069707069526f757465723a204558434553534956455f494e5055545f414d4f554e5450697070694c6962726172793a20494e53554646494349454e545f4c49515549444954595069707069526f757465723a20494e53554646494349454e545f425f414d4f554e545069707069526f757465723a20494e53554646494349454e545f415f414d4f554e545069707069526f757465723a20455850495245440000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220bb734325152dce84e9d3fccaa81debd45dc6b30ccd5ff5305ddb4914a9b9decf64736f6c63430006060033000000000000000000000000979efe7ca072b72d6388f415d042951ddf13036e0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

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

000000000000000000000000979efe7ca072b72d6388f415d042951ddf13036e0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Decoded View---------------
Arg [0] : _factory (address): 0x979efe7ca072b72d6388f415d042951ddf13036e
Arg [1] : _WETH (address): 0x5545153ccfca01fbd7dd11c0b23ba694d9509a6f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000979efe7ca072b72d6388f415d042951ddf13036e
Arg [1] : 0000000000000000000000005545153ccfca01fbd7dd11c0b23ba694d9509a6f


Deployed ByteCode Sourcemap

16202:18263:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16670:10;-1:-1:-1;;;;;16684:4:0;16670:18;;16663:26;;;;16202:18263;;12:1:-1;9;2:12;20752:673:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;20752:673:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;20752:673:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33425:258;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33425:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33425:258:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27825:834;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27825:834:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27825:834:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27825:834:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27825:834:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27825:834:0;;-1:-1:-1;27825:834:0;-1:-1:-1;;;;;;27825:834: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;27825:834:0;;;;;;;;;;;;;;;;;34213:249;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34213:249:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;34213:249:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;34213:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;34213:249:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;34213:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34213:249:0;;-1:-1:-1;34213:249:0;;-1:-1:-1;;;;;34213:249:0:i;21431:669::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21431:669:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;21431:669:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25098:616::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25098:616:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25098:616:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25098:616:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25098:616:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25098:616:0;;-1:-1:-1;25098:616:0;-1:-1:-1;;;;;;25098:616:0;;;;;;;;:::i;27007:812::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27007:812:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;27007:812:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;27007:812:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;27007:812:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27007:812:0;;-1:-1:-1;27007:812:0;-1:-1:-1;;;;;;27007:812:0;;;;;;;;:::i;23552:710::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23552:710:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;23552:710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30802:706::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30802:706:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;30802:706:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;30802:706:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;30802:706:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;30802:706:0;;-1:-1:-1;30802:706:0;-1:-1:-1;;;;;;30802:706:0;;;;;;;;:::i;32358:831::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32358:831:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;32358:831:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;32358:831:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;32358:831:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32358:831:0;;-1:-1:-1;32358:831:0;-1:-1:-1;;;;;;32358:831:0;;;;;;;;:::i;26320:681::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;26320:681:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26320:681:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26320:681:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;26320:681:0;;-1:-1:-1;26320:681:0;-1:-1:-1;;;;;;26320:681:0;;;;;;;;:::i;33691:257::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33691:257:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33691:257:0;;;;;;;;;;;;:::i;25720:594::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25720:594:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;25720:594:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;25720:594:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;25720:594:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25720:594:0;;-1:-1:-1;25720:594:0;-1:-1:-1;;;;;;25720:594:0;;;;;;;;:::i;16328:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16328:38:0;;;:::i;:::-;;;;-1:-1:-1;;;;;16328:38:0;;;;;;;;;;;;;;33233:184;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33233:184:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33233:184:0;;;;;;;;;;;;:::i;22846:700::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22846:700:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22846:700:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31514:838::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;31514:838:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;31514:838:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;31514:838:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;31514:838:0;;-1:-1:-1;31514:838:0;-1:-1:-1;;;;;;31514:838:0;;;;;;;;:::i;19905:841::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;19905:841:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;19905:841:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16280:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16280:41:0;;;:::i;33956:249::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33956:249:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;33956:249:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;33956:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;33956:249:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33956:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33956:249:0;;-1:-1:-1;33956:249:0;;-1:-1:-1;;;;;33956:249:0:i;22106:661::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;22106:661:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;22106:661:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18160:730::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18160:730:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18160:730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;18896:966;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;;18896:966:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28665:794::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;28665:794:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;28665:794:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;28665:794:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28665:794:0;;-1:-1:-1;28665:794:0;-1:-1:-1;;;;;;28665:794:0;;;;;;;;:::i;20752:673::-;20989:16;21007:14;20970:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;21061:196:::1;21091:5;21111:4;21130:9;21154:14;21183:12;21218:4;21238:8;21061:15;:196::i;:::-;21034:223:::0;;-1:-1:-1;21034:223:0;-1:-1:-1;21268:51:0::1;21296:5:::0;21303:2;21034:223;21268:27:::1;:51::i;:::-;21336:4;-1:-1:-1::0;;;;;21330:20:0::1;;21351:9;21330:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;21330:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;21330:31:0;;;;21372:45;21403:2;21407:9;21372:30;:45::i;:::-;20752:673:::0;;;;;;;;;;:::o;33425:258::-;33578:14;33617:58;33643:8;33653:9;33664:10;33617:25;:58::i;:::-;33610:65;33425:258;-1:-1:-1;;;;33425:258:0:o;27825:834::-;28039:21;28011:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28111:4:0::1;28086:29;:4:::0;;-1:-1:-1;;28091:15:0;;28086:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;28086:21:0::1;-1:-1:-1::0;;;;;28086:29:0::1;;28078:67;;;::::0;;-1:-1:-1;;;28078:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28078:67:0;;;;;;;;;;;;;::::1;;28166:51;28193:7;28202:8;28212:4;;28166:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28166:26:0::1;::::0;-1:-1:-1;;;28166:51:0:i:1;:::-;28156:61;;28267:12;28236:7;28261:1;28244:7;:14;:18;28236:27;;;;;;;;;;;;;;:43;;28228:95;;;;-1:-1:-1::0;;;28228:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28334:137;28380:4;;28385:1;28380:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28380:7:0::1;28389:10;28401:47;28422:7;28431:4;;28436:1;28431:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28431:7:0::1;28440:4;;28445:1;28440:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28440:7:0::1;28401:20;:47::i;:::-;28450:7;28458:1;28450:10;;;;;;;;;;;;;;28334:31;:137::i;:::-;28482:35;28488:7;28497:4;;28482:35;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28511:4:0::1;::::0;-1:-1:-1;28482:5:0::1;::::0;-1:-1:-1;;28482:35:0:i:1;:::-;28534:4;-1:-1:-1::0;;;;;28528:20:0::1;;28549:7;28574:1;28557:7;:14;:18;28549:27;;;;;;;;;;;;;;28528:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;28528:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;28528:49:0;;;;28588:63;28619:2;28623:7;28648:1;28631:7;:14;:18;28623:27;;;;;;;;;;;;;;28588:30;:63::i;:::-;27825:834:::0;;;;;;;;;:::o;34213:249::-;34357:21;34403:51;34429:7;34438:9;34449:4;34403:25;:51::i;:::-;34396:58;;34213:249;;;;;:::o;21431:669::-;21737:12;21751;21776;21791:45;21812:7;21821:6;21829;21791:20;:45::i;:::-;21776:60;;21847:10;21860;:33;;21884:9;21860:33;;;-1:-1:-1;;21860:33:0;21904:76;;;-1:-1:-1;;;21904:76:0;;21928:10;21904:76;;;;21948:4;21904:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21847:46;;-1:-1:-1;;;;;;21904:23:0;;;;;:76;;;;;-1:-1:-1;;21904:76:0;;;;;;;;-1:-1:-1;21904:23:0;:76;;;2:2:-1;;;;27:1;24;17:12;2:2;21904:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21904:76:0;;;;22012:80;22028:6;22036;22044:9;22055:10;22067;22079:2;22083:8;22012:15;:80::i;:::-;21991:101;;;;;;;;21431:669;;;;;;;;;;;;;;;;:::o;25098:616::-;25322:21;25303:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;25366:51:::1;25393:7;25402:8;25412:4;;25366:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25366:26:0::1;::::0;-1:-1:-1;;;25366:51:0:i:1;:::-;25356:61;;25467:12;25436:7;25461:1;25444:7;:14;:18;25436:27;;;;;;;;;;;;;;:43;;25428:95;;;;-1:-1:-1::0;;;25428:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25534:137;25580:4;;25585:1;25580:7;;;;;;25534:137;25682:24;25688:7;25697:4;;25682:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25703:2:0;;-1:-1:-1;25682:5:0::1;::::0;-1:-1:-1;;25682:24:0:i:1;27007:812::-:0;27221:21;27193:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27293:4:0::1;27268:29;:4:::0;;-1:-1:-1;;27273:15:0;;27268:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;27268:21:0::1;-1:-1:-1::0;;;;;27268:29:0::1;;27260:67;;;::::0;;-1:-1:-1;;;27260:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;27260:67:0;;;;;;;;;;;;;::::1;;27348:51;27374:7;27383:9;27394:4;;27348:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;27348:25:0::1;::::0;-1:-1:-1;;;27348:51:0:i:1;:::-;27338:61;;27432:11;27418:7;27426:1;27418:10;;;;;;;;;;;;;;:25;;27410:73;;;;-1:-1:-1::0;;;27410:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23552:710:::0;23870:14;23897:12;23912:42;23933:7;23942:5;23949:4;23912:20;:42::i;:::-;23897:57;;23965:10;23978;:33;;24002:9;23978:33;;;-1:-1:-1;;23978:33:0;24022:76;;;-1:-1:-1;;;24022:76:0;;24046:10;24022:76;;;;24066:4;24022:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23965:46;;-1:-1:-1;;;;;;24022:23:0;;;;;:76;;;;;-1:-1:-1;;24022:76:0;;;;;;;;-1:-1:-1;24022:23:0;:76;;;2:2:-1;;;;27:1;24;17:12;2:2;24022:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24022:76:0;;;;24121:133;24183:5;24190:9;24201:14;24217:12;24231:2;24235:8;24121:47;:133::i;:::-;24109:145;23552:710;-1:-1:-1;;;;;;;;;;;;;23552:710:0:o;30802:706::-;31036:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;31057:135:::1;31103:4;;31108:1;31103:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31103:7:0::1;31112:10;31124:47;31145:7;31154:4;;31159:1;31154:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31154:7:0::1;31163:4;;31168:1;31163:7;;;;;;31124:47;31173:8;31057:31;:135::i;:::-;31203:18;31231:4:::0;;-1:-1:-1;;31236:15:0;;31231:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31231:21:0::1;-1:-1:-1::0;;;;;31224:39:0::1;;31264:2;31224:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31224:43:0::1;-1:-1:-1::0;;;;;31224:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31224:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31224:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31224:43:0;31278:44:::1;::::0;;31224:43:::1;31278:44:::0;;::::1;::::0;;;;;;;;;;;31224:43;;-1:-1:-1;31278:44:0::1;::::0;;;31313:4;;;;;;31278:44;::::1;::::0;31313:4;;31278:44;31313:4;31278:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;31319:2:0;;-1:-1:-1;31278:34:0::1;::::0;-1:-1:-1;;31278:44:0:i:1;:::-;31421:12:::0;31355:62:::1;31403:13:::0;31362:4;;-1:-1:-1;;31367:15:0;;31362:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;31362:21:0::1;-1:-1:-1::0;;;;;31355:39:0::1;;31395:2;31355:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;31355:43:0::1;-1:-1:-1::0;;;;;31355:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31355:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31355:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31355:43:0;;:62:::1;:47;:62;:::i;:::-;:78;;31333:167;;;;-1:-1:-1::0;;;31333:167:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:1;30802:706:::0;;;;;;;:::o;32358:831::-;32625:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32684:4:0::1;32659:29;:4:::0;;-1:-1:-1;;32664:15:0;;32659:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32659:21:0::1;-1:-1:-1::0;;;;;32659:29:0::1;;32651:67;;;::::0;;-1:-1:-1;;;32651:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;32651:67:0;;;;;;;;;;;;;::::1;;32729:135;32775:4;;32780:1;32775:7;;;;;;32729:135;32875:55;32910:4;;32875:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32924:4:0::1;::::0;-1:-1:-1;32875:34:0::1;::::0;-1:-1:-1;;32875:55:0:i:1;:::-;32958:37;::::0;;-1:-1:-1;;;32958:37:0;;32989:4:::1;32958:37;::::0;::::1;::::0;;;32941:14:::1;::::0;-1:-1:-1;;;;;32965:4:0::1;32958:22;::::0;::::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:22;:37;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;32958:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32958:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32958:37:0;;-1:-1:-1;33014:25:0;;::::1;;33006:77;;;;-1:-1:-1::0;;;33006:77:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33100:4;-1:-1:-1::0;;;;;33094:20:0::1;;33115:9;33094:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;33094:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;33094:31:0;;;;33136:45;33167:2;33171:9;33136:30;:45::i;26320:681::-:0;26536:21;26508:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;26594:4:::1;-1:-1:-1::0;;;;;26583:15:0::1;:4;;26588:1;26583:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;26583:7:0::1;-1:-1:-1::0;;;;;26583:15:0::1;;26575:53;;;::::0;;-1:-1:-1;;;26575:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;26575:53:0;;;;;;;;;;;;;::::1;;26649:52;26676:7;26685:9;26696:4;;26649:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26649:26:0::1;::::0;-1:-1:-1;;;26649:52:0:i:1;:::-;26639:62;;26751:12;26720:7;26745:1;26728:7;:14;:18;26720:27;;;;;;;;;;;;;;:43;;26712:95;;;;-1:-1:-1::0;;;26712:95:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26824:4;-1:-1:-1::0;;;;;26818:19:0::1;;26845:7;26853:1;26845:10;;;;;;;;;;;;;;26818:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26818:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26818:40:0;;;;;26882:4;-1:-1:-1::0;;;;;26876:20:0::1;;26897:47;26918:7;26927:4;;26932:1;26927:7;;;;;;26897:47;26946:7;26954:1;26946:10;;;;;;;;;;;;;;26876:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;26876:81:0::1;-1:-1:-1::0;;;;;26876:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26876:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26876:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26876:81:0;26869:89:::1;;;;26969:24;26975:7;26984:4;;26969:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;26990:2:0;;-1:-1:-1;26969:5:0::1;::::0;-1:-1:-1;;26969:24:0:i:1;:::-;26320:681:::0;;;;;;;;:::o;33691:257::-;33844:13;33882:58;33907:9;33918;33929:10;33882:24;:58::i;25720:594::-;25944:21;25925:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;25988:51:::1;26014:7;26023:9;26034:4;;25988:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;25988:25:0::1;::::0;-1:-1:-1;;;25988:51:0:i:1;:::-;25978:61;;26072:11;26058:7;26066:1;26058:10;;;;;;;;;;;;;;:25;;26050:73;;;;-1:-1:-1::0;;;26050:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16328:38:::0;;;:::o;33233:184::-;33330:12;33362:47;33381:7;33390:8;33400;33362:18;:47::i;22846:700::-;23112:14;23093:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;23155:196:::1;23185:5;23205:4;23224:9;23248:14;23277:12;23312:4;23332:8;23155:15;:196::i;:::-;23401:38;::::0;;-1:-1:-1;;;23401:38:0;;23433:4:::1;23401:38;::::0;::::1;::::0;;;23139:212;;-1:-1:-1;23362:78:0::1;::::0;-1:-1:-1;23390:5:0;;23397:2;;-1:-1:-1;;;;;23401: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;23401:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23401:38:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;23401:38:0;23362:27:::1;:78::i;:::-;23457:4;-1:-1:-1::0;;;;;23451:20:0::1;;23472:9;23451:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;23451:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;23451:31:0;;;;23493:45;23524:2;23528:9;23493:30;:45::i;31514:838::-:0;31774:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;31819:4:::1;-1:-1:-1::0;;;;;31808:15:0::1;:4;;31813:1;31808:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;31808:7:0::1;-1:-1:-1::0;;;;;31808:15:0::1;;31800:53;;;::::0;;-1:-1:-1;;;31800:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;31800:53:0;;;;;;;;;;;;;::::1;;31864:13;31880:9;31864:25;;31906:4;-1:-1:-1::0;;;;;31900:19:0::1;;31927:8;31900:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31900:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31900:38:0;;;;;31962:4;-1:-1:-1::0;;;;;31956:20:0::1;;31977:47;31998:7;32007:4;;32012:1;32007:7;;;;;;31977:47;32026:8;31956:79;;;;;;;;;;;;;-1:-1:-1::0;;;;;31956:79:0::1;-1:-1:-1::0;;;;;31956:79:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;31956:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;31956:79:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;31956:79:0;31949:87:::1;;;;32047:18;32075:4:::0;;-1:-1:-1;;32080:15:0;;32075:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32075:21:0::1;-1:-1:-1::0;;;;;32068:39:0::1;;32108:2;32068:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32068:43:0::1;-1:-1:-1::0;;;;;32068:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;32068:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;32068:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;32068:43:0;32122:44:::1;::::0;;32068:43:::1;32122:44:::0;;::::1;::::0;;;;;;;;;;;32068:43;;-1:-1:-1;32122:44:0::1;::::0;;;32157:4;;;;;;32122:44;::::1;::::0;32157:4;;32122:44;32157:4;32122:44;1:33:-1::1;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;32163:2:0;;-1:-1:-1;32122:34:0::1;::::0;-1:-1:-1;;32122:44:0:i:1;:::-;32265:12:::0;32199:62:::1;32247:13:::0;32206:4;;-1:-1:-1;;32211:15:0;;32206:21;;::::1;;;;;;;;;;;-1:-1:-1::0;;;;;32206:21:0::1;-1:-1:-1::0;;;;;32199:39:0::1;;32239:2;32199:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;32199:43:0::1;-1:-1:-1::0;;;;;32199:43:0::1;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;19905:841:0::0;20159:12;20173;20140:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;20198:12:::1;20213:45;20234:7;20243:6;20251;20213:20;:45::i;:::-;20269:58;::::0;;-1:-1:-1;;;20269:58:0;;20299:10:::1;20269:58;::::0;::::1;::::0;-1:-1:-1;;;;;20269:29:0;::::1;:58:::0;;;;;;;;;;;;;;20198:60;;-1:-1:-1;20269:29:0;;::::1;::::0;:58;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;20269:29:0;:58;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20269:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20269:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;20395:25:0::1;::::0;;-1:-1:-1;;;20395:25:0;;-1:-1:-1;;;;;20395:25:0;;::::1;;::::0;::::1;::::0;;;20365:12:::1;::::0;;;20395:21;;::::1;::::0;::::1;::::0;:25;;;;;;;;;;;20365:12;20395:21;:25;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;20395:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;20395:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;20395:25:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20395:25:0;-1:-1:-1;20432:14:0::1;20451:39;20475:6:::0;20483;20451:23:::1;:39::i;:::-;20431:59;;;20532:6;-1:-1:-1::0;;;;;20522:16:0::1;:6;-1:-1:-1::0;;;;;20522:16:0::1;;:58;;20563:7;20572;20522:58;;;20542:7;20551;20522:58;20501:79:::0;;-1:-1:-1;20501:79:0;-1:-1:-1;20599:21:0;;::::1;;20591:68;;;;-1:-1:-1::0;;;20591:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20689:10;20678:7;:21;;20670:68;;;;-1:-1:-1::0;;;20670:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16488:1;;;;19905:841:::0;;;;;;;;;;;:::o;16280:41::-;;;:::o;33956:249::-;34100:21;34146:51;34173:7;34182:8;34192:4;34146:26;:51::i;22106:661::-;22395:16;22413:14;22440:12;22455:42;22476:7;22485:5;22492:4;22455:20;:42::i;:::-;22440:57;;22508:10;22521;:33;;22545:9;22521:33;;;-1:-1:-1;;22521:33:0;22565:76;;;-1:-1:-1;;;22565:76:0;;22589:10;22565:76;;;;22609:4;22565:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22508:46;;-1:-1:-1;;;;;;22565:23:0;;;;;:76;;;;;-1:-1:-1;;22565:76:0;;;;;;;;-1:-1:-1;22565:23:0;:76;;;2:2:-1;;;;27:1;24;17:12;2:2;22565:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22565:76:0;;;;22679:80;22698:5;22705:9;22716:14;22732:12;22746:2;22750:8;22679:18;:80::i;:::-;22652:107;;;;-1:-1:-1;22106:661:0;-1:-1:-1;;;;;;;;;;;;;22106:661:0:o;18160:730::-;18448:12;18462;18476:14;18429:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;18524:85:::1;18538:6;18546;18554:14;18570;18586:10;18598;18524:13;:85::i;:::-;18503:106:::0;;-1:-1:-1;18503:106:0;-1:-1:-1;18620:12:0::1;18635:45;18656:7;18665:6:::0;18673;18635:20:::1;:45::i;:::-;18620:60;;18691:66;18723:6;18731:10;18743:4;18749:7;18691:31;:66::i;:::-;18768;18800:6;18808:10;18820:4;18826:7;18768:31;:66::i;:::-;18868:4;-1:-1:-1::0;;;;;18857:21:0::1;;18879:2;18857:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;18857:25:0::1;-1:-1:-1::0;;;;;18857:25:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;18857:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;18857:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;18857:25:0;18160:730;;;;-1:-1:-1;18857:25:0;;-1:-1:-1;18160:730:0;;-1:-1:-1;;;;;;;;;18160:730:0:o;18896:966::-;19149:16;19167:14;19183;19130:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;19237:176:::1;19265:5;19285:4;19304:18;19337:9;19361:14;19390:12;19237:13;:176::i;:::-;19210:203:::0;;-1:-1:-1;19210:203:0;-1:-1:-1;19424:12:0::1;19439:42;19460:7;19469:5:::0;19476:4:::1;19439:20;:42::i;:::-;19424:57;;19492:69;19524:5;19531:10;19543:4;19549:11;19492:31;:69::i;:::-;19578:4;-1:-1:-1::0;;;;;19572:19:0::1;;19599:9;19572:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19572:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19572:39:0;;;;;19635:4;-1:-1:-1::0;;;;;19629:20:0::1;;19650:4;19656:9;19629:37;;;;;;;;;;;;;-1:-1:-1::0;;;;;19629:37:0::1;-1:-1:-1::0;;;;;19629:37:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19629:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19629:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19629:37:0;19622:45:::1;;;;19701:4;-1:-1:-1::0;;;;;19690:21:0::1;;19712:2;19690:25;;;;;;;;;;;;;-1:-1:-1::0;;;;;19690:25:0::1;-1:-1:-1::0;;;;;19690:25:0::1;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;19690:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;19690:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;19690:25:0;;-1:-1:-1;19766:9:0::1;:21:::0;-1:-1:-1;19762:92:0::1;;;19789:65;19820:10;19844:9;19832;:21;19789:30;:65::i;:::-;16488:1;18896:966:::0;;;;;;;;;;;:::o;28665:794::-;28878:21;28850:8;16437:15;16425:8;:27;;16417:60;;;;;-1:-1:-1;;;16417:60:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16417:60:0;;;;;;;;;;;;;;;28936:4:::1;-1:-1:-1::0;;;;;28925:15:0::1;:4;;28930:1;28925:7;;;;;;;;;;;;;-1:-1:-1::0;;;;;28925:7:0::1;-1:-1:-1::0;;;;;28925:15:0::1;;28917:53;;;::::0;;-1:-1:-1;;;28917:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;28917:53:0;;;;;;;;;;;;;::::1;;28991:51;29017:7;29026:9;29037:4;;28991:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;28991:25:0::1;::::0;-1:-1:-1;;;28991:51:0:i:1;:::-;28981:61;;29075:9;29061:7;29069:1;29061:10;;;;;;;;;;;;;;:23;;29053:71;;;;-1:-1:-1::0;;;29053:71:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29141:4;-1:-1:-1::0;;;;;29135:19:0::1;;29162:7;29170:1;29162:10;;;;;;;;;;;;;;29135:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29135:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29135:40:0;;;;;29199:4;-1:-1:-1::0;;;;;29193:20:0::1;;29214:47;29235:7;29244:4;;29249:1;29244:7;;;;;;29214:47;29263:7;29271:1;29263:10;;;;;;;;;;;;;;29193:81;;;;;;;;;;;;;-1:-1:-1::0;;;;;29193:81:0::1;-1:-1:-1::0;;;;;29193:81:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;29193:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;29193:81:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;29193:81:0;29186:89:::1;;;;29286:24;29292:7;29301:4;;29286:24;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;29307:2:0;;-1:-1:-1;29286:5:0::1;::::0;-1:-1:-1;;29286:24:0:i:1;:::-;29373:7;29381:1;29373:10;;;;;;;;;;;;;;29361:9;:22;29357:94;;;29385:66;29416:10;29440:7;29448:1;29440:10;;;;;;;;;;;;;;29428:9;:22;29385:30;:66::i;1344:361::-:0;1539:45;;;-1:-1:-1;;;;;1539:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1539:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1528:57:0;;;;1493:12;;1507:17;;1528:10;;;;1539:45;1528:57;;;25:18:-1;1528: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;;;1528: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;;1492:93:0;;;;1604:7;:57;;;;-1:-1:-1;1616:11:0;;:16;;:44;;;1647:4;1636:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1636:24:0;1616:44;1596:101;;;;;-1:-1:-1;;;1596:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1344:361;;;;;:::o;2123:195::-;2231:12;;;2193;2231;;;;;;;;;-1:-1:-1;;;;;2210:7:0;;;2224:5;;2210: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;;;2210: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;;2192:52:0;;;2263:7;2255:55;;;;-1:-1:-1;;;2255:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2123:195;;;:::o;12690:509::-;12783:14;12829:1;12818:8;:12;12810:64;;;;-1:-1:-1;;;12810:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12905:1;12893:9;:13;:31;;;;;12923:1;12910:10;:14;12893:31;12885:80;;;;-1:-1:-1;;;12885:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12976:20;12999:17;:8;13012:3;12999:17;:12;:17;:::i;:::-;12976:40;-1:-1:-1;13027:14:0;13044:31;12976:40;13064:10;13044:31;:19;:31;:::i;:::-;13027:48;-1:-1:-1;13086:16:0;13105:40;13129:15;13105:19;:9;13119:4;13105:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;13086:59;;13180:11;13168:9;:23;;;;;;;12690:509;-1:-1:-1;;;;;;;12690:509:0:o;13866:507::-;13967:21;14024:1;14009:4;:11;:16;;14001:55;;;;;-1:-1:-1;;;14001:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14088:4;:11;14077:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14077:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14077:23:0;;14067:33;;14124:8;14111:7;14119:1;14111:10;;;;;;;;;;;;;:21;;;;;14148:6;14143:223;14174:1;14160:4;:11;:15;14156:1;:19;14143:223;;;14198:14;14214:15;14233:42;14245:7;14254:4;14259:1;14254:7;;;;;;;;;;;;;;14263:4;14268:1;14272;14268:5;14263:11;;;;;;;;;;;;;;14233;:42::i;:::-;14197:78;;;;14307:47;14320:7;14328:1;14320:10;;;;;;;;;;;;;;14332:9;14343:10;14307:12;:47::i;:::-;14290:7;14298:1;14302;14298:5;14290:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14177:3:0;;14143:223;;;;13866:507;;;;;:::o;11176:478::-;11265:12;11291:14;11307;11325:26;11336:6;11344;11325:10;:26::i;:::-;11489:32;;;-1:-1:-1;;11489:32:0;;;;;;;;;;;;;;;;;;;;;;;;;22::-1;26:21;;;22:32;6:49;;11489:32:0;;;;;11479:43;;;;;;-1:-1:-1;;;;;;11392:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11392:251:0;;;;;;;11382:262;;;;;;;;;11176:478;-1:-1:-1;;;;;11176:478:0:o;1713:402::-;1938:51;;;-1:-1:-1;;;;;1938:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1938:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1927:63:0;;;;1892:12;;1906:17;;1927:10;;;;1938:51;1927:63;;;25:18:-1;1927: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;;;1927: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;;1891:99:0;;;;2009:7;:57;;;;-1:-1:-1;2021:11:0;;:16;;:44;;;2052:4;2041:24;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2041:24:0;2021:44;2001:106;;;;-1:-1:-1;;;2001:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1713:402;;;;;;:::o;24373:719::-;24480:6;24475:610;24506:1;24492:4;:11;:15;24488:1;:19;24475:610;;;24530:13;24545:14;24564:4;24569:1;24564:7;;;;;;;;;;;;;;24573:4;24578:1;24582;24578:5;24573:11;;;;;;;;;;;;;;24529:56;;;;24601:14;24620:38;24644:5;24651:6;24620:23;:38::i;:::-;24600:58;;;24673:14;24690:7;24698:1;24702;24698:5;24690:14;;;;;;;;;;;;;;24673:31;;24720:15;24737;24765:6;-1:-1:-1;;;;;24756:15:0;:5;-1:-1:-1;;;;;24756:15:0;;:61;;24798:9;24814:1;24756:61;;;24780:1;24784:9;24756:61;24719:98;;;;24832:10;24863:1;24849:4;:11;:15;24845:1;:19;:78;;24920:3;24845:78;;;24867:50;24888:7;24897:6;24905:4;24910:1;24914;24910:5;24905:11;;;;;;;;;;;;;;24867:20;:50::i;:::-;24832:91;;24949:44;24970:7;24979:5;24986:6;24949:20;:44::i;:::-;-1:-1:-1;;;;;24938:61:0;;25018:10;25030;25042:2;25056:1;25046:12;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;25046:12:0;87:42:-1;143:17;;-1:-1;25046:12:0;;24938:135;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24938:135:0;-1:-1:-1;;;;;24938:135: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;24938:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;24938:135:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24509:3:0;;;;;-1:-1:-1;24475:610:0;;-1:-1:-1;;;;;;;;24475:610:0;;;24373:719;;;:::o;14454:528::-;14555:21;14612:1;14597:4;:11;:16;;14589:55;;;;;-1:-1:-1;;;14589:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14676:4;:11;14665:23;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14665:23:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;14665:23:0;;14655:33;;14729:9;14699:7;14724:1;14707:7;:14;:18;14699:27;;;;;;;;;;;;;;;;;:39;14763:11;;-1:-1:-1;;14763:15:0;14749:226;14780:5;;14749:226;;14808:14;14824:15;14843:42;14855:7;14864:4;14873:1;14869;:5;14864:11;;;;;;;;;;;;;;14877:4;14882:1;14877:7;;;;;;;14843:42;14807:78;;;;14917:46;14929:7;14937:1;14929:10;;;;;;;;;;;;;;14941:9;14952:10;14917:11;:46::i;:::-;14900:7;14912:1;14908;:5;14900:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;;;14787:3:0;14749:226;;29606:1190;29719:6;29714:1075;29745:1;29731:4;:11;:15;29727:1;:19;29714:1075;;;29769:13;29784:14;29803:4;29808:1;29803:7;;;;;;;;;;;;;;29812:4;29817:1;29821;29817:5;29812:11;;;;;;;;;;;;;;29768:56;;;;29840:14;29859:38;29883:5;29890:6;29859:23;:38::i;:::-;29839:58;;;29912:15;29941:44;29962:7;29971:5;29978:6;29941:20;:44::i;:::-;29912:74;;30001:16;30032:17;30120:13;30135;30153:4;-1:-1:-1;;;;;30153:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30153:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30153:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30153:18:0;;;;;;;-1:-1:-1;;;;;30119:52:0;;;;-1:-1:-1;30119:52:0;;-1:-1:-1;30187:17:0;;-1:-1:-1;;;;;30228:15:0;;;;;;;:61;;30270:8;30280;30228:61;;;30247:8;30257;30228:61;30186:103;;;;30318:56;30361:12;30325:5;-1:-1:-1;;;;;30318:23:0;;30350:4;30318:38;;;;;;;;;;;;;-1:-1:-1;;;;;30318:38:0;-1:-1:-1;;;;;30318:38:0;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;30318:56:0;30304:70;;30404:67;30430:11;30443:12;30457:13;30404:25;:67::i;:::-;30389:82;;29714:1075;;;;30502:15;30519;30547:6;-1:-1:-1;;;;;30538:15:0;:5;-1:-1:-1;;;;;30538:15:0;;:67;;30583:12;30602:1;30538:67;;;30562:1;30566:12;30538:67;30501:104;;;;30620:10;30651:1;30637:4;:11;:15;30633:1;:19;:78;;30708:3;30633:78;;;30655:50;30676:7;30685:6;30693:4;30698:1;30702;30698:5;30693:11;;;;;;;30655:50;30764:12;;;30774:1;30764:12;;;;;;;;;;-1:-1:-1;;;30726:51:0;;;;;;;;;;;;;;-1:-1:-1;;;;;30726:51:0;;;;;;;;;;;;;;;;;;;;;;30620:91;;-1:-1:-1;30726:9:0;;;;;;30736:10;;30748;;30620:91;;30764:12;;30726:51;;;;;;;;30764:12;;30726:51;;;;30764: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;30726:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30726:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29748:3:0;;;;;-1:-1:-1;29714:1075:0;;-1:-1:-1;;;;;;;;;;29714:1075:0;10215:129;10299:5;;;10294:16;;;;10286:50;;;;;-1:-1:-1;;;10286:50:0;;;;;;;;;;;;-1:-1:-1;;;10286:50:0;;;;;;;;;;;;;;13320:464;13413:13;13459:1;13447:9;:13;13439:66;;;;-1:-1:-1;;;13439:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13536:1;13524:9;:13;:31;;;;;13554:1;13541:10;:14;13524:31;13516:80;;;;-1:-1:-1;;;13516:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13607:14;13624:34;13653:4;13624:24;:9;13638;13624:24;:13;:24;:::i;:::-;:28;:34;:28;:34;:::i;:::-;13607:51;-1:-1:-1;13669:16:0;13688:34;13718:3;13688:25;:10;13703:9;13688:25;:14;:25;:::i;:34::-;13669:53;;13744:32;13774:1;13757:11;13745:9;:23;;;;;;;13744:32;:29;:32;:::i;:::-;13733:43;13320:464;-1:-1:-1;;;;;;13320:464:0:o;12255:313::-;12337:12;12380:1;12370:7;:11;12362:57;;;;-1:-1:-1;;;12362:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12449:1;12438:8;:12;:28;;;;;12465:1;12454:8;:12;12438:28;12430:77;;;;-1:-1:-1;;;12430:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12552:8;12528:21;:7;12540:8;12528:21;:11;:21;:::i;:::-;:32;;;;;;;12255:313;-1:-1:-1;;;;12255:313:0:o;10743:341::-;10818:14;10834;10879:6;-1:-1:-1;;;;;10869:16:0;:6;-1:-1:-1;;;;;10869:16:0;;;10861:62;;;;-1:-1:-1;;;10861:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10962:6;-1:-1:-1;;;;;10953:15:0;:6;-1:-1:-1;;;;;10953:15:0;;:53;;10991:6;10999;10953:53;;;10972:6;10980;10953:53;10934:72;;-1:-1:-1;10934:72:0;-1:-1:-1;;;;;;11025:20:0;;11017:59;;;;;-1:-1:-1;;;11017:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10743:341;;;;;:::o;16792:1362::-;17105:46;;;-1:-1:-1;;;17105:46:0;;-1:-1:-1;;;;;17105:46:0;;;;;;;;;;;;;;;;17010:12;;;;;;17119:7;17105:30;;;;;;:46;;;;;;;;;;;;;;;:30;:46;;;2:2:-1;;;;27:1;24;17:12;2:2;17105:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17105:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17105:46:0;-1:-1:-1;;;;;17105:60:0;;17101:142;;;17182:49;;;-1:-1:-1;;;17182:49:0;;-1:-1:-1;;;;;17182:49:0;;;;;;;;;;;;;;;;17196:7;17182:33;;;;;;:49;;;;;;;;;;;;;;;-1:-1:-1;17182:33:0;:49;;;2:2:-1;;;;27:1;24;17:12;2:2;17182:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17182:49:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;17101:142:0;17254:13;17269;17286:49;17311:7;17320:6;17328;17286:24;:49::i;:::-;17253:82;;;;17350:8;17362:1;17350:13;:30;;;;-1:-1:-1;17367:13:0;;17350:30;17346:801;;;17419:14;;-1:-1:-1;17435:14:0;;-1:-1:-1;17346:801:0;;;17483:19;17505:54;17524:14;17540:8;17550;17505:18;:54::i;:::-;17483:76;;17596:14;17578;:32;17574:562;;17657:10;17639:14;:28;;17631:75;;;;-1:-1:-1;;;17631:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17747:14;;-1:-1:-1;17763:14:0;-1:-1:-1;17763:14:0;17574:562;;;17819:19;17841:54;17860:14;17876:8;17886;17841:18;:54::i;:::-;17819:76;;17939:14;17921;:32;;17914:40;;;;17999:10;17981:14;:28;;17973:75;;;;-1:-1:-1;;;17973:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18089:14;-1:-1:-1;18105:14:0;;-1:-1:-1;17574:562:0;17346:801;;16792:1362;;;;;;;;;;;:::o;10352:142::-;10404:6;10431;;;:30;;-1:-1:-1;;10446:5:0;;;10460:1;10455;10446:5;10455:1;10441:15;;;;;:20;10431:30;10423:63;;;;;-1:-1:-1;;;10423:63:0;;;;;;;;;;;;-1:-1:-1;;;10423:63:0;;;;;;;;;;;;;;10079:128;10163:5;;;10158:16;;;;10150:49;;;;;-1:-1:-1;;;10150:49:0;;;;;;;;;;;;-1:-1:-1;;;10150:49:0;;;;;;;;;;;;;;11712:430;11805:13;11820;11847:14;11866:26;11877:6;11885;11866:10;:26::i;:::-;11846:46;;;11903:32;11911:7;11920:6;11928;11903:7;:32::i;:::-;;11947:13;11962;11991:32;11999:7;12008:6;12016;11991:7;:32::i;:::-;-1:-1:-1;;;;;11980:56:0;;:58;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11980:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11980:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11980:58:0;;;;;;;-1:-1:-1;;;;;11946:92:0;;;;-1:-1:-1;11946:92:0;;-1:-1:-1;;;;;;12072:16:0;;;;;;;:62;;12115:8;12125;12072:62;;;12092:8;12102;12072:62;12049:85;;;;-1:-1:-1;11712:430:0;-1:-1:-1;;;;;;;11712:430:0:o

Swarm Source

ipfs://bb734325152dce84e9d3fccaa81debd45dc6b30ccd5ff5305ddb4914a9b9decf
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading