Contract 0x3271cc175577465691e48196955e09d638fa05d5 5

Contract Overview

Impermax: Router
Balance:
0 MOVR

MOVR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x40f88ffa1572f3bfb600c80fe302cb7c03ebd85db64e9c274a036d45fd54ef88Redeem ETH30691162022-11-26 11:48:2427 mins ago0xe19895230c2ae34375a83cb1f07f8cf607ed917c IN  Impermax: Router0 MOVR0.000187892
0x0124efc42455f921a4a7fbc7abed9855a732ac7bab69aa11990088eb35507920Mint ETH30690982022-11-26 11:44:4230 mins ago0xe19895230c2ae34375a83cb1f07f8cf607ed917c IN  Impermax: Router0.009708 MOVR0.000139921
0x3d42746ebe71646ab75284d8fab3c12e75ed37783d1bc25ee4469c33b7f91220Deleverage30368412022-11-21 18:53:184 days 17 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000970238
0x6db640f975cf456c7aad1e937eec4585fb2cf92f5f143929329735f64266359cRedeem30368332022-11-21 18:51:304 days 17 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000039785
0x0617365ad9f0887c8e43eaf1067c68133ef62ca58553b62448811f27917b1346Redeem30368312022-11-21 18:51:004 days 17 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000738739
0xe7e6200dbeaab0f43b6e82f3f76af62dbd15dc408333aaac317ab5579d39e41eRedeem30368192022-11-21 18:48:304 days 17 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000764028
0xd08dea85dbeb9870c929327325f1b26e8a44315ed03eff88dbb88a1035c2d9f7Redeem30364252022-11-21 17:23:184 days 18 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000798336
0x352288e8359cf072308f26dbd1bfe4ba6424b62230610023eccc07b9c53f62b4Redeem30292712022-11-20 16:14:305 days 20 hrs ago0x26cb1dbad7349b57af814a22718d04d0fcdfbeb1 IN  Impermax: Router0 MOVR0.00030297778
0x2ecbeaec69e5209ec87541a7facc8b850646b5011b70ce89bf5b284055b4b3a1Repay ETH30292642022-11-20 16:13:065 days 20 hrs ago0x26cb1dbad7349b57af814a22718d04d0fcdfbeb1 IN  Impermax: Router0.288688 MOVR0.00019639854
0xb38bcdeeffc75b8f496b58d0b4cc97ea88172afc0d6c910ce70b4e566d8c93f8Leverage29230652022-11-05 5:33:3621 days 6 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000823245
0xc09a4fdc1b8e0a33e2a56a7695e8b7bd02e4508e6d63e6e3cdc1d98b0005ee72Redeem ETH29022452022-11-02 5:16:1224 days 6 hrs ago0x16d1663a00d4d1a216e0baa84b0abc69ba35c156 IN  Impermax: Router0 MOVR0.000167752
0xcd6ed3ce87426dd2f770f79cda8992aaffdc11a54829fb44f3db6d69b8ac76b3Mint Collateral28986642022-11-01 16:48:4824 days 19 hrs ago0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f IN  Impermax: Router0 MOVR0.000635005
0x4fc336afd5fb219abbbad554b7fb9ac9c9c015c5d7b8500c8030e5d2e86b658cDeleverage28801062022-10-30 0:44:4827 days 11 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000608135
0xa448b4ee9dd362f48b596fc77fe0edfda09a5a03e1782a709533639855ad76f6Deleverage28801012022-10-30 0:43:4827 days 11 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000664777
0x77f6fd16f5005478bd26df8b78d726f2a482f2f2eef74a1492ea9aa05e329858Deleverage28800992022-10-30 0:43:2427 days 11 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000632808
0xbaeacaee8cf2b45e217e97cee75750f98cd0da55252504f1c0e2411578a667c3Deleverage28800612022-10-30 0:35:3627 days 11 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN  Impermax: Router0 MOVR0.000650947
0x9ce0c752e4868bd9bad71b48482ab1faf37a1f96cbf2c2942fe4f035d8e045cfDeleverage28800572022-10-30 0:34:4827 days 11 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN  Impermax: Router0 MOVR0.000610269
0xc96acc1771add12a74b2811ce083e094c645fa0f83912a6a39ae8f2e37044c92Deleverage28800432022-10-30 0:32:0027 days 11 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN  Impermax: Router0 MOVR0.000587657
0xe658e56055d7fd34a5622ea673b5918ea4c80c0594a80ee2f4ac62e2dc26304dDeleverage28800372022-10-30 0:30:4227 days 11 hrs ago0x9bdbdb4a8f7f816c87a67f5281484ed902c6b942 IN  Impermax: Router0 MOVR0.000596898
0x30bdc3708d68d08ec8240c5749858a1e318b559bbbce37de817bf1a7cc72bd90Leverage28757592022-10-29 9:41:4828 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000862926
0xf6ab2a2c3da56d347c0d53fbd466110dc354143f218e140e29395db571c9e38aLeverage28757572022-10-29 9:41:2428 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000797183
0xebafc36f24e4fc3409f6fc60d366c6f8d8aa35932a1e336422d77b044746e644Leverage28757542022-10-29 9:40:4828 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000802978
0xbf15c572743287ebd90803d9bdc5df8e1dd9aa85f4e272ffa1cce06c252918b3Mint Collateral28757522022-10-29 9:40:2428 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000266266
0x4de1a6401841250872e5f2d0649e4eeb803accfa2c6e2939c2462ddf21a170b3Mint Collateral28757502022-10-29 9:40:0028 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000213093
0x806c992d9d9d2b874e0fb890bac58b746753815e48f2b081ff22070f5cff6cecMint Collateral28757472022-10-29 9:39:2428 days 2 hrs ago0xf380cb76467a5872fe321554b8671493d57c47d5 IN  Impermax: Router0 MOVR0.000213112
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x40f88ffa1572f3bfb600c80fe302cb7c03ebd85db64e9c274a036d45fd54ef8830691162022-11-26 11:48:2427 mins ago Impermax: Router0xe19895230c2ae34375a83cb1f07f8cf607ed917c0.000708062357716342 MOVR
0x40f88ffa1572f3bfb600c80fe302cb7c03ebd85db64e9c274a036d45fd54ef8830691162022-11-26 11:48:2427 mins ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.000708062357716342 MOVR
0x0124efc42455f921a4a7fbc7abed9855a732ac7bab69aa11990088eb3550792030690982022-11-26 11:44:4230 mins ago Impermax: Router 0x98878b06940ae243284ca214f92bb71a2b032b8a0.009708 MOVR
0x3d42746ebe71646ab75284d8fab3c12e75ed37783d1bc25ee4469c33b7f9122030368412022-11-21 18:53:184 days 17 hrs ago Impermax: Router0x4ff99ad3f67c84cbc08b8ab5a36de17be1db908f2.488282029667990922 MOVR
0x3d42746ebe71646ab75284d8fab3c12e75ed37783d1bc25ee4469c33b7f9122030368412022-11-21 18:53:184 days 17 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router2.488282029667990922 MOVR
0x2ecbeaec69e5209ec87541a7facc8b850646b5011b70ce89bf5b284055b4b3a130292642022-11-20 16:13:065 days 20 hrs ago Impermax: Router 0x98878b06940ae243284ca214f92bb71a2b032b8a0.288688 MOVR
0xc09a4fdc1b8e0a33e2a56a7695e8b7bd02e4508e6d63e6e3cdc1d98b0005ee7229022452022-11-02 5:16:1224 days 6 hrs ago Impermax: Router0x16d1663a00d4d1a216e0baa84b0abc69ba35c1565.011321182427950348 MOVR
0xc09a4fdc1b8e0a33e2a56a7695e8b7bd02e4508e6d63e6e3cdc1d98b0005ee7229022452022-11-02 5:16:1224 days 6 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router5.011321182427950348 MOVR
0x4fc336afd5fb219abbbad554b7fb9ac9c9c015c5d7b8500c8030e5d2e86b658c28801062022-10-30 0:44:4827 days 11 hrs ago Impermax: Router0xf380cb76467a5872fe321554b8671493d57c47d50.003088406426226632 MOVR
0x4fc336afd5fb219abbbad554b7fb9ac9c9c015c5d7b8500c8030e5d2e86b658c28801062022-10-30 0:44:4827 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.003088406426226632 MOVR
0xa448b4ee9dd362f48b596fc77fe0edfda09a5a03e1782a709533639855ad76f628801012022-10-30 0:43:4827 days 11 hrs ago Impermax: Router0xf380cb76467a5872fe321554b8671493d57c47d50.006384112867636518 MOVR
0xa448b4ee9dd362f48b596fc77fe0edfda09a5a03e1782a709533639855ad76f628801012022-10-30 0:43:4827 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.006384112867636518 MOVR
0x77f6fd16f5005478bd26df8b78d726f2a482f2f2eef74a1492ea9aa05e32985828800992022-10-30 0:43:2427 days 11 hrs ago Impermax: Router0xf380cb76467a5872fe321554b8671493d57c47d50.005116006224710165 MOVR
0x77f6fd16f5005478bd26df8b78d726f2a482f2f2eef74a1492ea9aa05e32985828800992022-10-30 0:43:2427 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.005116006224710165 MOVR
0xbaeacaee8cf2b45e217e97cee75750f98cd0da55252504f1c0e2411578a667c328800612022-10-30 0:35:3627 days 11 hrs ago Impermax: Router0x9bdbdb4a8f7f816c87a67f5281484ed902c6b9420.009222729178916575 MOVR
0xbaeacaee8cf2b45e217e97cee75750f98cd0da55252504f1c0e2411578a667c328800612022-10-30 0:35:3627 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.009222729178916575 MOVR
0x9ce0c752e4868bd9bad71b48482ab1faf37a1f96cbf2c2942fe4f035d8e045cf28800572022-10-30 0:34:4827 days 11 hrs ago Impermax: Router0x9bdbdb4a8f7f816c87a67f5281484ed902c6b9420.011173581627702147 MOVR
0x9ce0c752e4868bd9bad71b48482ab1faf37a1f96cbf2c2942fe4f035d8e045cf28800572022-10-30 0:34:4827 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.011173581627702147 MOVR
0xc96acc1771add12a74b2811ce083e094c645fa0f83912a6a39ae8f2e37044c9228800432022-10-30 0:32:0027 days 11 hrs ago Impermax: Router0x9bdbdb4a8f7f816c87a67f5281484ed902c6b9420.01622038543606219 MOVR
0xc96acc1771add12a74b2811ce083e094c645fa0f83912a6a39ae8f2e37044c9228800432022-10-30 0:32:0027 days 11 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.01622038543606219 MOVR
0x0b3496158d85be931781c6b4f14b459bcd889152cf98f2987ce17fb9860a3d3028573132022-10-26 18:03:3630 days 18 hrs ago Impermax: Router0xabc508dda7517f195e416d77c822a4861961947a7.219087061304051926 MOVR
0x0b3496158d85be931781c6b4f14b459bcd889152cf98f2987ce17fb9860a3d3028573132022-10-26 18:03:3630 days 18 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router7.219087061304051926 MOVR
0x6d8cedd661582ae6fc019a32db8a5bcbb46bbb3a35969c3fc57d3fd6c458f45c28361422022-10-23 16:57:1833 days 19 hrs ago Impermax: Router0xb4510ed86c200b8f64378351e5eb254c020c670a0.103692003150910031 MOVR
0x6d8cedd661582ae6fc019a32db8a5bcbb46bbb3a35969c3fc57d3fd6c458f45c28361422022-10-23 16:57:1833 days 19 hrs ago 0x98878b06940ae243284ca214f92bb71a2b032b8a Impermax: Router0.103692003150910031 MOVR
0xdb640bb0a7e94f43f71806b78a714d93131fac1580c04058eb91cb117640aa5028334162022-10-23 7:33:2434 days 4 hrs ago Impermax: Router0x000052dfaafc69dd59cc859908fb19bbf1559c48205.45728490149363712 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonriver.moonscan.io on 2021-11-15
*/

// File: contracts\interfaces\IRouter02.sol

pragma solidity >=0.5.0;

interface IRouter02 {
	function factory() external pure returns (address);
	function bDeployer() external pure returns (address);
	function cDeployer() external pure returns (address);
	function WETH() external pure returns (address);
	
	function mint(address poolToken, uint amount, address to, uint deadline) external returns (uint tokens);
	function mintETH(address poolToken, address to, uint deadline) external payable returns (uint tokens);
	function mintCollateral(address poolToken, uint amount, address to, uint deadline, bytes calldata permitData) external returns (uint tokens);
	
	function redeem(address poolToken, uint tokens, address to, uint deadline, bytes calldata permitData) external returns (uint amount);
	function redeemETH(address poolToken, uint tokens, address to, uint deadline, bytes calldata permitData) external returns (uint amountETH);

	function borrow(address borrowable, uint amount, address to, uint deadline, bytes calldata permitData) external;
	function borrowETH(address borrowable, uint amountETH, address to, uint deadline, bytes calldata permitData) external;
	
	function repay(address borrowable, uint amountMax, address borrower, uint deadline) external returns (uint amount);
	function repayETH(address borrowable, address borrower, uint deadline) external payable returns (uint amountETH);

	function liquidate(address borrowable, uint amountMax, address borrower, address to, uint deadline) external returns (uint amount, uint seizeTokens);
	function liquidateETH(address borrowable, address borrower, address to, uint deadline) external payable returns (uint amountETH, uint seizeTokens);
	
	function leverage(
		address uniswapV2Pair, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin,
		address to, uint deadline, bytes calldata permitDataA, bytes calldata permitDataB
	) external;
	function deleverage(
		address uniswapV2Pair, uint redeemTokens, uint amountAMin, uint amountBMin, uint deadline, bytes calldata permitData
	) external;
	
	function isStakedLPToken(address underlying) external view returns(bool);
	function getUniswapV2Pair(address underlying) external view returns (address);
	function getBorrowable(address uniswapV2Pair, uint8 index) external view returns (address borrowable);
	function getCollateral(address uniswapV2Pair) external view returns (address collateral);
	function getLendingPool(address uniswapV2Pair) external view returns (address collateral, address borrowableA, address borrowableB);
}

// File: contracts\interfaces\IPoolToken.sol

pragma solidity >=0.5.0;

interface IPoolToken {

	/*** Impermax ERC20 ***/
	
	event Transfer(address indexed from, address indexed to, uint value);
	event Approval(address indexed owner, address indexed spender, 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;
	
	/*** Pool Token ***/
	
	event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
	event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
	event Sync(uint totalBalance);
	
	function underlying() external view returns (address);
	function factory() external view returns (address);
	function totalBalance() external view returns (uint);
	function MINIMUM_LIQUIDITY() external pure returns (uint);

	function exchangeRate() external returns (uint);
	function mint(address minter) external returns (uint mintTokens);
	function redeem(address redeemer) external returns (uint redeemAmount);
	function skim(address to) external;
	function sync() external;
	
	function _setFactory() external;
}

// File: contracts\interfaces\IBorrowable.sol

pragma solidity >=0.5.0;

interface IBorrowable {

	/*** Impermax ERC20 ***/
	
	event Transfer(address indexed from, address indexed to, uint value);
	event Approval(address indexed owner, address indexed spender, 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;
	
	/*** Pool Token ***/
	
	event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
	event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
	event Sync(uint totalBalance);
	
	function underlying() external view returns (address);
	function factory() external view returns (address);
	function totalBalance() external view returns (uint);
	function MINIMUM_LIQUIDITY() external pure returns (uint);

	function exchangeRate() external returns (uint);
	function mint(address minter) external returns (uint mintTokens);
	function redeem(address redeemer) external returns (uint redeemAmount);
	function skim(address to) external;
	function sync() external;
	
	function _setFactory() external;
	
	/*** Borrowable ***/

	event BorrowApproval(address indexed owner, address indexed spender, uint value);
	event Borrow(address indexed sender, address indexed borrower, address indexed receiver, uint borrowAmount, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows);
	event Liquidate(address indexed sender, address indexed borrower, address indexed liquidator, uint seizeTokens, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows);
	
	function BORROW_FEE() external pure returns (uint);
	function collateral() external view returns (address);
	function reserveFactor() external view returns (uint);
	function exchangeRateLast() external view returns (uint);
	function borrowIndex() external view returns (uint);
	function totalBorrows() external view returns (uint);
	function borrowAllowance(address owner, address spender) external view returns (uint);
	function borrowBalance(address borrower) external view returns (uint);	
	function borrowTracker() external view returns (address);
	
	function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32);
	function borrowApprove(address spender, uint256 value) external returns (bool);
	function borrowPermit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
	function borrow(address borrower, address receiver, uint borrowAmount, bytes calldata data) external;
	function liquidate(address borrower, address liquidator) external returns (uint seizeTokens);
	function trackBorrow(address borrower) external;
	
	/*** Borrowable Interest Rate Model ***/

	event AccrueInterest(uint interestAccumulated, uint borrowIndex, uint totalBorrows);
	event CalculateKink(uint kinkRate);
	event CalculateBorrowRate(uint borrowRate);
	
	function KINK_BORROW_RATE_MAX() external pure returns (uint);
	function KINK_BORROW_RATE_MIN() external pure returns (uint);
	function KINK_MULTIPLIER() external pure returns (uint);
	function borrowRate() external view returns (uint);
	function kinkBorrowRate() external view returns (uint);
	function kinkUtilizationRate() external view returns (uint);
	function adjustSpeed() external view returns (uint);
	function rateUpdateTimestamp() external view returns (uint32);
	function accrualTimestamp() external view returns (uint32);
	
	function accrueInterest() external;
	
	/*** Borrowable Setter ***/

	event NewReserveFactor(uint newReserveFactor);
	event NewKinkUtilizationRate(uint newKinkUtilizationRate);
	event NewAdjustSpeed(uint newAdjustSpeed);
	event NewBorrowTracker(address newBorrowTracker);

	function RESERVE_FACTOR_MAX() external pure returns (uint);
	function KINK_UR_MIN() external pure returns (uint);
	function KINK_UR_MAX() external pure returns (uint);
	function ADJUST_SPEED_MIN() external pure returns (uint);
	function ADJUST_SPEED_MAX() external pure returns (uint);
	
	function _initialize (
		string calldata _name, 
		string calldata _symbol,
		address _underlying, 
		address _collateral
	) external;
	function _setReserveFactor(uint newReserveFactor) external;
	function _setKinkUtilizationRate(uint newKinkUtilizationRate) external;
	function _setAdjustSpeed(uint newAdjustSpeed) external;
	function _setBorrowTracker(address newBorrowTracker) external;
}

// File: contracts\interfaces\ICollateral.sol

pragma solidity >=0.5.0;

interface ICollateral {

	/*** Impermax ERC20 ***/
	
	event Transfer(address indexed from, address indexed to, uint value);
	event Approval(address indexed owner, address indexed spender, 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;
	
	/*** Pool Token ***/
	
	event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
	event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
	event Sync(uint totalBalance);
	
	function underlying() external view returns (address);
	function factory() external view returns (address);
	function totalBalance() external view returns (uint);
	function MINIMUM_LIQUIDITY() external pure returns (uint);

	function exchangeRate() external returns (uint);
	function mint(address minter) external returns (uint mintTokens);
	function redeem(address redeemer) external returns (uint redeemAmount);
	function skim(address to) external;
	function sync() external;
	
	function _setFactory() external;
	
	/*** Collateral ***/
	
	function borrowable0() external view returns (address);
	function borrowable1() external view returns (address);
	function simpleUniswapOracle() external view returns (address);
	function safetyMarginSqrt() external view returns (uint);
	function liquidationIncentive() external view returns (uint);
	
	function getPrices() external returns (uint price0, uint price1);
	function tokensUnlocked(address from, uint value) external returns (bool);
	function accountLiquidityAmounts(address account, uint amount0, uint amount1) external returns (uint liquidity, uint shortfall);
	function accountLiquidity(address account) external returns (uint liquidity, uint shortfall);
	function canBorrow(address account, address borrowable, uint accountBorrows) external returns (bool);
	function seize(address liquidator, address borrower, uint repayAmount) external returns (uint seizeTokens);
	function flashRedeem(address redeemer, uint redeemAmount, bytes calldata data) external;
	
	/*** Collateral Setter ***/
	
	event NewSafetyMargin(uint newSafetyMarginSqrt);
	event NewLiquidationIncentive(uint newLiquidationIncentive);

	function SAFETY_MARGIN_SQRT_MIN() external pure returns (uint);
	function SAFETY_MARGIN_SQRT_MAX() external pure returns (uint);
	function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint);
	function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint);
	
	function _initialize (
		string calldata _name, 
		string calldata _symbol,
		address _underlying, 
		address _borrowable0, 
		address _borrowable1
	) external;
	function _setSafetyMarginSqrt(uint newSafetyMarginSqrt) external;
	function _setLiquidationIncentive(uint newLiquidationIncentive) external;
}

// File: contracts\interfaces\IImpermaxCallee.sol

pragma solidity >=0.5.0;

interface IImpermaxCallee {
    function impermaxBorrow(address sender, address borrower, uint borrowAmount, bytes calldata data) external;
    function impermaxRedeem(address sender, uint redeemAmount, bytes calldata data) external;
}

// 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\IStakedLPToken01.sol

pragma solidity >=0.5.0;

interface IStakedLPToken01 {

	/*** Impermax ERC20 ***/
	
	event Transfer(address indexed from, address indexed to, uint value);
	event Approval(address indexed owner, address indexed spender, 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;
	
	/*** Pool Token ***/
	
	event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens);
	event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens);
	event Sync(uint totalBalance);
	
	function underlying() external view returns (address);
	function factory() external view returns (address);
	function totalBalance() external view returns (uint);
	function MINIMUM_LIQUIDITY() external pure returns (uint);

	function exchangeRate() external returns (uint);
	function mint(address minter) external returns (uint mintTokens);
	function redeem(address redeemer) external returns (uint redeemAmount);
	function skim(address to) external;
	function sync() external;
	
	function _setFactory() external;
	
	/*** StakedLPToken ***/
	
	event Reinvest(address indexed caller, uint256 reward, uint256 bounty);
	
	function isStakedLPToken() external pure returns (bool);
	function stakingRewards() external view returns (address);
	function rewardsToken() external view returns (address);
	function router() external view returns (address);
	function WETH() external view returns (address);
	function token0() external view returns (address);
	function token1() external view returns (address);
	function REINVEST_BOUNTY() external pure returns (uint256);
	
	function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
	function price0CumulativeLast() external view returns (uint256);
	function price1CumulativeLast() external view returns (uint256);

	function _initialize (
		address _stakingRewards,
		address _underlying,
		address _rewardsToken,
		address _token0,
		address _token1,
		address _router,
		address _WETH
	) external;

	function reinvest() external;
}

// 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\interfaces\IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts\libraries\TransferHelper.sol

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.6.6;

// 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,
        uint256 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::safeApprove: approve failed'
        );
    }

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

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

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

// File: contracts\libraries\UniswapV2Library.sol

pragma solidity >=0.5.0;



library UniswapV2Library {
    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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
    }

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

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

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

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

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

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

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

// File: contracts\Router02.sol

pragma solidity =0.6.6;
pragma experimental ABIEncoderV2;













contract Router02 is IRouter02, IImpermaxCallee {
	using SafeMath for uint;

	address public immutable override factory;
	address public immutable override bDeployer;
	address public immutable override cDeployer;
	address public immutable override WETH;

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

	modifier checkETH(address poolToken) {
		require(WETH == IPoolToken(poolToken).underlying(), "ImpermaxRouter: NOT_WETH");
		_;
	}

	constructor(address _factory, address _bDeployer, address _cDeployer, address _WETH) public {
		factory = _factory;
		bDeployer = _bDeployer;
		cDeployer = _cDeployer;
		WETH = _WETH;
	}

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

	/*** Mint ***/
	
	function _mint(
		address poolToken, 
		address token, 
		uint amount,
		address from,
		address to
	) internal virtual returns (uint tokens) {
		if (from == address(this)) TransferHelper.safeTransfer(token, poolToken, amount);
		else TransferHelper.safeTransferFrom(token, from, poolToken, amount);
		tokens = IPoolToken(poolToken).mint(to);
	}
	function mint(
		address poolToken, 
		uint amount,
		address to,
		uint deadline
	) external virtual override ensure(deadline) returns (uint tokens) {
		return _mint(poolToken, IPoolToken(poolToken).underlying(), amount, msg.sender, to);
	}
	function mintETH(
		address poolToken, 
		address to,
		uint deadline
	) external virtual override payable ensure(deadline) checkETH(poolToken) returns (uint tokens) {
		IWETH(WETH).deposit{value: msg.value}();
		return _mint(poolToken, WETH, msg.value, address(this), to);
	}
	function mintCollateral(
		address poolToken, 
		uint amount,
		address to,
		uint deadline,
		bytes calldata permitData
	) external virtual override ensure(deadline) returns (uint tokens) {
		address underlying = IPoolToken(poolToken).underlying();
		if (isStakedLPToken(underlying)) {
			address uniswapV2Pair = IStakedLPToken01(underlying).underlying();
			_permit(uniswapV2Pair, amount, deadline, permitData);
			TransferHelper.safeTransferFrom(uniswapV2Pair, msg.sender, underlying, amount);
			IStakedLPToken01(underlying).mint(poolToken);
			return IPoolToken(poolToken).mint(to);
		} else {
			_permit(underlying, amount, deadline, permitData);
			return _mint(poolToken, underlying, amount, msg.sender, to);
		}
	}
	
	/*** Redeem ***/
	
	function redeem(
		address poolToken,
		uint tokens,
		address to,
		uint deadline,
		bytes memory permitData
	) public virtual override ensure(deadline) returns (uint amount) {
		_permit(poolToken, tokens, deadline, permitData);
		IPoolToken(poolToken).transferFrom(msg.sender, poolToken, tokens);
		address underlying = IPoolToken(poolToken).underlying();
		if (isStakedLPToken(underlying)) {
			IPoolToken(poolToken).redeem(underlying);
			return IStakedLPToken01(underlying).redeem(to);
		} else {
			return IPoolToken(poolToken).redeem(to);
		}
	}
	function redeemETH(
		address poolToken, 
		uint tokens,
		address to,
		uint deadline,
		bytes memory permitData
	) public virtual override ensure(deadline) checkETH(poolToken) returns (uint amountETH) {
		_permit(poolToken, tokens, deadline, permitData);
		IPoolToken(poolToken).transferFrom(msg.sender, poolToken, tokens);
	    amountETH = IPoolToken(poolToken).redeem(address(this));
		IWETH(WETH).withdraw(amountETH);
		TransferHelper.safeTransferETH(to, amountETH);
	}
			
	/*** Borrow ***/

	function borrow(
		address borrowable, 
		uint amount,
		address to,
		uint deadline,
		bytes memory permitData
	) public virtual override ensure(deadline) {
		_borrowPermit(borrowable, amount, deadline, permitData);
		IBorrowable(borrowable).borrow(msg.sender, to, amount, new bytes(0));
	}
	function borrowETH(
		address borrowable, 
		uint amountETH,
		address to,
		uint deadline,
		bytes memory permitData
	) public virtual override ensure(deadline) checkETH(borrowable) {
		borrow(borrowable, amountETH, address(this), deadline, permitData);
		IWETH(WETH).withdraw(amountETH);
		TransferHelper.safeTransferETH(to, amountETH);
	}
	
	/*** Repay ***/
	
	function _repayAmount(
		address borrowable, 
		uint amountMax,
		address borrower
	) internal virtual returns (uint amount) {
		IBorrowable(borrowable).accrueInterest();
		uint borrowedAmount = IBorrowable(borrowable).borrowBalance(borrower);
		amount = amountMax < borrowedAmount ? amountMax : borrowedAmount;
	}
	function repay(
		address borrowable, 
		uint amountMax,
		address borrower,
		uint deadline
	) external virtual override ensure(deadline) returns (uint amount) {
		amount = _repayAmount(borrowable, amountMax, borrower);
		TransferHelper.safeTransferFrom(IBorrowable(borrowable).underlying(), msg.sender, borrowable, amount);
		IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));
	}
	function repayETH(
		address borrowable, 
		address borrower,
		uint deadline
	) external virtual override payable ensure(deadline) checkETH(borrowable) returns (uint amountETH) {
		amountETH = _repayAmount(borrowable, msg.value, borrower);
		IWETH(WETH).deposit{value: amountETH}();
		assert(IWETH(WETH).transfer(borrowable, amountETH));
		IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));
		// refund surpluss eth, if any
		if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
	}
	
	/*** Liquidate ***/

	function liquidate(
		address borrowable, 
		uint amountMax,
		address borrower,
		address to,
		uint deadline
	) external virtual override ensure(deadline) returns (uint amount, uint seizeTokens) {
		amount = _repayAmount(borrowable, amountMax, borrower);
		TransferHelper.safeTransferFrom(IBorrowable(borrowable).underlying(), msg.sender, borrowable, amount);
		seizeTokens = IBorrowable(borrowable).liquidate(borrower, to);
	}
	function liquidateETH(
		address borrowable, 
		address borrower,
		address to,
		uint deadline
	) external virtual override payable ensure(deadline) checkETH(borrowable) returns (uint amountETH, uint seizeTokens) {
		amountETH = _repayAmount(borrowable, msg.value, borrower);
		IWETH(WETH).deposit{value: amountETH}();
		assert(IWETH(WETH).transfer(borrowable, amountETH));
		seizeTokens = IBorrowable(borrowable).liquidate(borrower, to);
		// refund surpluss eth, if any
		if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
	}
		
	/*** Leverage LP Token ***/
	
	function _leverage(
		address underlying, 
		uint amountA,
		uint amountB,
		address to
	) internal virtual {
		address borrowableA = getBorrowable(underlying, 0);
		// mint collateral
		bytes memory borrowBData = abi.encode(CalleeData({
			callType: CallType.ADD_LIQUIDITY_AND_MINT,
			underlying: underlying,
			borrowableIndex: 1,
			data: abi.encode(AddLiquidityAndMintCalldata({
				amountA: amountA,
				amountB: amountB,
				to: to
			}))
		}));	
		// borrow borrowableB
		bytes memory borrowAData = abi.encode(CalleeData({
			callType: CallType.BORROWB,
			underlying: underlying,
			borrowableIndex: 0,
			data: abi.encode(BorrowBCalldata({
				borrower: msg.sender,
				receiver: address(this),
				borrowAmount: amountB,
				data: borrowBData
			}))
		}));
		// borrow borrowableA
		IBorrowable(borrowableA).borrow(msg.sender, address(this), amountA, borrowAData);	
	}
	function leverage(
		address underlying,  
		uint amountADesired,
		uint amountBDesired,
		uint amountAMin,
		uint amountBMin,
		address to,
		uint deadline,
		bytes calldata permitDataA,
		bytes calldata permitDataB
	) external virtual override ensure(deadline) {
		_borrowPermit(getBorrowable(underlying, 0), amountADesired, deadline, permitDataA);
		_borrowPermit(getBorrowable(underlying, 1), amountBDesired, deadline, permitDataB);
		address uniswapV2Pair = getUniswapV2Pair(underlying);
		(uint amountA, uint amountB) = _optimalLiquidity(uniswapV2Pair, amountADesired, amountBDesired, amountAMin, amountBMin);
		_leverage(underlying, amountA, amountB, to);
	}

	function _addLiquidityAndMint(
		address underlying, 
		uint amountA,
		uint amountB,
		address to
	) internal virtual {
		(address collateral, address borrowableA, address borrowableB) = getLendingPool(underlying);
		address uniswapV2Pair = getUniswapV2Pair(underlying);
		// add liquidity to uniswap pair
		TransferHelper.safeTransfer(IBorrowable(borrowableA).underlying(), uniswapV2Pair, amountA);
		TransferHelper.safeTransfer(IBorrowable(borrowableB).underlying(), uniswapV2Pair, amountB);
		// mint LP token
		if (isStakedLPToken(underlying)) IUniswapV2Pair(uniswapV2Pair).mint(underlying);
		IUniswapV2Pair(underlying).mint(collateral);
		// mint collateral
		ICollateral(collateral).mint(to);
	}
		
	/*** Deleverage LP Token ***/
	
	function deleverage(
		address underlying,  
		uint redeemTokens,
		uint amountAMin,
		uint amountBMin,
		uint deadline,
		bytes calldata permitData
	) external virtual override ensure(deadline) {
		address collateral = getCollateral(underlying);
		uint exchangeRate = ICollateral(collateral).exchangeRate();
		require(redeemTokens > 0, "ImpermaxRouter: REDEEM_ZERO");		
		uint redeemAmount = (redeemTokens - 1).mul(exchangeRate).div(1e18);
		_permit(collateral, redeemTokens, deadline, permitData);
		bytes memory redeemData = abi.encode(CalleeData({
			callType: CallType.REMOVE_LIQ_AND_REPAY,
			underlying: underlying,
			borrowableIndex: 0,
			data: abi.encode(RemoveLiqAndRepayCalldata({
				borrower: msg.sender,
				redeemTokens: redeemTokens,
				redeemAmount: redeemAmount,
				amountAMin: amountAMin,
				amountBMin: amountBMin
			}))
		}));
		// flashRedeem
		ICollateral(collateral).flashRedeem(address(this), redeemAmount, redeemData);
	}

	function _removeLiqAndRepay(
		address underlying,
		address borrower,
		uint redeemTokens,
		uint redeemAmount,
		uint amountAMin,
		uint amountBMin
	) internal virtual {
		(address collateral, address borrowableA, address borrowableB) = getLendingPool(underlying);
		address tokenA = IBorrowable(borrowableA).underlying();
		address tokenB = IBorrowable(borrowableB).underlying();
		address uniswapV2Pair = getUniswapV2Pair(underlying);
		// removeLiquidity
		IUniswapV2Pair(underlying).transfer(underlying, redeemAmount);
		//TransferHelper.safeTransfer(underlying, underlying, redeemAmount);
		if (isStakedLPToken(underlying)) IStakedLPToken01(underlying).redeem(uniswapV2Pair);
		(uint amountAMax, uint amountBMax) = IUniswapV2Pair(uniswapV2Pair).burn(address(this));
		require(amountAMax >= amountAMin, "ImpermaxRouter: INSUFFICIENT_A_AMOUNT");
		require(amountBMax >= amountBMin, "ImpermaxRouter: INSUFFICIENT_B_AMOUNT");
		// repay and refund
		_repayAndRefund(borrowableA, tokenA, borrower, amountAMax);
		_repayAndRefund(borrowableB, tokenB, borrower, amountBMax);
		// repay flash redeem
		ICollateral(collateral).transferFrom(borrower, collateral, redeemTokens);
	}
	
	function _repayAndRefund(
		address borrowable,
		address token,
		address borrower,
		uint amountMax
	) internal virtual {
		//repay
		uint amount = _repayAmount(borrowable, amountMax, borrower);
		TransferHelper.safeTransfer(token, borrowable, amount);
		IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0));		
		// refund excess
		if (amountMax > amount) {
			uint refundAmount = amountMax - amount;
			if (token == WETH) {		
				IWETH(WETH).withdraw(refundAmount);
				TransferHelper.safeTransferETH(borrower, refundAmount);
			}
			else TransferHelper.safeTransfer(token, borrower, refundAmount);
		}
	}
	
	/*** Impermax Callee ***/
		
	enum CallType {ADD_LIQUIDITY_AND_MINT, BORROWB, REMOVE_LIQ_AND_REPAY}
	struct CalleeData {
		CallType callType;
		address underlying;
		uint8 borrowableIndex;
		bytes data;		
	}
	struct AddLiquidityAndMintCalldata {
		uint amountA;
		uint amountB;
		address to;
	}
	struct BorrowBCalldata {
		address borrower; 
		address receiver;
		uint borrowAmount;
		bytes data;
	}
	struct RemoveLiqAndRepayCalldata {
		address borrower;
		uint redeemTokens;
		uint redeemAmount;
		uint amountAMin;
		uint amountBMin;
	}
	
	function impermaxBorrow(address sender, address borrower, uint borrowAmount, bytes calldata data) external virtual override {
		borrower; borrowAmount;
		CalleeData memory calleeData = abi.decode(data, (CalleeData));
		address declaredCaller = getBorrowable(calleeData.underlying, calleeData.borrowableIndex);
		// only succeeds if called by a borrowable and if that borrowable has been called by the router
		require(sender == address(this), "ImpermaxRouter: SENDER_NOT_ROUTER");
		require(msg.sender == declaredCaller, "ImpermaxRouter: UNAUTHORIZED_CALLER");
		if (calleeData.callType == CallType.ADD_LIQUIDITY_AND_MINT) {
			AddLiquidityAndMintCalldata memory d = abi.decode(calleeData.data, (AddLiquidityAndMintCalldata));
			_addLiquidityAndMint(calleeData.underlying, d.amountA, d.amountB, d.to);
		}
		else if (calleeData.callType == CallType.BORROWB) {
			BorrowBCalldata memory d = abi.decode(calleeData.data, (BorrowBCalldata));
			address borrowableB = getBorrowable(calleeData.underlying, 1);
			IBorrowable(borrowableB).borrow(d.borrower, d.receiver, d.borrowAmount, d.data);
		}
		else revert();
	}
	
	function impermaxRedeem(address sender, uint redeemAmount, bytes calldata data) external virtual override {
		redeemAmount;
		CalleeData memory calleeData = abi.decode(data, (CalleeData));
		address declaredCaller = getCollateral(calleeData.underlying);
		// only succeeds if called by a collateral and if that collateral has been called by the router
		require(sender == address(this), "ImpermaxRouter: SENDER_NOT_ROUTER");
		require(msg.sender == declaredCaller, "ImpermaxRouter: UNAUTHORIZED_CALLER");
		if (calleeData.callType == CallType.REMOVE_LIQ_AND_REPAY) {
			RemoveLiqAndRepayCalldata memory d = abi.decode(calleeData.data, (RemoveLiqAndRepayCalldata));
			_removeLiqAndRepay(calleeData.underlying, d.borrower, d.redeemTokens, d.redeemAmount, d.amountAMin, d.amountBMin);
		}
		else revert();
	}
		
	/*** Utilities ***/
	
	function _permit(
		address poolToken, 
		uint amount, 
		uint deadline,
		bytes memory permitData
	) internal virtual {
		if (permitData.length == 0) return;
		(bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode(permitData, (bool, uint8, bytes32, bytes32));
		uint value = approveMax ? uint(-1) : amount;
		IPoolToken(poolToken).permit(msg.sender, address(this), value, deadline, v, r, s);
	}
	function _borrowPermit(
		address borrowable, 
		uint amount, 
		uint deadline,
		bytes memory permitData
	) internal virtual {
		if (permitData.length == 0) return;
		(bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode(permitData, (bool, uint8, bytes32, bytes32));
		uint value = approveMax ? uint(-1) : amount;
		IBorrowable(borrowable).borrowPermit(msg.sender, address(this), value, deadline, v, r, s);
	}
	
	function _optimalLiquidity(
		address uniswapV2Pair,
		uint amountADesired,
		uint amountBDesired,
		uint amountAMin,
		uint amountBMin
	) public virtual view returns (uint amountA, uint amountB) {
		(uint reserveA, uint reserveB,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
		uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
		if (amountBOptimal <= amountBDesired) {
			require(amountBOptimal >= amountBMin, "ImpermaxRouter: INSUFFICIENT_B_AMOUNT");
			(amountA, amountB) = (amountADesired, amountBOptimal);
		} else {
			uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
			assert(amountAOptimal <= amountADesired);
			require(amountAOptimal >= amountAMin, "ImpermaxRouter: INSUFFICIENT_A_AMOUNT");
			(amountA, amountB) = (amountAOptimal, amountBDesired);
		}
	}
	
	function isStakedLPToken(address underlying) public virtual override view returns(bool) {
		try IStakedLPToken01(underlying).isStakedLPToken() returns (bool result) {
			return result;
		} catch {
			return false;
		}
	}
	function getUniswapV2Pair(address underlying) public virtual override view returns (address) {
		try IStakedLPToken01(underlying).underlying() returns (address u) {
			if (u != address(0)) return u;
			return underlying;
		} catch {
			return underlying;
		}
	}
	
	function getBorrowable(address underlying, uint8 index) public virtual override view returns (address borrowable) {
		require(index < 2, "ImpermaxRouter: INDEX_TOO_HIGH");
		borrowable = address(uint(keccak256(abi.encodePacked(
			hex"ff",
			bDeployer,
			keccak256(abi.encodePacked(factory, underlying, index)),
			hex"2f3bb9d145010e257f2a5cec368952d4f239b38600c73438ef8e7f5c81c8bee7" // Borrowable bytecode keccak256
		))));
	}
	function getCollateral(address underlying) public virtual override view returns (address collateral) {
		collateral = address(uint(keccak256(abi.encodePacked(
			hex"ff",
			cDeployer,
			keccak256(abi.encodePacked(factory, underlying)),
			hex"57ab20a2a1f10e41e70d01a4831484bbac1cc1d251325a9e53339bb4203ee8ef" // Collateral bytecode keccak256
		))));
	}
	function getLendingPool(address underlying) public virtual override view returns (address collateral, address borrowableA, address borrowableB) {
		collateral = getCollateral(underlying);
		borrowableA = getBorrowable(underlying, 0);
		borrowableB = getBorrowable(underlying, 1);
	}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_bDeployer","type":"address"},{"internalType":"address","name":"_cDeployer","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":"uniswapV2Pair","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"}],"name":"_optimalLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrowETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"redeemTokens","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"deleverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getBorrowable","outputs":[{"internalType":"address","name":"borrowable","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getLendingPool","outputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"address","name":"borrowableA","type":"address"},{"internalType":"address","name":"borrowableB","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"impermaxBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"impermaxRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"isStakedLPToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","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"},{"internalType":"bytes","name":"permitDataA","type":"bytes"},{"internalType":"bytes","name":"permitDataB","type":"bytes"}],"name":"leverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidateETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"mintCollateral","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mintETH","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeemETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repayETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b506040516200548b3803806200548b833981016040819052620000359162000083565b6001600160601b0319606094851b811660805292841b831660a05290831b821660c05290911b1660e052620000e3565b80516001600160a01b03811681146200007d57600080fd5b92915050565b6000806000806080858703121562000099578384fd5b620000a5868662000065565b9350620000b6866020870162000065565b9250620000c7866040870162000065565b9150620000d8866060870162000065565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c61530262000189600039806101b7528061093d5280610b425280610c855280610d3b5280610e895280610f045280610fbd5280611acc5280611b3a5280611bbf52806123c652806125eb5280612666528061271f5280613de95280613e78525080611f09528061213c52508061240e52806128b952508061215d52806123ea52806128da52506153026000f3fe60806040526004361061019a5760003560e01c806377370d62116100e1578063ad5c46481161008a578063dbe5f2fb11610064578063dbe5f2fb1461048c578063eb03419a146104ac578063ef974e9c146104bf578063fcb2a895146104df576101e0565b8063ad5c46481461044d578063c45a015514610462578063db5a269014610477576101e0565b80639b56d6c9116100bb5780639b56d6c9146103e0578063a3c252a014610400578063acb86cbb1461042d576101e0565b806377370d621461038b5780637a4660d5146103ab578063876d9d9e146103c0576101e0565b80633c173a4f1161014357806367bf252f1161011d57806367bf252f146103385780636aee7c1e14610358578063703de94c14610378576101e0565b80633c173a4f146102ca57806343e26448146102ea5780635c1e64041461030a576101e0565b80632c344504116101745780632c3445041461026a57806335bb10591461028a5780633970036a1461029d576101e0565b80630572bf5f146101e55780631f1cc5bc1461021d5780632b005cfc1461024a576101e0565b366101e0573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101de57fe5b005b600080fd5b3480156101f157600080fd5b50610205610200366004614072565b6104ff565b60405161021493929190614b9e565b60405180910390f35b34801561022957600080fd5b5061023d6102383660046142b6565b61052f565b60405161021491906151d0565b34801561025657600080fd5b5061023d6102653660046142b6565b610869565b34801561027657600080fd5b506101de6102853660046142b6565b610bb3565b61023d6102983660046140fa565b610db5565b3480156102a957600080fd5b506102bd6102b8366004614072565b611102565b6040516102149190614a63565b3480156102d657600080fd5b5061023d6102e5366004614205565b6111d0565b3480156102f657600080fd5b5061023d61030536600461423c565b6112a1565b34801561031657600080fd5b5061032a6103253660046141ab565b6115ee565b6040516102149291906151d9565b34801561034457600080fd5b506101de6103533660046143c7565b611775565b34801561036457600080fd5b5061023d610373366004614205565b611886565b61023d6103863660046140fa565b6119f8565b34801561039757600080fd5b506101de6103a6366004614496565b611be6565b3480156103b757600080fd5b506102bd611f07565b3480156103cc57600080fd5b506101de6103db36600461413a565b611f2b565b3480156103ec57600080fd5b506102bd6103fb366004614072565b612138565b34801561040c57600080fd5b5061042061041b366004614072565b6121f1565b6040516102149190614bf4565b34801561043957600080fd5b506101de61044836600461432a565b61229a565b34801561045957600080fd5b506102bd6123c4565b34801561046e57600080fd5b506102bd6123e8565b34801561048357600080fd5b506102bd61240c565b34801561049857600080fd5b506101de6104a73660046142b6565b612430565b61032a6104ba3660046140aa565b612516565b3480156104cb57600080fd5b506102bd6104da366004614511565b612878565b3480156104eb57600080fd5b5061032a6104fa366004614384565b612971565b600080600061050d84612138565b925061051a846000612878565b9150610527846001612878565b929491935050565b60008242811015610575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b60405180910390fd5b61058187878686612adb565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8816906323b872dd906105d79033908b908b90600401614b11565b602060405180830381600087803b1580156105f157600080fd5b505af1158015610605573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106299190614549565b5060008773ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561067257600080fd5b505afa158015610686573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106aa919061408e565b90506106b5816121f1565b1561080b576040517f95a2251f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906395a2251f9061070c908490600401614a63565b602060405180830381600087803b15801561072657600080fd5b505af115801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e919061481f565b506040517f95a2251f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906395a2251f906107b1908990600401614a63565b602060405180830381600087803b1580156107cb57600080fd5b505af11580156107df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610803919061481f565b92505061085f565b6040517f95a2251f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906395a2251f906107b1908990600401614a63565b505b5095945050505050565b600082428110156108a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b868073ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ed57600080fd5b505afa158015610901573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610925919061408e565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f9f565b6109b588888787612adb565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906323b872dd90610a0b9033908c908c90600401614b11565b602060405180830381600087803b158015610a2557600080fd5b505af1158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190614549565b506040517f95a2251f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906395a2251f90610ab0903090600401614a63565b602060405180830381600087803b158015610aca57600080fd5b505af1158015610ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b02919061481f565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815290935073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610b779086906004016151d0565b600060405180830381600087803b158015610b9157600080fd5b505af1158015610ba5573d6000803e3d6000fd5b5050505061085d8684612bd6565b8142811015610bee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b858073ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3557600080fd5b505afa158015610c49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6d919061408e565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f9f565b610cfe8787308787612430565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610d709089906004016151d0565b600060405180830381600087803b158015610d8a57600080fd5b505af1158015610d9e573d6000803e3d6000fd5b50505050610dac8587612bd6565b50505050505050565b60008142811015610df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b848073ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3957600080fd5b505afa158015610e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e71919061408e565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610ef5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f9f565b610f00863487612c8f565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f6a57600080fd5b505af1158015610f7e573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250610ff7915089908790600401614bce565b602060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110499190614549565b61104f57fe5b60408051600080825260208201928390527f1e7dcc0d0000000000000000000000000000000000000000000000000000000090925273ffffffffffffffffffffffffffffffffffffffff881691631e7dcc0d916110b3918991819060248101614a84565b600060405180830381600087803b1580156110cd57600080fd5b505af11580156110e1573d6000803e3d6000fd5b50505050823411156110f9576110f933843403612bd6565b50509392505050565b60008173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561114a57600080fd5b505afa925050508015611198575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526111959181019061408e565b60015b6111a35750806111cb565b73ffffffffffffffffffffffffffffffffffffffff8116156111c65790506111cb565b829150505b919050565b6000814281101561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b611297868773ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561125757600080fd5b505afa15801561126b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128f919061408e565b873388612db0565b9695505050505050565b600083428110156112de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b60008873ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561132657600080fd5b505afa15801561133a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135e919061408e565b9050611369816121f1565b156115905760008173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156113b657600080fd5b505afa1580156113ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ee919061408e565b9050611432818a8989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612adb92505050565b61143e8133848c612e90565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690636a62784290611490908d90600401614a63565b602060405180830381600087803b1580156114aa57600080fd5b505af11580156114be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e2919061481f565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690636a62784290611535908b90600401614a63565b602060405180830381600087803b15801561154f57600080fd5b505af1158015611563573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611587919061481f565b935050506115e3565b6115d281898888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612adb92505050565b6115df89828a338b612db0565b9250505b509695505050505050565b600080824281101561162c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b611637888888612c8f565b92506116c28873ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561168257600080fd5b505afa158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba919061408e565b338a86612e90565b6040517f86b9d81f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906386b9d81f906117169089908990600401614b77565b602060405180830381600087803b15801561173057600080fd5b505af1158015611744573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611768919061481f565b9150509550959350505050565b84428110156117b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b6117fc6117be8d6000612878565b8c8888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fb592505050565b61184861180a8d6001612878565b8b8886868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612fb592505050565b60006118538d611102565b9050600080611865838f8f8f8f612971565b915091506118758f83838d613072565b505050505050505050505050505050565b600081428110156118c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b6118ce868686612c8f565b91506119598673ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561191957600080fd5b505afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611951919061408e565b338885612e90565b60408051600080825260208201928390527f1e7dcc0d0000000000000000000000000000000000000000000000000000000090925273ffffffffffffffffffffffffffffffffffffffff881691631e7dcc0d916119bd918891819060248101614a84565b600060405180830381600087803b1580156119d757600080fd5b505af11580156119eb573d6000803e3d6000fd5b5050505050949350505050565b60008142811015611a35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b848073ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7c57600080fd5b505afa158015611a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab4919061408e565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f9f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ba057600080fd5b505af1158015611bb4573d6000803e3d6000fd5b5050505050611297867f0000000000000000000000000000000000000000000000000000000000000000343089612db0565b8242811015611c21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b6000611c2c89612138565b905060008173ffffffffffffffffffffffffffffffffffffffff16633ba0b9a96040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611c7857600080fd5b505af1158015611c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb0919061481f565b905060008911611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f0b565b6000611d38670de0b6b3a7640000611d2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8d018563ffffffff61330616565b9063ffffffff61336316565b9050611d7c838b8989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612adb92505050565b604080516080810190915260609080600281526020018d73ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681526020016040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018e81526020018581526020018d81526020018c815250604051602001611e059190615180565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152915251611e439190602001615122565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f19f3400d000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff8516906319f3400d90611ec790309086908690600401614b42565b600060405180830381600087803b158015611ee157600080fd5b505af1158015611ef5573d6000803e3d6000fd5b50505050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611f33613ef9565b611f3f828401846146c8565b90506000611f5582602001518360400151612878565b905073ffffffffffffffffffffffffffffffffffffffff87163014611fa6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614d86565b3373ffffffffffffffffffffffffffffffffffffffff821614611ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614c12565b60008251600281111561200457fe5b141561204e57612012613f20565b826060015180602001905181019061202a91906145b4565b905061204883602001518260000151836020015184604001516133a5565b50610dac565b60018251600281111561205d57fe5b14156101e05761206b613f57565b826060015180602001905181019061208391906145f7565b9050600061209684602001516001612878565b82516020840151604080860151606087015191517f1e7dcc0d00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff861694631e7dcc0d946120ff949093909291600401614a84565b600060405180830381600087803b15801561211957600080fd5b505af115801561212d573d6000803e3d6000fd5b505050505050610dac565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008360405160200161218e9291906148a4565b604051602081830303815290604052805190602001206040516020016121b5929190614961565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b60008173ffffffffffffffffffffffffffffffffffffffff16630a6410636040518163ffffffff1660e01b815260040160206040518083038186803b15801561223957600080fd5b505afa925050508015612287575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261228491810190614549565b60015b612293575060006111cb565b90506111cb565b6122a2613ef9565b6122ae828401846146c8565b905060006122bf8260200151612138565b905073ffffffffffffffffffffffffffffffffffffffff86163014612310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614d86565b3373ffffffffffffffffffffffffffffffffffffffff82161461235f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614c12565b60028251600281111561236e57fe5b14156101e05761237c613f7d565b8260600151806020019051810190612394919061476f565b9050610dac8360200151826000015183602001518460400151856060015186608001516136de565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b814281101561246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b61247786868585612fb5565b604080516000815260208101918290527f1e7dcc0d0000000000000000000000000000000000000000000000000000000090915273ffffffffffffffffffffffffffffffffffffffff871690631e7dcc0d906124dc90339088908a9060248101614a84565b600060405180830381600087803b1580156124f657600080fd5b505af115801561250a573d6000803e3d6000fd5b50505050505050505050565b6000808242811015612554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614de3565b868073ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561259b57600080fd5b505afa1580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d3919061408e565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614612657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f9f565b612662883489612c8f565b93507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156126cc57600080fd5b505af11580156126e0573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925061275991508b908890600401614bce565b602060405180830381600087803b15801561277357600080fd5b505af1158015612787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ab9190614549565b6127b157fe5b6040517f86b9d81f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8916906386b9d81f90612805908a908a90600401614b77565b602060405180830381600087803b15801561281f57600080fd5b505af1158015612833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612857919061481f565b92508334111561286d5761286d33853403612bd6565b505094509492505050565b600060028260ff16106128b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614e1a565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000848460405160200161290d939291906148de565b604051602081830303815290604052805190602001206040516020016129349291906149e2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000806000808873ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156129bd57600080fd5b505afa1580156129d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f591906147cb565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000612a27898484613b0b565b9050878111612a755785811015612a6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90615033565b889450925082612ace565b6000612a82898486613b0b565b905089811115612a8e57fe5b87811015612ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614c6f565b94508793505b5050509550959350505050565b8051612ae657612bd0565b60008060008084806020019051810190612b009190614569565b9350935093509350600084612b155787612b37565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8a169063d505accf90612b98903390309086908d908b908b908b90600401614ac3565b600060405180830381600087803b158015612bb257600080fd5b505af1158015612bc6573d6000803e3d6000fd5b5050505050505050505b50505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8416908390604051612c0d9190614945565b60006040518083038185875af1925050503d8060008114612c4a576040519150601f19603f3d011682016040523d82523d6000602084013e612c4f565b606091505b5050905080612c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614d29565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663a6afed956040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612cd957600080fd5b505af1158015612ced573d6000803e3d6000fd5b50506040517f4d73e9ba0000000000000000000000000000000000000000000000000000000081526000925073ffffffffffffffffffffffffffffffffffffffff87169150634d73e9ba90612d46908690600401614a63565b60206040518083038186803b158015612d5e57600080fd5b505afa158015612d72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d96919061481f565b9050808410612da55780612da7565b835b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff8316301415612de057612ddb858786613bad565b612dec565b612dec85848887612e90565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871690636a62784290612e3e908590600401614a63565b602060405180830381600087803b158015612e5857600080fd5b505af1158015612e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611297919061481f565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612ec593929190614b11565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612f139190614945565b6000604051808303816000865af19150503d8060008114612f50576040519150601f19603f3d011682016040523d82523d6000602084013e612f55565b606091505b5091509150818015612f7f575080511580612f7f575080806020019051810190612f7f9190614549565b6123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614ccc565b8051612fc057612bd0565b60008060008084806020019051810190612fda9190614569565b9350935093509350600084612fef5787613011565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517f9e79b55c00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8a1690639e79b55c90612b98903390309086908d908b908b908b90600401614ac3565b600061307f856000612878565b9050606060405180608001604052806000600281111561309b57fe5b81526020018773ffffffffffffffffffffffffffffffffffffffff168152602001600160ff16815260200160405180606001604052808881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152506040516020016131079190615090565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181529152516131459190602001615122565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815260808301909152915060609080600181526020018873ffffffffffffffffffffffffffffffffffffffff168152602001600060ff16815260200160405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018581525060405160200161320791906150c7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181529152516132459190602001615122565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f1e7dcc0d000000000000000000000000000000000000000000000000000000008252915073ffffffffffffffffffffffffffffffffffffffff841690631e7dcc0d906132cb90339030908b908790600401614a84565b600060405180830381600087803b1580156132e557600080fd5b505af11580156132f9573d6000803e3d6000fd5b5050505050505050505050565b6000826133155750600061335d565b8282028284828161332257fe5b041461335a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614eae565b90505b92915050565b600061335a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613cd7565b60008060006133b3876104ff565b92509250925060006133c488611102565b905061344e8373ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561340f57600080fd5b505afa158015613423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613447919061408e565b8289613bad565b6134d68273ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561349757600080fd5b505afa1580156134ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134cf919061408e565b8288613bad565b6134df886121f1565b1561358a576040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636a62784290613536908b90600401614a63565b602060405180830381600087803b15801561355057600080fd5b505af1158015613564573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613588919061481f565b505b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff891690636a627842906135dc908790600401614a63565b602060405180830381600087803b1580156135f657600080fd5b505af115801561360a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362e919061481f565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690636a62784290613681908890600401614a63565b602060405180830381600087803b15801561369b57600080fd5b505af11580156136af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d3919061481f565b505050505050505050565b60008060006136ec896104ff565b92509250925060008273ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561373a57600080fd5b505afa15801561374e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613772919061408e565b905060008273ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156137bc57600080fd5b505afa1580156137d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f4919061408e565b905060006138018c611102565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8d169063a9059cbb90613858908f908d90600401614bce565b602060405180830381600087803b15801561387257600080fd5b505af1158015613886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138aa9190614549565b506138b48c6121f1565b1561395f576040517f95a2251f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d16906395a2251f9061390b908490600401614a63565b602060405180830381600087803b15801561392557600080fd5b505af1158015613939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395d919061481f565b505b6000808273ffffffffffffffffffffffffffffffffffffffff166389afcb44306040518263ffffffff1660e01b815260040161399b9190614a63565b6040805180830381600087803b1580156139b457600080fd5b505af11580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec9190614837565b9150915089821015613a2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614c6f565b88811015613a64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90615033565b613a7087868f85613d28565b613a7c86858f84613d28565b8773ffffffffffffffffffffffffffffffffffffffff166323b872dd8e8a8f6040518463ffffffff1660e01b8152600401613ab993929190614b11565b602060405180830381600087803b158015613ad357600080fd5b505af1158015613ae7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118759190614549565b6000808411613b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614f42565b600083118015613b565750600082115b613b8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614e51565b82613b9d858463ffffffff61330616565b81613ba457fe5b04949350505050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401613be0929190614bce565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051613c2e9190614945565b6000604051808303816000865af19150503d8060008114613c6b576040519150601f19603f3d011682016040523d82523d6000602084013e613c70565b606091505b5091509150818015613c9a575080511580613c9a575080806020019051810190613c9a9190614549565b613cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c90614fd6565b5050505050565b60008183613d12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c9190614bff565b506000838581613d1e57fe5b0495945050505050565b6000613d35858385612c8f565b9050613d42848683613bad565b60408051600080825260208201928390527f1e7dcc0d0000000000000000000000000000000000000000000000000000000090925273ffffffffffffffffffffffffffffffffffffffff871691631e7dcc0d91613da6918791819060248101614a84565b600060405180830381600087803b158015613dc057600080fd5b505af1158015613dd4573d6000803e3d6000fd5b5050505080821115613cd057600081830390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613eee576040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90613ead9084906004016151d0565b600060405180830381600087803b158015613ec757600080fd5b505af1158015613edb573d6000803e3d6000fd5b50505050613ee98482612bd6565b6123bc565b6123bc858583613bad565b60408051608081019091528060008152600060208201819052604082015260609081015290565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b803561335d8161527c565b60008083601f840112613fde578182fd5b50813567ffffffffffffffff811115613ff5578182fd5b60208301915083602082850101111561400d57600080fd5b9250929050565b600082601f830112614024578081fd5b81356140376140328261520e565b6151e7565b915080825283602082850101111561404e57600080fd5b8060208401602084013760009082016020015292915050565b803561335d816152bd565b600060208284031215614083578081fd5b813561335a8161527c565b60006020828403121561409f578081fd5b815161335a8161527c565b600080600080608085870312156140bf578283fd5b84356140ca8161527c565b935060208501356140da8161527c565b925060408501356140ea8161527c565b9396929550929360600135925050565b60008060006060848603121561410e578283fd5b83356141198161527c565b925060208401356141298161527c565b929592945050506040919091013590565b600080600080600060808688031215614151578081fd5b853561415c8161527c565b9450602086013561416c8161527c565b935060408601359250606086013567ffffffffffffffff81111561418e578182fd5b61419a88828901613fcd565b969995985093965092949392505050565b600080600080600060a086880312156141c2578283fd5b85356141cd8161527c565b94506020860135935060408601356141e48161527c565b925060608601356141f48161527c565b949793965091946080013592915050565b6000806000806080858703121561421a578182fd5b84356142258161527c565b93506020850135925060408501356140ea8161527c565b60008060008060008060a08789031215614254578384fd5b863561425f8161527c565b95506020870135945060408701356142768161527c565b935060608701359250608087013567ffffffffffffffff811115614298578182fd5b6142a489828a01613fcd565b979a9699509497509295939492505050565b600080600080600060a086880312156142cd578283fd5b85356142d88161527c565b94506020860135935060408601356142ef8161527c565b925060608601359150608086013567ffffffffffffffff811115614311578182fd5b61431d88828901614014565b9150509295509295909350565b6000806000806060858703121561433f578182fd5b843561434a8161527c565b935060208501359250604085013567ffffffffffffffff81111561436c578283fd5b61437887828801613fcd565b95989497509550505050565b600080600080600060a0868803121561439b578283fd5b85356143a68161527c565b97602087013597506040870135966060810135965060800135945092505050565b60008060008060008060008060008060006101208c8e0312156143e8578889fd5b6143f28c3561527c565b8b359a5060208c0135995060408c0135985060608c0135975060808c0135965061441f60a08d013561527c565b60a08c0135955060c08c0135945067ffffffffffffffff8060e08e01351115614446578485fd5b6144568e60e08f01358f01613fcd565b90955093506101008d013581101561446c578283fd5b5061447e8d6101008e01358e01613fcd565b81935080925050509295989b509295989b9093969950565b600080600080600080600060c0888a0312156144b0578081fd5b87356144bb8161527c565b96506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156144f2578182fd5b6144fe8a828b01613fcd565b989b979a50959850939692959293505050565b60008060408385031215614523578182fd5b823561452e8161527c565b9150602083013561453e816152bd565b809150509250929050565b60006020828403121561455a578081fd5b8151801515811461335a578182fd5b6000806000806080858703121561457e578182fd5b8451801515811461458d578283fd5b602086015190945061459e816152bd565b6040860151606090960151949790965092505050565b6000606082840312156145c5578081fd5b6145cf60606151e7565b825181526020830151602082015260408301516145eb8161527c565b60408201529392505050565b60006020808385031215614609578182fd5b825167ffffffffffffffff80821115614620578384fd5b81850160808188031215614632578485fd5b61463c60806151e7565b925080516146498161527c565b8352808401516146588161527c565b8385015260408181015190840152606081015182811115614677578586fd5b019050601f81018613614688578384fd5b80516146966140328261520e565b81815287858385010111156146a9578586fd5b6146b882868301878601615250565b6060840152509095945050505050565b6000602082840312156146d9578081fd5b813567ffffffffffffffff808211156146f0578283fd5b81840160808187031215614702578384fd5b61470c60806151e7565b925080356003811061471c578485fd5b835261472b8660208301613fc2565b602084015261473d8660408301614067565b6040840152606081013582811115614753578485fd5b61475f87828401614014565b6060850152509195945050505050565b600060a08284031215614780578081fd5b61478a60a06151e7565b82516147958161527c565b80825250602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6000806000606084860312156147df578081fd5b83516147ea816152a1565b60208501519093506147fb816152a1565b604085015190925063ffffffff81168114614814578182fd5b809150509250925092565b600060208284031215614830578081fd5b5051919050565b60008060408385031215614849578182fd5b505080516020909101519092909150565b60008151808452614872816020860160208601615250565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811682529290931b909116601483015260f81b7fff0000000000000000000000000000000000000000000000000000000000000016602882015260290190565b60008251614957818460208701615250565b9190910192915050565b7fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f57ab20a2a1f10e41e70d01a4831484bbac1cc1d251325a9e53339bb4203ee8ef603582015260550190565b7fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f2f3bb9d145010e257f2a5cec368952d4f239b38600c73438ef8e7f5c81c8bee7603582015260550190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611297608083018461485a565b73ffffffffffffffffffffffffffffffffffffffff97881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8516825283602083015260606040830152612da7606083018461485a565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b60006020825261335a602083018461485a565b60208082526023908201527f496d7065726d6178526f757465723a20554e415554484f52495a45445f43414c60408201527f4c45520000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f496d7065726d6178526f757465723a20494e53554646494349454e545f415f4160408201527f4d4f554e54000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260408201527f616e7366657246726f6d206661696c6564000000000000000000000000000000606082015260800190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527f20455448207472616e73666572206661696c6564000000000000000000000000606082015260800190565b60208082526021908201527f496d7065726d6178526f757465723a2053454e4445525f4e4f545f524f55544560408201527f5200000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526017908201527f496d7065726d6178526f757465723a2045585049524544000000000000000000604082015260600190565b6020808252601e908201527f496d7065726d6178526f757465723a20494e4445585f544f4f5f484947480000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c60408201527f4951554944495459000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60408201527f7700000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f496d7065726d6178526f757465723a2052454445454d5f5a45524f0000000000604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4160408201527f4d4f554e54000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f496d7065726d6178526f757465723a204e4f545f574554480000000000000000604082015260600190565b6020808252602d908201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260408201527f616e73666572206661696c656400000000000000000000000000000000000000606082015260800190565b60208082526025908201527f496d7065726d6178526f757465723a20494e53554646494349454e545f425f4160408201527f4d4f554e54000000000000000000000000000000000000000000000000000000606082015260800190565b815181526020808301519082015260409182015173ffffffffffffffffffffffffffffffffffffffff169181019190915260600190565b60006020825273ffffffffffffffffffffffffffffffffffffffff8084511660208401528060208501511660408401525060408301516060830152606083015160808084015261511a60a084018261485a565b949350505050565b60006020825282516003811061513457fe5b8060208401525073ffffffffffffffffffffffffffffffffffffffff602084015116604083015260ff6040840151166060830152606083015160808084015261511a60a084018261485a565b600060a08201905073ffffffffffffffffffffffffffffffffffffffff83511682526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561520657600080fd5b604052919050565b600067ffffffffffffffff821115615224578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561526b578181015183820152602001615253565b83811115612bd05750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461529e57600080fd5b50565b6dffffffffffffffffffffffffffff8116811461529e57600080fd5b60ff8116811461529e57600080fdfea26469706673582212201f16572405807e57f838566a7b0ce236bdbb8f3f449dd74c82e87e76e3c8c2e464736f6c634300060600330000000000000000000000008c3736e2fe63cc2cd89ee228d9dbcab6ce5b767b00000000000000000000000031864bc58a47a4fc8782b4135873788e876de9eb000000000000000000000000c12e00de204d58ead5b5ce9054e94aee7747fb6c00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

0000000000000000000000008c3736e2fe63cc2cd89ee228d9dbcab6ce5b767b00000000000000000000000031864bc58a47a4fc8782b4135873788e876de9eb000000000000000000000000c12e00de204d58ead5b5ce9054e94aee7747fb6c00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _factory (address): 0x8c3736e2fe63cc2cd89ee228d9dbcab6ce5b767b
Arg [1] : _bDeployer (address): 0x31864bc58a47a4fc8782b4135873788e876de9eb
Arg [2] : _cDeployer (address): 0xc12e00de204d58ead5b5ce9054e94aee7747fb6c
Arg [3] : _WETH (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000008c3736e2fe63cc2cd89ee228d9dbcab6ce5b767b
Arg [1] : 00000000000000000000000031864bc58a47a4fc8782b4135873788e876de9eb
Arg [2] : 000000000000000000000000c12e00de204d58ead5b5ce9054e94aee7747fb6c
Arg [3] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Deployed ByteCode Sourcemap

33897:17735:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34648:10;:18;34662:4;34648:18;;34641:26;;;;33897:17735;;12:1:-1;9;2:12;51343:286:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;51343:286:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;36416:568;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;36416:568:0;;;;;;;;:::i;:::-;;;;;;;;36987:486;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;36987:486:0;;;;;;;;:::i;37805:351::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;37805:351:0;;;;;;;;:::i;38921:554::-;;;;;;;;;:::i;50264:268::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50264:268:0;;;;;;;;:::i;:::-;;;;;;;;35110:248;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;35110:248:0;;;;;;;;:::i;35647:741::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;35647:741:0;;;;;;;;:::i;39505:439::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;39505:439:0;;;;;;;;:::i;:::-;;;;;;;;;41484:681;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;41484:681:0;;;;;;;;:::i;38508:410::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;38508:410:0;;;;;;;;:::i;35361:283::-;;;;;;;;;:::i;42931:979::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;42931:979:0;;;;;;;;:::i;34070:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34070:43:0;;;:::i;46342:1129::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;46342:1129:0;;;;;;;;:::i;50979:361::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50979:361:0;;;;;;;;:::i;50035:226::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50035:226:0;;;;;;;;:::i;:::-;;;;;;;;47477:818;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;47477:818:0;;;;;;;;:::i;34117:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34117:38:0;;;:::i;33978:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33978:41:0;;;:::i;34023:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34023:43:0;;;:::i;37502:300::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;37502:300:0;;;;;;;;:::i;39947:583::-;;;;;;;;;:::i;50538:438::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50538:438:0;;;;;;;;:::i;49177:852::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;49177:852:0;;;;;;;;:::i;51343:286::-;51425:18;51445:19;51466;51505:25;51519:10;51505:13;:25::i;:::-;51492:38;;51549:28;51563:10;51575:1;51549:13;:28::i;:::-;51535:42;;51596:28;51610:10;51622:1;51596:13;:28::i;:::-;51343:286;;;;-1:-1:-1;;51343:286:0:o;36416:568::-;36585:11;36566:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;;;;;;;;;36603:48:::1;36611:9;36622:6;36630:8;36640:10;36603:7;:48::i;:::-;36656:65;::::0;;;;:34:::1;::::0;::::1;::::0;::::1;::::0;:65:::1;::::0;36691:10:::1;::::0;36667:9;;36714:6;;36656:65:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36656:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36656:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36656:65:0;;;;;;;;;;36726:18;36758:9;36747:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36747:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36747:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36747:34:0;;;;;;;;;36726:55;;36790:27;36806:10;36790:15;:27::i;:::-;36786:194;;;36825:40;::::0;;;;:28:::1;::::0;::::1;::::0;::::1;::::0;:40:::1;::::0;36854:10;;36825:40:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36825:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36825:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36825:40:0;;;;;;;;;-1:-1:-1::0;36878:39:0::1;::::0;;;;:35:::1;::::0;::::1;::::0;::::1;::::0;:39:::1;::::0;36914:2;;36878:39:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36878:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36878:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36878:39:0;;;;;;;;;36871:46;;;;;36786:194;36942:32;::::0;;;;:28:::1;::::0;::::1;::::0;::::1;::::0;:32:::1;::::0;36971:2;;36942:32:::1;;;;36786:194;34265:1;;36416:568:::0;;;;;;;;:::o;36987:486::-;37180:14;37141:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;37160:9:::1;34345;34334:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34334:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34334:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34334:34:0;;;;;;;;;34326:42;;:4;:42;;;34318:79;;;;;;;;;;;;;;37201:48:::2;37209:9;37220:6;37228:8;37238:10;37201:7;:48::i;:::-;37254:65;::::0;;;;:34:::2;::::0;::::2;::::0;::::2;::::0;:65:::2;::::0;37289:10:::2;::::0;37265:9;;37312:6;;37254:65:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;37254:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37254:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37254:65:0;;;;;;;;;-1:-1:-1::0;37339:43:0::2;::::0;;;;:28:::2;::::0;::::2;::::0;::::2;::::0;:43:::2;::::0;37376:4:::2;::::0;37339:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;37339:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37339:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37339:43:0;;;;;;;;;37387:31;::::0;;;;37327:55;;-1:-1:-1;37387:20:0::2;37393:4;37387:20;::::0;::::2;::::0;:31:::2;::::0;37327:55;;37387:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;37387:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;37387:31:0;;;;37423:45;37454:2;37458:9;37423:30;:45::i;37805:351::-:0;37963:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;37982:10:::1;34345:9;34334:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34334:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34334:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34334:34:0;;;;;;;;;34326:42;;:4;:42;;;34318:79;;;;;;;;;;;;;;37999:66:::2;38006:10;38018:9;38037:4;38044:8;38054:10;37999:6;:66::i;:::-;38070:31;::::0;;;;:20:::2;38076:4;38070:20;::::0;::::2;::::0;:31:::2;::::0;38091:9;;38070:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;38070:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;38070:31:0;;;;38106:45;38137:2;38141:9;38106:30;:45::i;:::-;34265:1:::1;37805:351:::0;;;;;;:::o;38921:554::-;39087:14;39047:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;39066:10:::1;34345:9;34334:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34334:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34334:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34334:34:0;;;;;;;;;34326:42;;:4;:42;;;34318:79;;;;;;;;;;;;;;39120:45:::2;39133:10;39145:9;39156:8;39120:12;:45::i;:::-;39108:57;;39176:4;39170:19;;;39197:9;39170:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;39170:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;39221:43:0::2;::::0;;;;:20:::2;39227:4;39221:20;::::0;-1:-1:-1;39221:20:0::2;::::0;-1:-1:-1;39221:43:0::2;::::0;-1:-1:-1;39242:10:0;;39254:9;;39221:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;39221:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;39221:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39221:43:0;;;;;;;;;39214:51;;;;39326:12;::::0;;39319:1:::2;39326:12:::0;;;::::2;::::0;::::2;::::0;;;;39270:69;;;;:30:::2;::::0;::::2;::::0;::::2;::::0;:69:::2;::::0;39301:8;;39319:1;;39270:69;;;::::2;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;39270:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;39270:69:0;;;;39394:9;39382;:21;39378:92;;;39405:65;39436:10;39460:9;39448;:21;39405:30;:65::i;:::-;34265:1:::1;38921:554:::0;;;;;;:::o;50264:268::-;50348:7;50383:10;50366:39;;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50366:41:0;;;;;;;;;;;-1:-1:-1;50366:41:0;;;101:4:-1;50366:41:0;80:15:-1;;;97:9;76:31;65:43;;113:20;;;50366:41:0;;;;;;;;;;50362:166;;-1:-1:-1;50512:10:0;50505:17;;50362:166;50438:15;;;;50434:29;;50462:1;-1:-1:-1;50455:8:0;;50434:29;50476:10;50469:17;;;50362:166;50264:268;;;:::o;35110:248::-;35252:11;35233:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;35277:76:::1;35283:9;35305;35294:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35294:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35294:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35294:34:0;;;;;;;;;35330:6;35338:10;35350:2;35277:5;:76::i;:::-;35270:83:::0;35110:248;-1:-1:-1;;;;;;35110:248:0:o;35647:741::-;35829:11;35810:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;35847:18:::1;35879:9;35868:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35868:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35868:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35868:34:0;;;;;;;;;35847:55;;35911:27;35927:10;35911:15;:27::i;:::-;35907:477;;;35946:21;35987:10;35970:39;;;:41;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;35970:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;35970:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35970:41:0;;;;;;;;;35946:65;;36017:52;36025:13;36040:6;36048:8;36058:10;;36017:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36017:7:0::1;::::0;-1:-1:-1;;;36017:52:0:i:1;:::-;36075:78;36107:13;36122:10;36134;36146:6;36075:31;:78::i;:::-;36159:44;::::0;;;;:33:::1;::::0;::::1;::::0;::::1;::::0;:44:::1;::::0;36193:9;;36159:44:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36159:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36159:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36159:44:0;;;;;;;;;-1:-1:-1::0;36216:30:0::1;::::0;;;;:26:::1;::::0;::::1;::::0;::::1;::::0;:30:::1;::::0;36243:2;;36216:30:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;36216:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;36216:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36216:30:0;;;;;;;;;36209:37;;;;;;35907:477;36264:49;36272:10;36284:6;36292:8;36302:10;;36264:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;36264:7:0::1;::::0;-1:-1:-1;;;36264:49:0:i:1;:::-;36326:52;36332:9;36343:10;36355:6;36363:10;36375:2;36326:5;:52::i;:::-;36319:59;;;34265:1;35647:741:::0;;;;;;;;;:::o;39505:439::-;39677:11;39690:16;39658:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;39722:45:::1;39735:10;39747:9;39758:8;39722:12;:45::i;:::-;39713:54;;39772:101;39816:10;39804:34;;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39804:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39804:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39804:36:0;;;;;;;;;39842:10;39854;39866:6;39772:31;:101::i;:::-;39892:47;::::0;;;;:33:::1;::::0;::::1;::::0;::::1;::::0;:47:::1;::::0;39926:8;;39936:2;;39892:47:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;39892:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;39892:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;39892:47:0;;;;;;;;;39878:61;;39505:439:::0;;;;;;;;;:::o;41484:681::-;41747:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;41762:82:::1;41776:28;41790:10;41802:1;41776:13;:28::i;:::-;41806:14;41822:8;41832:11;;41762:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41762:13:0::1;::::0;-1:-1:-1;;;41762:82:0:i:1;:::-;41849;41863:28;41877:10;41889:1;41863:13;:28::i;:::-;41893:14;41909:8;41919:11;;41849:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;41849:13:0::1;::::0;-1:-1:-1;;;41849:82:0:i:1;:::-;41936:21;41960:28;41977:10;41960:16;:28::i;:::-;41936:52;;41994:12;42008::::0;42024:88:::1;42042:13;42057:14;42073;42089:10;42101;42024:17;:88::i;:::-;41993:119;;;;42117:43;42127:10;42139:7;42148;42157:2;42117:9;:43::i;:::-;34265:1;;;41484:681:::0;;;;;;;;;;;;:::o;38508:410::-;38661:11;38642:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;38688:45:::1;38701:10;38713:9;38724:8;38688:12;:45::i;:::-;38679:54;;38738:101;38782:10;38770:34;;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38770:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38770:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38770:36:0;;;;;;;;;38808:10;38820;38832:6;38738:31;:101::i;:::-;38900:12;::::0;;38893:1:::1;38900:12:::0;;;::::1;::::0;::::1;::::0;;;;38844:69;;;;:30:::1;::::0;::::1;::::0;::::1;::::0;:69:::1;::::0;38875:8;;38893:1;;38844:69;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;38844:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;38844:69:0;;;;38508:410:::0;;;;;;;:::o;35361:283::-;35518:11;35479:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;35498:9:::1;34345;34334:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34334:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34334:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34334:34:0;;;;;;;;;34326:42;;:4;:42;;;34318:79;;;;;;;;;;;;;;35542:4:::2;35536:19;;;35563:9;35536:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;35536:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;35536:39:0;;;;;35587:52;35593:9;35604:4;35610:9;35629:4;35636:2;35587:5;:52::i;42931:979::-:0;43123:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;43138:18:::1;43159:25;43173:10;43159:13;:25::i;:::-;43138:46;;43189:17;43221:10;43209:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43209:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43209:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43209:38:0;;;;;;;;;43189:58;;43275:1;43260:12;:16;43252:56;;;;;;;;;;;;;;43315:17;43335:46;43376:4;43335:36;43336:16:::0;;;43358:12;43335:36:::1;:22;:36;:::i;:::-;:40:::0;:46:::1;:40;:46;:::i;:::-;43315:66;;43386:55;43394:10;43406:12;43420:8;43430:10;;43386:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;43386:7:0::1;::::0;-1:-1:-1;;;43386:55:0:i:1;:::-;43483:322;::::0;;::::1;::::0;::::1;::::0;;;43446:23:::1;::::0;43483:322;43510:29:::1;43483:322;;;;43557:10;43483:322;;;;;;43590:1;43483:322;;;;;;43614:184;;;;;;;;43657:10;43614:184;;;;;;43688:12;43614:184;;;;43721:12;43614:184;;;;43752:10;43614:184;;;;43781:10;43614:184;;::::0;43603:196:::1;;;;;;;;;;;::::0;;22:32:-1;26:21;;::::1;22:32:::0;6:49;;43603:196:0;;;43483:322;;43472:334;::::1;::::0;;49:4:-1::1;43472:334:0;;;;;::::0;;22:32:-1;26:21;;::::1;22:32:::0;6:49;;43472:334:0;;;;43829:76;;;43472:334;-1:-1:-1;43829:35:0::1;::::0;::::1;::::0;::::1;::::0;:76:::1;::::0;43873:4:::1;::::0;43880:12;;43472:334;;43829:76:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43829:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43829:76:0;;;;34265:1;;;;42931:979:::0;;;;;;;;:::o;34070:43::-;;;:::o;46342:1129::-;46498:28;;:::i;:::-;46529:30;;;;46540:4;46529:30;;;46498:61;;46564:22;46589:64;46603:10;:21;;;46626:10;:26;;;46589:13;:64::i;:::-;46564:89;-1:-1:-1;46765:23:0;;;46783:4;46765:23;46757:69;;;;;;;;;;;;;;46839:10;:28;;;;46831:76;;;;;;;;;;;;;;46939:31;46916:19;;:54;;;;;;;;;46912:554;;;46978:36;;:::i;:::-;47028:10;:15;;;47017:58;;;;;;;;;;;;;;46978:97;;47081:71;47102:10;:21;;;47125:1;:9;;;47136:1;:9;;;47147:1;:4;;;47081:20;:71::i;:::-;46912:554;;;;47194:16;47171:19;;:39;;;;;;;;;47167:299;;;47218:24;;:::i;:::-;47256:10;:15;;;47245:46;;;;;;;;;;;;;;47218:73;;47297:19;47319:39;47333:10;:21;;;47356:1;47319:13;:39::i;:::-;47396:10;;47408;;;;47420:14;;;;;47436:6;;;;47364:79;;;;;47297:61;;-1:-1:-1;47364:31:0;;;;;;:79;;47396:10;;47408;;47420:14;47364:79;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47364:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47364:79:0;;;;47167:299;;;;50979:361;51060:18;51156:9;51198:7;51207:10;51181:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;51181:37:0;;;51171:48;;;;;;51121:211;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;51121:211:0;;;51111:222;;49:4:-1;51111:222:0;;;;;50979:361;-1:-1:-1;;50979:361:0:o;50035:226::-;50117:4;50149:10;50132:44;;;:46;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50132:46:0;;;;;;;;;;;-1:-1:-1;50132:46:0;;;101:4:-1;50132:46:0;80:15:-1;;;97:9;76:31;65:43;;113:20;;;50132:46:0;;;;;;;;;;50128:129;;-1:-1:-1;50246:5:0;50239:12;;50128:129;50214:6;-1:-1:-1;50207:13:0;;47477:818;47605:28;;:::i;:::-;47636:30;;;;47647:4;47636:30;;;47605:61;;47671:22;47696:36;47710:10;:21;;;47696:13;:36::i;:::-;47671:61;-1:-1:-1;47844:23:0;;;47862:4;47844:23;47836:69;;;;;;;;;;;;;;47918:10;:28;;;;47910:76;;;;;;;;;;;;;;48018:29;47995:19;;:52;;;;;;;;;47991:299;;;48055:34;;:::i;:::-;48103:10;:15;;;48092:56;;;;;;;;;;;;;;48055:93;;48154:113;48173:10;:21;;;48196:1;:10;;;48208:1;:14;;;48224:1;:14;;;48240:1;:12;;;48254:1;:12;;;48154:18;:113::i;47991:299::-;47477:818;;;;;;:::o;34117:38::-;;;:::o;33978:41::-;;;:::o;34023:43::-;;;:::o;37502:300::-;37654:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;37669:55:::1;37683:10;37695:6;37703:8;37713:10;37669:13;:55::i;:::-;37784:12;::::0;;37794:1:::1;37784:12:::0;;::::1;::::0;::::1;::::0;;;;37729:68;;;;:30:::1;::::0;::::1;::::0;::::1;::::0;:68:::1;::::0;37760:10:::1;::::0;37772:2;;37776:6;;37729:68;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;37729:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;37729:68:0;;;;37502:300:::0;;;;;;:::o;39947:583::-;40132:14;40148:16;40092:8;34217:15;34205:8;:27;;34197:63;;;;;;;;;;;;;;40111:10:::1;34345:9;34334:32;;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;34334:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;34334:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34334:34:0;;;;;;;;;34326:42;;:4;:42;;;34318:79;;;;;;;;;;;;;;40183:45:::2;40196:10;40208:9;40219:8;40183:12;:45::i;:::-;40171:57;;40239:4;40233:19;;;40260:9;40233:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;40233:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;40284:43:0::2;::::0;;;;:20:::2;40290:4;40284:20;::::0;-1:-1:-1;40284:20:0::2;::::0;-1:-1:-1;40284:43:0::2;::::0;-1:-1:-1;40305:10:0;;40317:9;;40284:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;40284:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;40284:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40284:43:0;;;;;;;;;40277:51;;;;40347:47;::::0;;;;:33:::2;::::0;::::2;::::0;::::2;::::0;:47:::2;::::0;40381:8;;40391:2;;40347:47:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;40347:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;40347:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40347:47:0;;;;;;;;;40333:61;;40449:9;40437;:21;40433:92;;;40460:65;40491:10;40515:9;40503;:21;40460:30;:65::i;:::-;34265:1:::1;39947:583:::0;;;;;;;;:::o;50538:438::-;50632:18;50673:1;50665:5;:9;;;50657:52;;;;;;;;;;;;;;50785:9;50827:7;50836:10;50848:5;50810:44;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;50810:44:0;;;50800:55;;;;;;50750:218;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;50750:218:0;;;50740:229;;49:4:-1;50740:229:0;;;;;50538:438;-1:-1:-1;;;50538:438:0:o;49177:852::-;49351:12;49365;49385:13;49400;49433;49418:41;;;:43;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49418:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49418:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49418:43:0;;;;;;;;;49384:77;;;;;;;;;49466:19;49488:58;49511:14;49527:8;49537;49488:22;:58::i;:::-;49466:80;;49573:14;49555;:32;49551:474;;49621:10;49603:14;:28;;49595:78;;;;;;;;;;;;;;49701:14;;-1:-1:-1;49717:14:0;-1:-1:-1;49717:14:0;49551:474;;;49750:19;49772:58;49795:14;49811:8;49821;49772:22;:58::i;:::-;49750:80;;49861:14;49843;:32;;49836:40;;;;49908:10;49890:14;:28;;49882:78;;;;;;;;;;;;;;49988:14;-1:-1:-1;50004:14:0;;-1:-1:-1;49551:474:0;49177:852;;;;;;;;;;;:::o;48327:413::-;48460:17;;48456:35;;48484:7;;48456:35;48496:15;48513:7;48522:9;48533;48557:10;48546:55;;;;;;;;;;;;;;48495:106;;;;;;;;48606:10;48619;:30;;48643:6;48619:30;;;48637:2;48619:30;48654:81;;;;;48606:43;;-1:-1:-1;48654:28:0;;;;;;:81;;48683:10;;48703:4;;48606:43;;48717:8;;48727:1;;48730;;48733;;48654:81;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48654:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48654:81:0;;;;48327:413;;;;;;;;;;:::o;29055:217::-;29168:12;;;29128;29168;;;;;;;;;29146:7;;;;29161:5;;29146:35;;;;;;;;;;;;;;;;;;;;;;;;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;;29127:54:0;;;29200:7;29192:72;;;;;;;;;;;;;;29055:217;;;:::o;38183:322::-;38299:11;38329:10;38317:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38317:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38384:47:0;;;;;38362:19;;-1:-1:-1;38384:37:0;;;;-1:-1:-1;38384:37:0;;:47;;38422:8;;38384:47;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38384:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38384:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38384:47:0;;;;;;;;;38362:69;;38457:14;38445:9;:26;:55;;38486:14;38445:55;;;38474:9;38445:55;38436:64;38183:322;-1:-1:-1;;;;;38183:322:0:o;34752:355::-;34887:11;34909:21;;;34925:4;34909:21;34905:153;;;34932:53;34960:5;34967:9;34978:6;34932:27;:53::i;:::-;34905:153;;;34995:63;35027:5;35034:4;35040:9;35051:6;34995:31;:63::i;:::-;35072:30;;;;;:26;;;;;;:30;;35099:2;;35072:30;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;35072:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35072:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35072:30:0;;;;;;;;28549:498;28774:12;28788:17;28809:5;:10;;28843;28855:4;28861:2;28865:5;28820:51;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28820:51:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;28820:51:0;28809:63;;;;;;;;;;;;;;;;;;;;;;;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;;28773:99:0;;;;28905:7;:57;;;;-1:-1:-1;28917:11:0;;:16;;:44;;;28948:4;28937:24;;;;;;;;;;;;;;28883:156;;;;;;;;;;;;;48743:428;48883:17;;48879:35;;48907:7;;48879:35;48919:15;48936:7;48945:9;48956;48980:10;48969:55;;;;;;;;;;;;;;48918:106;;;;;;;;49029:10;49042;:30;;49066:6;49042:30;;;49060:2;49042:30;49077:89;;;;;49029:43;;-1:-1:-1;49077:36:0;;;;;;:89;;49114:10;;49134:4;;49029:43;;49148:8;;49158:1;;49161;;49164;;49077:89;;;;40570:911;40688:19;40710:28;40724:10;40736:1;40710:13;:28::i;:::-;40688:50;;40765:24;40803:234;;;;;;;;40830:31;40803:234;;;;;;;;;;;;40879:10;40803:234;;;;;;40912:1;40803:234;;;;;;40936:94;;;;;;;;40980:7;40936:94;;;;41003:7;40936:94;;;;41021:2;40936:94;;;;;40925:106;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;40925:106:0;;;40803:234;;40792:246;;;;49:4:-1;40792:246:0;;;;;;;22:32:-1;26:21;;;22:32;6:49;;41107:257:0;;;;;;40792:246;-1:-1:-1;41069:24:0;;30:7:-1;41134:16:0;41107:257;;;;41168:10;41107:257;;;;;;41201:1;41107:257;;;;;;41225:132;;;;;;;;41258:10;41225:132;;;;;;41293:4;41225:132;;;;;;41319:7;41225:132;;;;41339:11;41225:132;;;41214:144;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;41214:144:0;;;41107:257;;41096:269;;;;49:4:-1;41096:269:0;;;;;;;22:32:-1;26:21;;;22:32;6:49;;41096:269:0;;;;41395:80;;;41096:269;-1:-1:-1;41395:31:0;;;;;;:80;;41427:10;;41447:4;;41454:7;;41096:269;;41395:80;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41395:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41395:80:0;;;;40570:911;;;;;;;:::o;23511:471::-;23569:7;23814:6;23810:47;;-1:-1:-1;23844:1:0;23837:8;;23810:47;23881:5;;;23885:1;23881;:5;:1;23905:5;;;;;:10;23897:56;;;;;;;;;;;;;;23973:1;-1:-1:-1;23511:471:0;;;;;:::o;25169:132::-;25227:7;25254:39;25258:1;25261;25254:39;;;;;;;;;;;;;;;;;:3;:39::i;42170:719::-;42300:18;42320:19;42341;42364:26;42379:10;42364:14;:26::i;:::-;42299:91;;;;;;42395:21;42419:28;42436:10;42419:16;:28::i;:::-;42395:52;;42488:90;42528:11;42516:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42516:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42516:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42516:37:0;;;;;;;;;42555:13;42570:7;42488:27;:90::i;:::-;42583;42623:11;42611:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42611:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42611:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42611:37:0;;;;;;;;;42650:13;42665:7;42583:27;:90::i;:::-;42702:27;42718:10;42702:15;:27::i;:::-;42698:79;;;42731:46;;;;;:34;;;;;;:46;;42766:10;;42731:46;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42731:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42731:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42731:46:0;;;;;;;;;;42698:79;42782:43;;;;;:31;;;;;;:43;;42814:10;;42782:43;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42782:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42782:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42782:43:0;;;;;;;;;-1:-1:-1;42852:32:0;;;;;:28;;;;;;:32;;42881:2;;42852:32;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42852:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42852:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42852:32:0;;;;;;;;;;42170:719;;;;;;;;:::o;43915:1201::-;44098:18;44118:19;44139;44162:26;44177:10;44162:14;:26::i;:::-;44097:91;;;;;;44193:14;44222:11;44210:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44210:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44210:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44210:37:0;;;;;;;;;44193:54;;44252:14;44281:11;44269:35;;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44269:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44269:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44269:37:0;;;;;;;;;44252:54;;44311:21;44335:28;44352:10;44335:16;:28::i;:::-;44390:61;;;;;44311:52;;-1:-1:-1;44390:35:0;;;;;;:61;;44405:10;;44438:12;;44390:61;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44390:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44390:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44390:61:0;;;;;;;;;;44532:27;44548:10;44532:15;:27::i;:::-;44528:83;;;44561:50;;;;;:35;;;;;;:50;;44597:13;;44561:50;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44561:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44561:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44561:50:0;;;;;;;;;;44528:83;44617:15;44634;44668:13;44653:34;;;44696:4;44653:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44653:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44653:49:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44653:49:0;;;;;;;;;44616:86;;;;44729:10;44715;:24;;44707:74;;;;;;;;;;;;;;44808:10;44794;:24;;44786:74;;;;;;;;;;;;;;44888:58;44904:11;44917:6;44925:8;44935:10;44888:15;:58::i;:::-;44951;44967:11;44980:6;44988:8;44998:10;44951:15;:58::i;:::-;45051:10;45039:36;;;45076:8;45086:10;45098:12;45039:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45039:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45039:72:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45039:72:0;;;;;;;;31010:321;31092:12;31135:1;31125:7;:11;31117:61;;;;;;;;;;;;;;31208:1;31197:8;:12;:28;;;;;31224:1;31213:8;:12;31197:28;31189:81;;;;;;;;;;;;;;31315:8;31291:21;:7;31303:8;31291:21;:11;:21;:::i;:::-;:32;;;;;;;31010:321;-1:-1:-1;;;;31010:321:0:o;28092:449::-;28278:12;28292:17;28313:5;:10;;28347;28359:2;28363:5;28324:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;28324:45:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;28324:45:0;28313:57;;;;;;;;;;;;;;;;;;;;;;;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;;28277:93:0;;;;28403:7;:57;;;;-1:-1:-1;28415:11:0;;:16;;:44;;;28446:4;28435:24;;;;;;;;;;;;;;28381:152;;;;;;;;;;;;;;28092:449;;;;;:::o;25789:345::-;25875:7;25977:12;25970:5;25962:28;;;;;;;;;;;;;;;;26001:9;26017:1;26013;:5;;;;;;;25789:345;-1:-1:-1;;;;;25789:345:0:o;45122:644::-;45265:11;45279:45;45292:10;45304:9;45315:8;45279:12;:45::i;:::-;45265:59;;45329:54;45357:5;45364:10;45376:6;45329:27;:54::i;:::-;45444:12;;;45437:1;45444:12;;;;;;;;;;45388:69;;;;:30;;;;;;:69;;45419:8;;45437:1;;45388:69;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45388:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45388:69:0;;;;45500:6;45488:9;:18;45484:278;;;45514:17;45546:6;45534:9;:18;45514:38;;45571:4;45562:13;;:5;:13;;;45558:198;;;45586:34;;;;;:20;45592:4;45586:20;;;;:34;;45607:12;;45586:34;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45586:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45586:34:0;;;;45627:54;45658:8;45668:12;45627:30;:54::i;:::-;45558:198;;;45698:58;45726:5;45733:8;45743:12;45698:27;:58::i;33897:17735::-;;;;;;;;;;;-1:-1:-1;33897:17735:0;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;33897:17735:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;573:336;;;687:3;680:4;672:6;668:17;664:27;654:2;;-1:-1;;695:12;654:2;-1:-1;725:20;;765:18;754:30;;751:2;;;-1:-1;;787:12;751:2;831:4;823:6;819:17;807:29;;882:3;831:4;862:17;823:6;848:32;;845:41;842:2;;;899:1;;889:12;842:2;647:262;;;;;;918:440;;1019:3;1012:4;1004:6;1000:17;996:27;986:2;;-1:-1;;1027:12;986:2;1074:6;1061:20;1096:64;1111:48;1152:6;1111:48;;;1096:64;;;1087:73;;1180:6;1173:5;1166:21;1284:3;1216:4;1275:6;1208;1266:16;;1263:25;1260:2;;;1301:1;;1291:12;1260:2;54715:6;1216:4;1208:6;1204:17;1216:4;1242:5;1238:16;54692:30;54771:1;54753:16;;;1216:4;54753:16;54746:27;1242:5;979:379;-1:-1;;979:379;6237:126;6302:20;;6327:31;6302:20;6327:31;;6507:241;;6611:2;6599:9;6590:7;6586:23;6582:32;6579:2;;;-1:-1;;6617:12;6579:2;85:6;72:20;97:33;124:5;97:33;;6755:263;;6870:2;6858:9;6849:7;6845:23;6841:32;6838:2;;;-1:-1;;6876:12;6838:2;226:6;220:13;238:33;265:5;238:33;;7025:617;;;;;7180:3;7168:9;7159:7;7155:23;7151:33;7148:2;;;-1:-1;;7187:12;7148:2;85:6;72:20;97:33;124:5;97:33;;;7239:63;-1:-1;7339:2;7378:22;;72:20;97:33;72:20;97:33;;;7347:63;-1:-1;7447:2;7486:22;;72:20;97:33;72:20;97:33;;;7142:500;;;;-1:-1;7455:63;;7555:2;7594:22;5887:20;;-1:-1;;7142:500;7649:491;;;;7787:2;7775:9;7766:7;7762:23;7758:32;7755:2;;;-1:-1;;7793:12;7755:2;85:6;72:20;97:33;124:5;97:33;;;7845:63;-1:-1;7945:2;7984:22;;72:20;97:33;72:20;97:33;;;7749:391;;7953:63;;-1:-1;;;8053:2;8092:22;;;;5887:20;;7749:391;8147:741;;;;;;8321:3;8309:9;8300:7;8296:23;8292:33;8289:2;;;-1:-1;;8328:12;8289:2;85:6;72:20;97:33;124:5;97:33;;;8380:63;-1:-1;8480:2;8519:22;;72:20;97:33;72:20;97:33;;;8488:63;-1:-1;8588:2;8627:22;;5887:20;;-1:-1;8724:2;8709:18;;8696:32;8748:18;8737:30;;8734:2;;;-1:-1;;8770:12;8734:2;8808:64;8864:7;8855:6;8844:9;8840:22;8808:64;;;8283:605;;;;-1:-1;8283:605;;-1:-1;8798:74;;;8283:605;-1:-1;;;8283:605;8895:743;;;;;;9067:3;9055:9;9046:7;9042:23;9038:33;9035:2;;;-1:-1;;9074:12;9035:2;85:6;72:20;97:33;124:5;97:33;;;9126:63;-1:-1;9226:2;9265:22;;5887:20;;-1:-1;9334:2;9373:22;;72:20;97:33;72:20;97:33;;;9342:63;-1:-1;9442:2;9481:22;;72:20;97:33;72:20;97:33;;;9029:609;;;;-1:-1;9029:609;;9550:3;9590:22;5887:20;;9029:609;-1:-1;;9029:609;9645:617;;;;;9800:3;9788:9;9779:7;9775:23;9771:33;9768:2;;;-1:-1;;9807:12;9768:2;85:6;72:20;97:33;124:5;97:33;;;9859:63;-1:-1;9959:2;9998:22;;5887:20;;-1:-1;10067:2;10106:22;;72:20;97:33;72:20;97:33;;10269:867;;;;;;;10460:3;10448:9;10439:7;10435:23;10431:33;10428:2;;;-1:-1;;10467:12;10428:2;85:6;72:20;97:33;124:5;97:33;;;10519:63;-1:-1;10619:2;10658:22;;5887:20;;-1:-1;10727:2;10766:22;;72:20;97:33;72:20;97:33;;;10735:63;-1:-1;10835:2;10874:22;;5887:20;;-1:-1;10971:3;10956:19;;10943:33;10996:18;10985:30;;10982:2;;;-1:-1;;11018:12;10982:2;11056:64;11112:7;11103:6;11092:9;11088:22;11056:64;;;10422:714;;;;-1:-1;10422:714;;-1:-1;10422:714;;11046:74;;10422:714;-1:-1;;;10422:714;11143:847;;;;;;11324:3;11312:9;11303:7;11299:23;11295:33;11292:2;;;-1:-1;;11331:12;11292:2;85:6;72:20;97:33;124:5;97:33;;;11383:63;-1:-1;11483:2;11522:22;;5887:20;;-1:-1;11591:2;11630:22;;72:20;97:33;72:20;97:33;;;11599:63;-1:-1;11699:2;11738:22;;5887:20;;-1:-1;11835:3;11820:19;;11807:33;11860:18;11849:30;;11846:2;;;-1:-1;;11882:12;11846:2;11912:62;11966:7;11957:6;11946:9;11942:22;11912:62;;;11902:72;;;11286:704;;;;;;;;;11997:615;;;;;12154:2;12142:9;12133:7;12129:23;12125:32;12122:2;;;-1:-1;;12160:12;12122:2;85:6;72:20;97:33;124:5;97:33;;;12212:63;-1:-1;12312:2;12351:22;;5887:20;;-1:-1;12448:2;12433:18;;12420:32;12472:18;12461:30;;12458:2;;;-1:-1;;12494:12;12458:2;12532:64;12588:7;12579:6;12568:9;12564:22;12532:64;;;12116:496;;;;-1:-1;12522:74;-1:-1;;;;12116:496;12619:743;;;;;;12791:3;12779:9;12770:7;12766:23;12762:33;12759:2;;;-1:-1;;12798:12;12759:2;85:6;72:20;97:33;124:5;97:33;;;12850:63;12950:2;12989:22;;5887:20;;-1:-1;13058:2;13097:22;;5887:20;;13166:2;13205:22;;5887:20;;-1:-1;13274:3;13314:22;5887:20;;-1:-1;12753:609;-1:-1;;;12753:609;13369:1497;;;;;;;;;;;;13648:3;13636:9;13627:7;13623:23;13619:33;13616:2;;;-1:-1;;13655:12;13616:2;97:33;85:6;72:20;97:33;;;85:6;72:20;13707:63;;13807:2;13850:9;13846:22;5887:20;13815:63;;13915:2;13958:9;13954:22;5887:20;13923:63;;14023:2;14066:9;14062:22;5887:20;14031:63;;14131:3;14175:9;14171:22;5887:20;14140:63;;97:33;14240:3;14284:9;14280:22;72:20;97:33;;;14240:3;14284:9;14280:22;72:20;14249:63;;14349:3;14393:9;14389:22;5887:20;14358:63;;14511:18;;14486:3;14475:9;14471:19;14458:33;14500:30;14497:2;;;-1:-1;;14533:12;14497:2;14571:64;14627:7;14486:3;14475:9;14471:19;14458:33;14607:9;14603:22;14571:64;;;14561:74;;-1:-1;14561:74;-1:-1;14700:3;14685:19;;14672:33;14714:30;-1:-1;14711:2;;;-1:-1;;14747:12;14711:2;;14786:64;14842:7;14700:3;14689:9;14685:19;14672:33;14822:9;14818:22;14786:64;;;14775:75;;;;;;;;13610:1256;;;;;;;;;;;;;;;14873:993;;;;;;;;15081:3;15069:9;15060:7;15056:23;15052:33;15049:2;;;-1:-1;;15088:12;15049:2;85:6;72:20;97:33;124:5;97:33;;;15140:63;-1:-1;15240:2;15279:22;;5887:20;;-1:-1;15348:2;15387:22;;5887:20;;-1:-1;15456:2;15495:22;;5887:20;;-1:-1;15564:3;15604:22;;5887:20;;-1:-1;15701:3;15686:19;;15673:33;15726:18;15715:30;;15712:2;;;-1:-1;;15748:12;15712:2;15786:64;15842:7;15833:6;15822:9;15818:22;15786:64;;;15043:823;;;;-1:-1;15043:823;;-1:-1;15043:823;;;;15776:74;;-1:-1;;;15043:823;15873:362;;;15992:2;15980:9;15971:7;15967:23;15963:32;15960:2;;;-1:-1;;15998:12;15960:2;85:6;72:20;97:33;124:5;97:33;;;16050:63;-1:-1;16150:2;16187:22;;6302:20;6327:31;6302:20;6327:31;;;16158:61;;;;15954:281;;;;;;16242:257;;16354:2;16342:9;16333:7;16329:23;16325:32;16322:2;;;-1:-1;;16360:12;16322:2;364:6;358:13;56065:5;53242:13;53235:21;56043:5;56040:32;56030:2;;-1:-1;;56076:12;16506:662;;;;;16667:3;16655:9;16646:7;16642:23;16638:33;16635:2;;;-1:-1;;16674:12;16635:2;364:6;358:13;56065:5;53242:13;53235:21;56043:5;56040:32;56030:2;;-1:-1;;56076:12;56030:2;16834;16882:22;;6446:13;16726:71;;-1:-1;6464:31;6446:13;6464:31;;;16951:2;17001:22;;496:13;17070:2;17120:22;;;496:13;16629:539;;16842:72;;-1:-1;16629:539;-1:-1;;;16629:539;17175:353;;17335:2;17323:9;17314:7;17310:23;17306:32;17303:2;;;-1:-1;;17341:12;17303:2;2211:20;17335:2;2211:20;;;6041:6;6035:13;2298:16;2291:86;2441:2;2510:9;2506:22;6035:13;2441:2;2460:5;2456:16;2449:86;2594:2;2663:9;2659:22;220:13;238:33;265:5;238:33;;;2594:2;2609:16;;2602:86;2613:5;17297:231;-1:-1;;;17297:231;17535:408;;17683:2;;17671:9;17662:7;17658:23;17654:32;17651:2;;;-1:-1;;17689:12;17651:2;17740:17;17734:24;17778:18;;17770:6;17767:30;17764:2;;;-1:-1;;17800:12;17764:2;17910:6;17899:9;17895:22;2887:4;2875:9;2870:3;2866:19;2862:30;2859:2;;;-1:-1;;2895:12;2859:2;2923:20;2887:4;2923:20;;;2914:29;;226:6;220:13;238:33;265:5;238:33;;;3004:86;;3220:22;;;220:13;238:33;220:13;238:33;;;3170:16;;;3163:86;3318:2;3383:22;;;6035:13;3333:16;;;3326:86;3494:2;3479:18;;3473:25;3507:30;;;3504:2;;;-1:-1;;3540:12;3504:2;3626:22;;-1:-1;1472:4;1460:17;;1456:27;-1:-1;1446:2;;-1:-1;;1487:12;1446:2;1527:6;1521:13;1549:64;1564:48;1605:6;1564:48;;1549:64;1633:6;1626:5;1619:21;1737:3;17683:2;1728:6;1661;1719:16;;1716:25;1713:2;;;-1:-1;;1744:12;1713:2;1764:39;1796:6;17683:2;1695:5;1691:16;17683:2;1661:6;1657:17;1764:39;;;3494:2;3567:16;;3560:95;-1:-1;3571:5;;17645:298;-1:-1;;;;;17645:298;17950:383;;18082:2;18070:9;18061:7;18057:23;18053:32;18050:2;;;-1:-1;;18088:12;18050:2;18146:17;18133:31;18184:18;;18176:6;18173:30;18170:2;;;-1:-1;;18206:12;18170:2;18300:6;18289:9;18285:22;3833:4;3821:9;3816:3;3812:19;3808:30;3805:2;;;-1:-1;;3841:12;3805:2;3869:20;3833:4;3869:20;;;3860:29;;1910:6;1897:20;56308:1;56301:5;56298:12;56288:2;;-1:-1;;56314:12;56288:2;3950:88;;4138:49;4183:3;18082:2;4159:22;;4138:49;;;18082:2;4124:5;4120:16;4113:75;4293:47;4336:3;4260:2;4316:9;4312:22;4293:47;;;4260:2;4279:5;4275:16;4268:73;4430:2;4419:9;4415:18;4402:32;18184:18;4446:6;4443:30;4440:2;;;-1:-1;;4476:12;4440:2;4521:58;4575:3;4566:6;4555:9;4551:22;4521:58;;;4430:2;4503:16;;4496:84;-1:-1;4507:5;;18044:289;-1:-1;;;;;18044:289;18340:350;;18498:3;18486:9;18477:7;18473:23;18469:33;18466:2;;;-1:-1;;18505:12;18466:2;4835:20;18498:3;4835:20;;;226:6;220:13;238:33;265:5;238:33;;;4941:60;4923:16;4916:86;;5071:2;5140:9;5136:22;6035:13;5071:2;5090:5;5086:16;5079:86;5234:2;5303:9;5299:22;6035:13;5234:2;5253:5;5249:16;5242:86;5395:2;5464:9;5460:22;6035:13;5395:2;5414:5;5410:16;5403:86;5556:3;5626:9;5622:22;6035:13;5556:3;5576:5;5572:16;5565:86;18557:117;;;;18460:230;;;;;18697:533;;;;18845:2;18833:9;18824:7;18820:23;18816:32;18813:2;;;-1:-1;;18851:12;18813:2;5763:6;5757:13;5775:33;5802:5;5775:33;;;19014:2;19064:22;;5757:13;18903:74;;-1:-1;5775:33;5757:13;5775:33;;;19133:2;19182:22;;6175:13;19022:74;;-1:-1;53881:10;53870:22;;56646:34;;56636:2;;-1:-1;;56684:12;56636:2;19141:73;;;;18807:423;;;;;;19237:263;;19352:2;19340:9;19331:7;19327:23;19323:32;19320:2;;;-1:-1;;19358:12;19320:2;-1:-1;6035:13;;19314:186;-1:-1;19314:186;19507:399;;;19639:2;19627:9;19618:7;19614:23;19610:32;19607:2;;;-1:-1;;19645:12;19607:2;-1:-1;;6035:13;;19808:2;19858:22;;;6035:13;;;;;-1:-1;19601:305;20841:323;;20973:5;52097:12;52372:6;52367:3;52360:19;21056:52;21101:6;52409:4;52404:3;52400:14;52409:4;21082:5;21078:16;21056:52;;;55526:2;55506:14;55522:7;55502:28;21120:39;;;;52409:4;21120:39;;20921:243;-1:-1;;20921:243;33408:383;55717:14;55721:2;55717:14;;;;;20381:58;;55717:14;;;;;33652:2;33643:12;;20381:58;33754:12;;;33543:248;33798:513;55721:2;55717:14;;;;;;;20381:58;;55717:14;;;;;;;34066:2;34057:12;;20381:58;55618:3;55614:15;;;34168:12;;;33342:54;34275:11;;;33957:354;34318:262;;21681:5;52097:12;21792:52;21837:6;21832:3;21825:4;21818:5;21814:16;21792:52;;;21856:16;;;;;34443:137;-1:-1;;34443:137;34587:917;26230:66;26210:87;;55721:2;55717:14;;;;;;26195:1;26316:11;;20381:58;35190:12;;;20633:37;23210:66;35301:12;;;23190:87;23296:12;;;34924:580;35511:917;26230:66;26210:87;;55721:2;55717:14;;;;;;26195:1;26316:11;;20381:58;36114:12;;;20633:37;27736:66;36225:12;;;27716:87;27822:12;;;35848:580;36435:213;53675:42;53664:54;;;;20123:37;;36553:2;36538:18;;36524:124;36891:663;;53675:42;;53668:5;53664:54;19999:3;19992:58;53675:42;53668:5;53664:54;37308:2;37297:9;37293:18;19992:58;;20663:5;37391:2;37380:9;37376:18;20633:37;37127:3;37428:2;37417:9;37413:18;37406:48;37468:76;37127:3;37116:9;37112:19;37530:6;37468:76;;37561:907;53675:42;53664:54;;;19992:58;;53664:54;;;;38040:2;38025:18;;19992:58;38123:2;38108:18;;20633:37;;;;38206:2;38191:18;;20633:37;;;;53975:4;53964:16;38285:3;38270:19;;33096:35;38369:3;38354:19;;20633:37;38453:3;38438:19;;20633:37;;;;37859:3;37844:19;;37830:638;38475:451;53675:42;53664:54;;;19992:58;;53664:54;;;;38829:2;38814:18;;20123:37;38912:2;38897:18;;20633:37;;;;38657:2;38642:18;;38628:298;39587:535;;53675:42;53668:5;53664:54;19999:3;19992:58;20663:5;39959:2;39948:9;39944:18;20633:37;39787:2;39996;39985:9;39981:18;39974:48;40036:76;39787:2;39776:9;39772:18;40098:6;40036:76;;40129:324;53675:42;53664:54;;;20123:37;;53664:54;;40439:2;40424:18;;20123:37;40275:2;40260:18;;40246:207;41130:435;53675:42;53664:54;;;20123:37;;53664:54;;;41468:2;41453:18;;20123:37;53664:54;;;41551:2;41536:18;;20123:37;41304:2;41289:18;;41275:290;42652:324;53675:42;53664:54;;;;20123:37;;42962:2;42947:18;;20633:37;42798:2;42783:18;;42769:207;42983:201;53242:13;;53235:21;20516:34;;43095:2;43080:18;;43066:118;43191:301;;43329:2;43350:17;43343:47;43404:78;43329:2;43318:9;43314:18;43468:6;43404:78;;43499:407;43690:2;43704:47;;;22757:2;43675:18;;;52360:19;22793:34;52400:14;;;22773:55;22862:5;22848:12;;;22841:27;22887:12;;;43661:245;43913:407;44104:2;44118:47;;;23547:2;44089:18;;;52360:19;23583:34;52400:14;;;23563:55;23652:7;23638:12;;;23631:29;23679:12;;;44075:245;44327:407;44518:2;44532:47;;;23930:2;44503:18;;;52360:19;23966:34;52400:14;;;23946:55;24035:19;24021:12;;;24014:41;24074:12;;;44489:245;44741:407;44932:2;44946:47;;;24325:2;44917:18;;;52360:19;24361:34;52400:14;;;24341:55;24430:22;24416:12;;;24409:44;24472:12;;;44903:245;45155:407;45346:2;45360:47;;;24723:2;45331:18;;;52360:19;24759:34;52400:14;;;24739:55;24828:3;24814:12;;;24807:25;24851:12;;;45317:245;45569:407;45760:2;45774:47;;;25102:2;45745:18;;;52360:19;25138:25;52400:14;;;25118:46;25183:12;;;45731:245;45983:407;46174:2;46188:47;;;25434:2;46159:18;;;52360:19;25470:32;52400:14;;;25450:53;25522:12;;;46145:245;46397:407;46588:2;46602:47;;;25773:2;46573:18;;;52360:19;25809:34;52400:14;;;25789:55;25878:10;25864:12;;;25857:32;25908:12;;;46559:245;46811:407;47002:2;47016:47;;;26566:2;46987:18;;;52360:19;26602:34;52400:14;;;26582:55;26671:3;26657:12;;;26650:25;26694:12;;;46973:245;47225:407;47416:2;47430:47;;;26945:2;47401:18;;;52360:19;26981:29;52400:14;;;26961:50;27030:12;;;47387:245;47639:407;47830:2;47844:47;;;27281:2;47815:18;;;52360:19;27317:34;52400:14;;;27297:55;27386:7;27372:12;;;27365:29;27413:12;;;47801:245;48053:407;48244:2;48258:47;;;28073:2;48229:18;;;52360:19;28109:26;52400:14;;;28089:47;28155:12;;;48215:245;48467:407;48658:2;48672:47;;;28406:2;48643:18;;;52360:19;28442:34;52400:14;;;28422:55;28511:15;28497:12;;;28490:37;28546:12;;;48629:245;48881:407;49072:2;49086:47;;;28797:2;49057:18;;;52360:19;28833:34;52400:14;;;28813:55;28902:7;28888:12;;;28881:29;28929:12;;;49043:245;49295:393;29304:23;;20633:37;;29478:4;29467:16;;;29461:23;29538:14;;;20633:37;29630:4;29619:16;;;29613:23;53675:42;53664:54;29690:14;;;20123:37;;;;49503:2;49488:18;;49474:214;49695:393;;49879:2;49900:17;49893:47;53675:42;;30049:16;30043:23;53664:54;49879:2;49868:9;49864:18;20123:37;53675:42;49879:2;30211:5;30207:16;30201:23;53664:54;30278:14;49868:9;30278:14;20123:37;;30278:14;30373:5;30369:16;30363:23;30440:14;49868:9;30440:14;20633:37;30440:14;30527:5;30523:16;30517:23;29973:4;;49868:9;30560:14;30553:38;30606:71;29964:14;49868:9;29964:14;30658:12;30606:71;;;49946:132;49850:238;-1:-1;;;;49850:238;50095:373;;50269:2;50290:17;50283:47;31018:16;31012:23;55831:1;55824:5;55821:12;55811:2;;55837:9;55811:2;54218:37;50269:2;50258:9;50254:18;21956:61;;53675:42;50269:2;31193:5;31189:16;31183:23;53664:54;31260:14;50258:9;31260:14;20123:37;53975:4;31260:14;31358:5;31354:16;31348:23;53964:16;31421:14;50258:9;31421:14;33096:35;31421:14;31508:5;31504:16;31498:23;30942:4;;50258:9;31541:14;31534:38;31587:71;30933:14;50258:9;30933:14;31639:12;31587:71;;50475:386;;50679:3;50668:9;50664:19;50656:27;;53675:42;32051:16;32045:23;53664:54;20130:3;20123:37;32224:4;32217:5;32213:16;32207:23;32224:4;32288:3;32284:14;20633:37;32386:4;32379:5;32375:16;32369:23;32386:4;32450:3;32446:14;20633:37;32546:4;32539:5;32535:16;32529:23;32546:4;32610:3;32606:14;20633:37;32706:4;32699:5;32695:16;32689:23;32706:4;32770:3;32766:14;20633:37;50650:211;;;;;50868:213;20633:37;;;50986:2;50971:18;;50957:124;51088:324;20633:37;;;51398:2;51383:18;;20633:37;51234:2;51219:18;;51205:207;51419:256;51481:2;51475:9;51507:17;;;51582:18;51567:34;;51603:22;;;51564:62;51561:2;;;51639:1;;51629:12;51561:2;51481;51648:22;51459:216;;-1:-1;51459:216;51682:321;;51825:18;51817:6;51814:30;51811:2;;;-1:-1;;51847:12;51811:2;-1:-1;51924:4;51901:17;51920:9;51897:33;51988:4;51978:15;;51748:255;54788:268;54853:1;54860:101;54874:6;54871:1;54868:13;54860:101;;;54941:11;;;54935:18;54922:11;;;54915:39;54896:2;54889:10;54860:101;;;54976:6;54973:1;54970:13;54967:2;;;-1:-1;;54853:1;55023:16;;55016:27;54837:219;55860:117;53675:42;55947:5;53664:54;55922:5;55919:35;55909:2;;55968:1;;55958:12;55909:2;55903:74;;56340:117;53559:30;56427:5;53548:42;56402:5;56399:35;56389:2;;56448:1;;56438:12;56710:113;53975:4;56793:5;53964:16;56770:5;56767:33;56757:2;;56814:1;;56804:12

Swarm Source

ipfs://1f16572405807e57f838566a7b0ce236bdbb8f3f449dd74c82e87e76e3c8c2e4
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.