Overview
ETH Balance
0.110330454622245968 ETH
Eth Value
$368.08 (@ $3,336.20/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,317 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Pawn Eq... | 19046899 | 311 days ago | IN | 0 ETH | 0.00058102 | ||||
Withdraw Pawn Eq... | 19046881 | 311 days ago | IN | 0 ETH | 0.0013576 | ||||
Withdraw Pawn Eq... | 19046863 | 311 days ago | IN | 0 ETH | 0.00120663 | ||||
Withdraw Pawn Eq... | 19046732 | 311 days ago | IN | 0 ETH | 0.00131032 | ||||
Withdraw Pawn | 11945722 | 1367 days ago | IN | 0 ETH | 0.17338399 | ||||
Withdraw Pawn | 11945685 | 1367 days ago | IN | 0 ETH | 0.1542342 | ||||
Withdraw Pawn | 11664722 | 1410 days ago | IN | 0 ETH | 0.09404836 | ||||
Withdraw Pawn | 11339838 | 1460 days ago | IN | 0 ETH | 0.06003039 | ||||
Supply Pawn | 11337011 | 1460 days ago | IN | 0 ETH | 0.00843922 | ||||
Supply Pawn | 11273790 | 1470 days ago | IN | 0 ETH | 0.01055092 | ||||
Withdraw Pawn | 11227257 | 1477 days ago | IN | 0 ETH | 0.07165217 | ||||
Borrow Pawn | 11170223 | 1486 days ago | IN | 0 ETH | 0.03069649 | ||||
Supply Pawn | 11170152 | 1486 days ago | IN | 0 ETH | 0.00717469 | ||||
Withdraw Pawn | 11115956 | 1494 days ago | IN | 0 ETH | 0.04236689 | ||||
Withdraw Pawn | 11072630 | 1501 days ago | IN | 0 ETH | 0.05873042 | ||||
Withdraw Pawn | 11070139 | 1501 days ago | IN | 0 ETH | 0.040888 | ||||
Withdraw Pawn | 11006412 | 1511 days ago | IN | 0 ETH | 0.06378876 | ||||
Withdraw Pawn | 11001288 | 1512 days ago | IN | 0 ETH | 0.09426921 | ||||
Withdraw Pawn | 10943555 | 1521 days ago | IN | 0 ETH | 0.10306768 | ||||
Withdraw Pawn | 10935786 | 1522 days ago | IN | 0 ETH | 0.10509116 | ||||
Withdraw Pawn | 10923783 | 1524 days ago | IN | 0 ETH | 0.10963958 | ||||
Withdraw Pawn | 10919742 | 1525 days ago | IN | 0 ETH | 0.09 | ||||
Withdraw Pawn | 10910520 | 1526 days ago | IN | 0 ETH | 0.17170608 | ||||
Withdraw Pawn | 10909724 | 1526 days ago | IN | 0 ETH | 0.18187407 | ||||
Withdraw Pawn | 10886498 | 1530 days ago | IN | 0 ETH | 0.41857746 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19046899 | 311 days ago | 0.32763315 ETH | ||||
11945685 | 1367 days ago | 0.25129967 ETH | ||||
11227257 | 1477 days ago | 2.00767013 ETH | ||||
11115956 | 1494 days ago | 0.70320922 ETH | ||||
11072630 | 1501 days ago | 0.45207191 ETH | ||||
10992721 | 1513 days ago | 2.71209683 ETH | ||||
10976613 | 1516 days ago | 4.61592794 ETH | ||||
10910520 | 1526 days ago | 45.09333313 ETH | ||||
10886498 | 1530 days ago | 120.08393146 ETH | ||||
10885811 | 1530 days ago | 75.5987868 ETH | ||||
10885739 | 1530 days ago | 103.20723413 ETH | ||||
10871223 | 1532 days ago | 91.48853805 ETH | ||||
10860785 | 1534 days ago | 8.02318266 ETH | ||||
10849147 | 1536 days ago | 20.02861038 ETH | ||||
10834357 | 1538 days ago | 28.88646195 ETH | ||||
10834280 | 1538 days ago | 45.05611852 ETH | ||||
10834276 | 1538 days ago | 95.12337842 ETH | ||||
10831239 | 1538 days ago | 7.00002841 ETH | ||||
10828275 | 1539 days ago | 5.00651302 ETH | ||||
10826701 | 1539 days ago | 95.13682416 ETH | ||||
10826309 | 1539 days ago | 5 ETH | ||||
10825507 | 1539 days ago | 200.02856725 ETH | ||||
10824681 | 1539 days ago | 500.06290784 ETH | ||||
10823555 | 1540 days ago | 13.01564315 ETH | ||||
10823538 | 1540 days ago | 0.00008697 ETH |
Loading...
Loading
Contract Name:
PoolPawn
Compiler Version
v0.5.13+commit.5b0b510c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-01 */ /** *Submitted for verification at Etherscan.io on 2020-08-01 */ /* * Copyright (c) The Force Protocol Development Team * Submitted for verification at Etherscan.io on 2019-09-17 */ pragma solidity 0.5.13; // pragma experimental ABIEncoderV2; contract ReentrancyGuard { bool private _notEntered; constructor() internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size != 0; } } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error. */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "uint mul overflow"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, "uint div by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "uint sub overflow"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "uint add overflow"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "uint mod by zero"); return a % b; } } /** * @title ERC20 interface * @dev see https://eips.ethereum.org/EIPS/eip-20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require((value == 0) || (token.allowance(address(this), spender) == 0)); callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value ); callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. require(address(token).isContract()); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool))); } } } library addressMakePayable { function makePayable(address x) internal pure returns (address payable) { return address(uint160(x)); } } contract IOracle { function get(address token) external view returns (uint256, bool); } contract IInterestRateModel { function getLoanRate(int256 cash, int256 borrow) external view returns (int256 y); function getDepositRate(int256 cash, int256 borrow) external view returns (int256 y); function calculateBalance( int256 principal, int256 lastIndex, int256 newIndex ) external view returns (int256 y); function calculateInterestIndex( int256 Index, int256 r, int256 t ) external view returns (int256 y); function pert( int256 principal, int256 r, int256 t ) external view returns (int256 y); function getNewReserve( int256 oldReserve, int256 cash, int256 borrow, int256 blockDelta ) external view returns (int256 y); } contract PoolPawn is ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; using addressMakePayable for address; uint public constant int_max = 57896044618658097711785492504343953926634992332820282019728792003956564819967; address public admin; //the admin address address public proposedAdmin; //use pull over push pattern for admin // uint256 public constant interestRateDenomitor = 1e18; /** * @notice Container for borrow balance information * @member principal Total balance (with accrued interest), after applying the most recent balance-changing action * @member interestIndex Global borrowIndex as of the most recent balance-changing action */ // Balance struct struct Balance { uint256 principal; uint256 interestIndex; uint256 totalPnl; //total profit and loss } struct Market { uint256 accrualBlockNumber; int256 supplyRate; //存款利率 int256 demondRate; //借款利率 IInterestRateModel irm; uint256 totalSupply; uint256 supplyIndex; uint256 totalBorrows; uint256 borrowIndex; uint256 totalReserves; //系统盈利 uint256 minPledgeRate; //最小质押率 uint256 liquidationDiscount; //清算折扣 uint256 decimals; //币种的最小精度 } // Mappings of users' balance of each token mapping(address => mapping(address => Balance)) public accountSupplySnapshot; //tokenContract->address(usr)->SupplySnapshot mapping(address => mapping(address => Balance)) public accountBorrowSnapshot; //tokenContract->address(usr)->BorrowSnapshot struct LiquidateInfo { address targetAccount; //被清算账户 address liquidator; //清算人 address assetCollatera; //抵押物token地址 address assetBorrow; //债务token地址 uint256 liquidateAmount; //清算额度,抵押物 uint256 targetAmount; //目标额度, 债务 uint256 timestamp; } mapping(uint256 => LiquidateInfo) public liquidateInfoMap; uint256 public liquidateIndexes; function setLiquidateInfoMap( address _targetAccount, address _liquidator, address _assetCollatera, address _assetBorrow, uint256 x, uint256 y ) internal { LiquidateInfo memory newStruct = LiquidateInfo( _targetAccount, _liquidator, _assetCollatera, _assetBorrow, x, y, block.timestamp ); // Update liquidation record liquidateInfoMap[liquidateIndexes] = newStruct; liquidateIndexes++; } //user table mapping(uint256 => address) public accounts; mapping(address => uint256) public indexes; uint256 public index = 1; // Add new user function join(address who) internal { if (indexes[who] == 0) { accounts[index] = who; indexes[who] = index; ++index; } } event SupplyPawnLog( address usr, address t, uint256 amount, uint256 beg, uint256 end ); event WithdrawPawnLog( address usr, address t, uint256 amount, uint256 beg, uint256 end ); event BorrowPawnLog( address usr, address t, uint256 amount, uint256 beg, uint256 end ); event RepayFastBorrowLog( address usr, address t, uint256 amount, uint256 beg, uint256 end ); event LiquidateBorrowPawnLog( address usr, address tBorrow, uint256 endBorrow, address liquidator, address tCol, uint256 endCol ); event WithdrawPawnEquityLog( address t, uint256 equityAvailableBefore, uint256 amount, address owner ); mapping(address => Market) public mkts; //tokenAddress->Market address[] public collateralTokens; //抵押币种 IOracle public oracleInstance; uint256 public constant initialInterestIndex = 10**18; uint256 public constant defaultOriginationFee = 0; // default is zero bps uint256 public constant originationFee = 0; uint256 public constant ONE_ETH = 1 ether; // 增加抵押币种 function addCollateralMarket(address asset) public onlyAdmin { for (uint256 i = 0; i < collateralTokens.length; i++) { if (collateralTokens[i] == asset) { return; } } collateralTokens.push(asset); } function getCollateralMarketsLength() external view returns (uint256) { return collateralTokens.length; } function setInterestRateModel(address t, address irm) public onlyAdmin { mkts[t].irm = IInterestRateModel(irm); } function setMinPledgeRate(address t, uint256 minPledgeRate) external onlyAdmin { mkts[t].minPledgeRate = minPledgeRate; } function setLiquidationDiscount(address t, uint256 liquidationDiscount) external onlyAdmin { mkts[t].liquidationDiscount = liquidationDiscount; } function initCollateralMarket( address t, address irm, address oracle, uint256 decimals ) external onlyAdmin { if (address(oracleInstance) == address(0)) { setOracle(oracle); } Market memory m = mkts[t]; if (address(m.irm) == address(0)) { setInterestRateModel(t, irm); } addCollateralMarket(t); if (m.supplyIndex == 0) { m.supplyIndex = initialInterestIndex; } if (m.borrowIndex == 0) { m.borrowIndex = initialInterestIndex; } if (m.decimals == 0) { m.decimals = decimals; } mkts[t] = m; } constructor() public { admin = msg.sender; } //Starting from Solidity 0.4.0, contracts without a fallback function automatically revert payments, making the code above redundant. // function() external payable { // revert("fallback can't be payable"); // } modifier onlyAdmin() { require(msg.sender == admin, "only admin can do this!"); _; } function proposeNewAdmin(address admin_) external onlyAdmin { proposedAdmin = admin_; } function claimAdministration() external { require(msg.sender == proposedAdmin, "Not proposed admin."); admin = proposedAdmin; proposedAdmin = address(0); } // Set the initial timestamp of tokens function setInitialTimestamp(address token) external onlyAdmin { mkts[token].accrualBlockNumber = now; } function setDecimals(address t, uint256 decimals) external onlyAdmin { mkts[t].decimals = decimals; } function setOracle(address oracle) public onlyAdmin { oracleInstance = IOracle(oracle); } modifier existOracle() { require(address(oracleInstance) != address(0), "oracle not set"); _; } // Get price of oracle function fetchAssetPrice(address asset) public view returns (uint256, bool) { require(address(oracleInstance) != address(0), "oracle not set"); return oracleInstance.get(asset); } function valid_uint(uint r) internal view returns (int256) { require(r <= int_max, "uint r is not valid"); return int256(r); } // Get the price of assetAmount tokens function getPriceForAssetAmount(address asset, uint256 assetAmount) public view returns (uint256) { require(address(oracleInstance) != address(0), "oracle not set"); (uint256 price, bool ok) = fetchAssetPrice(asset); require(ok && price != 0, "invalid token price"); return price.mul(assetAmount).div(10**mkts[asset].decimals); } // Calc the token amount of usdValue function getAssetAmountForValue(address t, uint256 usdValue) public view returns (uint256) { require(address(oracleInstance) != address(0), "oracle not set"); (uint256 price, bool ok) = fetchAssetPrice(t); require(ok && price != 0, "invalid token price"); return usdValue.mul(10**mkts[t].decimals).div(price); } // Balance of "t" token of this contract function getCash(address t) public view returns (uint256) { // address(0) represents for eth if (t == address(0)) { return address(this).balance; } IERC20 token = IERC20(t); return token.balanceOf(address(this)); } // Balance of "asset" token of the "from" account function getBalanceOf(address asset, address from) internal view returns (uint256) { // address(0) represents for eth if (asset == address(0)) { return address(from).balance; } IERC20 token = IERC20(asset); return token.balanceOf(from); } // totalBorrows / totalSupply function loanToDepositRatio(address asset) public view returns (uint256) { uint256 loan = mkts[asset].totalBorrows; uint256 deposit = mkts[asset].totalSupply; // uint256 _1 = 1 ether; return loan.mul(ONE_ETH).div(deposit); } //m:market, a:account //i(n,m)=i(n-1,m)*(1+rm*t) //return P*(i(n,m)/i(n-1,a)) // Calc the balance of the "t" token of "acc" account function getSupplyBalance(address acc, address t) public view returns (uint256) { Balance storage supplyBalance = accountSupplySnapshot[t][acc]; int256 mSupplyIndex = mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(now - mkts[t].accrualBlockNumber) ); uint256 userSupplyCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(supplyBalance.principal), int256(supplyBalance.interestIndex), mSupplyIndex ) ); return userSupplyCurrent; } // Calc the actual USD value of "t" token of "who" account function getSupplyBalanceInUSD(address who, address t) public view returns (uint256) { return getPriceForAssetAmount(t, getSupplyBalance(who, t)); } // Calc the profit of "t" token of "acc" account function getSupplyPnl(address acc, address t) public view returns (uint256) { Balance storage supplyBalance = accountSupplySnapshot[t][acc]; int256 mSupplyIndex = mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(now - mkts[t].accrualBlockNumber) ); uint256 userSupplyCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(supplyBalance.principal), int256(supplyBalance.interestIndex), mSupplyIndex ) ); if (userSupplyCurrent > supplyBalance.principal) { return supplyBalance.totalPnl.add( userSupplyCurrent.sub(supplyBalance.principal) ); } else { return supplyBalance.totalPnl; } } // Calc the profit of "t" token of "acc" account in USD value function getSupplyPnlInUSD(address who, address t) public view returns (uint256) { return getPriceForAssetAmount(t, getSupplyPnl(who, t)); } // Gets USD all token values of supply profit function getTotalSupplyPnl(address who) public view returns (uint256 sumPnl) { uint256 length = collateralTokens.length; for (uint256 i = 0; i < length; i++) { uint256 pnl = getSupplyPnlInUSD(who, collateralTokens[i]); sumPnl = sumPnl.add(pnl); } } //m:market, a:account //i(n,m)=i(n-1,m)*(1+rm*t) //return P*(i(n,m)/i(n-1,a)) function getBorrowBalance(address acc, address t) public view returns (uint256) { Balance storage borrowBalance = accountBorrowSnapshot[t][acc]; int256 mBorrowIndex = mkts[t].irm.pert( int256(mkts[t].borrowIndex), mkts[t].demondRate, int256(now - mkts[t].accrualBlockNumber) ); uint256 userBorrowCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(borrowBalance.principal), int256(borrowBalance.interestIndex), mBorrowIndex ) ); return userBorrowCurrent; } function getBorrowBalanceInUSD(address who, address t) public view returns (uint256) { return getPriceForAssetAmount(t, getBorrowBalance(who, t)); } function getBorrowPnl(address acc, address t) public view returns (uint256) { Balance storage borrowBalance = accountBorrowSnapshot[t][acc]; int256 mBorrowIndex = mkts[t].irm.pert( int256(mkts[t].borrowIndex), mkts[t].demondRate, int256(now - mkts[t].accrualBlockNumber) ); uint256 userBorrowCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(borrowBalance.principal), int256(borrowBalance.interestIndex), mBorrowIndex ) ); return borrowBalance.totalPnl.add(userBorrowCurrent).sub( borrowBalance.principal ); } function getBorrowPnlInUSD(address who, address t) public view returns (uint256) { return getPriceForAssetAmount(t, getBorrowPnl(who, t)); } // Gets USD all token values of borrow lose function getTotalBorrowPnl(address who) public view returns (uint256 sumPnl) { uint256 length = collateralTokens.length; // uint sumPnl = 0; for (uint256 i = 0; i < length; i++) { uint256 pnl = getBorrowPnlInUSD(who, collateralTokens[i]); sumPnl = sumPnl.add(pnl); } // return sumPnl; } // BorrowBalance * collateral ratio // collateral ratio always great than 1 function getBorrowBalanceLeverage(address who, address t) public view returns (uint256) { return getBorrowBalanceInUSD(who, t).mul(mkts[t].minPledgeRate).div( ONE_ETH ); } // Gets USD token values of supply and borrow balances function calcAccountTokenValuesInternal(address who, address t) public view returns (uint256, uint256) { return (getSupplyBalanceInUSD(who, t), getBorrowBalanceInUSD(who, t)); } // Gets USD token values of supply and borrow balances function calcAccountTokenValuesLeverageInternal(address who, address t) public view returns (uint256, uint256) { return ( getSupplyBalanceInUSD(who, t), getBorrowBalanceLeverage(who, t) ); } // Gets USD all token values of supply and borrow balances function calcAccountAllTokenValuesLeverageInternal(address who) public view returns (uint256 sumSupplies, uint256 sumBorrowLeverage) { uint256 length = collateralTokens.length; for (uint256 i = 0; i < length; i++) { ( uint256 supplyValue, uint256 borrowsLeverage ) = calcAccountTokenValuesLeverageInternal( who, collateralTokens[i] ); sumSupplies = sumSupplies.add(supplyValue); sumBorrowLeverage = sumBorrowLeverage.add(borrowsLeverage); } } function calcAccountLiquidity(address who) public view returns (uint256, uint256) { uint256 sumSupplies; uint256 sumBorrowsLeverage; //sumBorrows* collateral ratio ( sumSupplies, sumBorrowsLeverage ) = calcAccountAllTokenValuesLeverageInternal(who); if (sumSupplies < sumBorrowsLeverage) { return (0, sumBorrowsLeverage.sub(sumSupplies)); //不足 } else { return (sumSupplies.sub(sumBorrowsLeverage), 0); //有余 } } struct SupplyIR { uint256 startingBalance; uint256 newSupplyIndex; uint256 userSupplyCurrent; uint256 userSupplyUpdated; uint256 newTotalSupply; uint256 currentCash; uint256 updatedCash; uint256 newBorrowIndex; } // deposit function supplyPawn(address t, uint256 amount) external payable nonReentrant { uint256 supplyAmount = amount; // address(0) represents for eth if (t == address(0)) { require(amount == msg.value, "Eth value should be equal to amount"); supplyAmount = msg.value; } else { require(msg.value == 0, "Eth should not be provided"); } SupplyIR memory tmp; Market storage market = mkts[t]; Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender]; uint256 lastTimestamp = market.accrualBlockNumber; uint256 blockDelta = now - lastTimestamp; // Calc the supplyIndex of supplyBalance tmp.newSupplyIndex = uint256( market.irm.pert( int256(market.supplyIndex), market.supplyRate, int256(blockDelta) ) ); tmp.userSupplyCurrent = uint256( market.irm.calculateBalance( valid_uint(accountSupplySnapshot[t][msg.sender].principal), int256(supplyBalance.interestIndex), int256(tmp.newSupplyIndex) ) ); tmp.userSupplyUpdated = tmp.userSupplyCurrent.add(supplyAmount); // Update supply of the market tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub( supplyBalance.principal ); tmp.currentCash = getCash(t); // address(0) represents for eth // We support both ERC20 and ETH. // Calc the new Balance of the contract if it's ERC20 // else(ETH) does nothing because the cash has been added(msg.value) when the contract is called tmp.updatedCash = t != address(0) ? tmp.currentCash.add(supplyAmount) : tmp.currentCash; // Update supplyRate and demondRate market.supplyRate = market.irm.getDepositRate( valid_uint(tmp.updatedCash), valid_uint(market.totalBorrows) ); tmp.newBorrowIndex = uint256( market.irm.pert( int256(market.borrowIndex), market.demondRate, int256(blockDelta) ) ); market.demondRate = market.irm.getLoanRate( valid_uint(tmp.updatedCash), valid_uint(market.totalBorrows) ); market.borrowIndex = tmp.newBorrowIndex; market.supplyIndex = tmp.newSupplyIndex; market.totalSupply = tmp.newTotalSupply; market.accrualBlockNumber = now; // mkts[t] = market; tmp.startingBalance = supplyBalance.principal; supplyBalance.principal = tmp.userSupplyUpdated; supplyBalance.interestIndex = tmp.newSupplyIndex; // Update total profit of user if (tmp.userSupplyCurrent > tmp.startingBalance) { supplyBalance.totalPnl = supplyBalance.totalPnl.add( tmp.userSupplyCurrent.sub(tmp.startingBalance) ); } join(msg.sender); safeTransferFrom( t, msg.sender, address(this), address(this).makePayable(), supplyAmount, 0 ); emit SupplyPawnLog( msg.sender, t, supplyAmount, tmp.startingBalance, tmp.userSupplyUpdated ); } struct WithdrawIR { uint256 withdrawAmount; uint256 startingBalance; uint256 newSupplyIndex; uint256 userSupplyCurrent; uint256 userSupplyUpdated; uint256 newTotalSupply; uint256 currentCash; uint256 updatedCash; uint256 newBorrowIndex; uint256 accountLiquidity; uint256 accountShortfall; uint256 usdValueOfWithdrawal; uint256 withdrawCapacity; } // withdraw function withdrawPawn(address t, uint256 requestedAmount) external nonReentrant { Market storage market = mkts[t]; Balance storage supplyBalance = accountSupplySnapshot[t][msg.sender]; WithdrawIR memory tmp; uint256 lastTimestamp = mkts[t].accrualBlockNumber; uint256 blockDelta = now - lastTimestamp; // Judge if the user has ability to withdraw (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity( msg.sender ); require( tmp.accountLiquidity != 0 && tmp.accountShortfall == 0, "can't withdraw, shortfall" ); // Update the balance of the user tmp.newSupplyIndex = uint256( mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(blockDelta) ) ); tmp.userSupplyCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(supplyBalance.principal), int256(supplyBalance.interestIndex), int256(tmp.newSupplyIndex) ) ); // Get the balance of this contract tmp.currentCash = getCash(t); // uint(-1) represents the user want to withdraw all of his supplies of the "t" token if (requestedAmount == uint256(-1)) { // max withdraw amount = min(his account liquidity, his balance) tmp.withdrawCapacity = getAssetAmountForValue( t, tmp.accountLiquidity ); tmp.withdrawAmount = min( min(tmp.withdrawCapacity, tmp.userSupplyCurrent), tmp.currentCash ); // tmp.withdrawAmount = min(tmp.withdrawAmount, tmp.currentCash); } else { tmp.withdrawAmount = requestedAmount; } // Update balance of this contract tmp.updatedCash = tmp.currentCash.sub(tmp.withdrawAmount); tmp.userSupplyUpdated = tmp.userSupplyCurrent.sub(tmp.withdrawAmount); // Get the amount of token to withdraw tmp.usdValueOfWithdrawal = getPriceForAssetAmount( t, tmp.withdrawAmount ); // require account liquidity is enough require( tmp.usdValueOfWithdrawal <= tmp.accountLiquidity, "account is short" ); // Update totalSupply of the market tmp.newTotalSupply = market.totalSupply.add(tmp.userSupplyUpdated).sub( supplyBalance.principal ); tmp.newSupplyIndex = uint256( mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(blockDelta) ) ); // Update loan to deposit rate market.supplyRate = mkts[t].irm.getDepositRate( valid_uint(tmp.updatedCash), valid_uint(market.totalBorrows) ); tmp.newBorrowIndex = uint256( mkts[t].irm.pert( int256(mkts[t].borrowIndex), mkts[t].demondRate, int256(blockDelta) ) ); market.demondRate = mkts[t].irm.getLoanRate( valid_uint(tmp.updatedCash), valid_uint(market.totalBorrows) ); market.accrualBlockNumber = now; market.totalSupply = tmp.newTotalSupply; market.supplyIndex = tmp.newSupplyIndex; market.borrowIndex = tmp.newBorrowIndex; // mkts[t] = market; tmp.startingBalance = supplyBalance.principal; supplyBalance.principal = tmp.userSupplyUpdated; supplyBalance.interestIndex = tmp.newSupplyIndex; safeTransferFrom( t, address(this).makePayable(), address(this), msg.sender, tmp.withdrawAmount, 0 ); emit WithdrawPawnLog( msg.sender, t, tmp.withdrawAmount, tmp.startingBalance, tmp.userSupplyUpdated ); } struct PayBorrowIR { uint256 newBorrowIndex; uint256 userBorrowCurrent; uint256 repayAmount; uint256 userBorrowUpdated; uint256 newTotalBorrows; uint256 currentCash; uint256 updatedCash; uint256 newSupplyIndex; uint256 startingBalance; } function min(uint256 a, uint256 b) internal pure returns (uint256) { if (a < b) { return a; } else { return b; } } //`(1 + originationFee) * borrowAmount` function calcBorrowAmountWithFee(uint256 borrowAmount) public pure returns (uint256) { return borrowAmount.mul((ONE_ETH).add(originationFee)).div(ONE_ETH); } // supply value * min pledge rate function getPriceForAssetAmountMulCollatRatio( address t, uint256 assetAmount ) public view returns (uint256) { return getPriceForAssetAmount(t, assetAmount) .mul(mkts[t].minPledgeRate) .div(ONE_ETH); } struct BorrowIR { uint256 newBorrowIndex; uint256 userBorrowCurrent; uint256 borrowAmountWithFee; uint256 userBorrowUpdated; uint256 newTotalBorrows; uint256 currentCash; uint256 updatedCash; uint256 newSupplyIndex; uint256 startingBalance; uint256 accountLiquidity; uint256 accountShortfall; uint256 usdValueOfBorrowAmountWithFee; } // borrow function BorrowPawn(address t, uint256 amount) external nonReentrant { BorrowIR memory tmp; Market storage market = mkts[t]; Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender]; uint256 lastTimestamp = mkts[t].accrualBlockNumber; uint256 blockDelta = now - lastTimestamp; // Calc borrow index tmp.newBorrowIndex = uint256( mkts[t].irm.pert( int256(mkts[t].borrowIndex), mkts[t].demondRate, int256(blockDelta) ) ); int256 lastIndex = int256(borrowBalance.interestIndex); tmp.userBorrowCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(borrowBalance.principal), lastIndex, int256(tmp.newBorrowIndex) ) ); // add borrow fee tmp.borrowAmountWithFee = calcBorrowAmountWithFee(amount); tmp.userBorrowUpdated = tmp.userBorrowCurrent.add( tmp.borrowAmountWithFee ); // Update market borrows tmp.newTotalBorrows = market .totalBorrows .add(tmp.userBorrowUpdated) .sub(borrowBalance.principal); // calc account liquidity (tmp.accountLiquidity, tmp.accountShortfall) = calcAccountLiquidity( msg.sender ); require( tmp.accountLiquidity != 0 && tmp.accountShortfall == 0, "can't borrow, shortfall" ); // require accountLiquitidy is enough tmp.usdValueOfBorrowAmountWithFee = getPriceForAssetAmountMulCollatRatio( t, tmp.borrowAmountWithFee ); require( tmp.usdValueOfBorrowAmountWithFee <= tmp.accountLiquidity, "can't borrow, without enough value" ); // Update the balance of this contract tmp.currentCash = getCash(t); tmp.updatedCash = tmp.currentCash.sub(amount); tmp.newSupplyIndex = uint256( mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(blockDelta) ) ); market.supplyRate = mkts[t].irm.getDepositRate( valid_uint(tmp.updatedCash), valid_uint(tmp.newTotalBorrows) ); market.demondRate = mkts[t].irm.getLoanRate( valid_uint(tmp.updatedCash), valid_uint(tmp.newTotalBorrows) ); market.accrualBlockNumber = now; market.totalBorrows = tmp.newTotalBorrows; market.supplyIndex = tmp.newSupplyIndex; market.borrowIndex = tmp.newBorrowIndex; // mkts[t] = market; tmp.startingBalance = borrowBalance.principal; borrowBalance.principal = tmp.userBorrowUpdated; borrowBalance.interestIndex = tmp.newBorrowIndex; // 更新币种的借币总额 // borrowBalance.totalPnl = borrowBalance.totalPnl.add(tmp.userBorrowCurrent.sub(tmp.startingBalance)); safeTransferFrom( t, address(this).makePayable(), address(this), msg.sender, amount, 0 ); emit BorrowPawnLog( msg.sender, t, amount, tmp.startingBalance, tmp.userBorrowUpdated ); // return 0; } // repay function repayFastBorrow(address t, uint256 amount) external payable nonReentrant { PayBorrowIR memory tmp; Market storage market = mkts[t]; Balance storage borrowBalance = accountBorrowSnapshot[t][msg.sender]; uint256 lastTimestamp = mkts[t].accrualBlockNumber; uint256 blockDelta = now - lastTimestamp; // calc the new borrow index tmp.newBorrowIndex = uint256( mkts[t].irm.pert( int256(mkts[t].borrowIndex), mkts[t].demondRate, int256(blockDelta) ) ); int256 lastIndex = int256(borrowBalance.interestIndex); tmp.userBorrowCurrent = uint256( mkts[t].irm.calculateBalance( valid_uint(borrowBalance.principal), lastIndex, int256(tmp.newBorrowIndex) ) ); // uint(-1) represents the user want to repay all of his borrows of "t" token if (amount == uint256(-1)) { // that is the minimum of (his balance, his borrows) tmp.repayAmount = min( getBalanceOf(t, msg.sender), tmp.userBorrowCurrent ); // address(0) represents for eth // if the user want to repay eth, he needs to repay a little more // because the exact amount will be calculated in the above // the extra eth will be returned in the safeTransferFrom if (t == address(0)) { require( msg.value > tmp.repayAmount, "Eth value should be larger than repayAmount" ); } } else { tmp.repayAmount = amount; if (t == address(0)) { require( msg.value == tmp.repayAmount, "Eth value should be equal to repayAmount" ); } } // calc the new borrows of user tmp.userBorrowUpdated = tmp.userBorrowCurrent.sub(tmp.repayAmount); // calc the new borrows of market tmp.newTotalBorrows = market .totalBorrows .add(tmp.userBorrowUpdated) .sub(borrowBalance.principal); tmp.currentCash = getCash(t); // address(0) represents for eth // just like the supplyPawn function, eth has been transfered. tmp.updatedCash = t != address(0) ? tmp.currentCash.add(tmp.repayAmount) : tmp.currentCash; tmp.newSupplyIndex = uint256( mkts[t].irm.pert( int256(mkts[t].supplyIndex), mkts[t].supplyRate, int256(blockDelta) ) ); // update deposit and loan rate market.supplyRate = mkts[t].irm.getDepositRate( valid_uint(tmp.updatedCash), valid_uint(tmp.newTotalBorrows) ); market.demondRate = mkts[t].irm.getLoanRate( valid_uint(tmp.updatedCash), valid_uint(tmp.newTotalBorrows) ); market.accrualBlockNumber = now; market.totalBorrows = tmp.newTotalBorrows; market.supplyIndex = tmp.newSupplyIndex; market.borrowIndex = tmp.newBorrowIndex; // mkts[t] = market; tmp.startingBalance = borrowBalance.principal; borrowBalance.principal = tmp.userBorrowUpdated; borrowBalance.interestIndex = tmp.newBorrowIndex; safeTransferFrom( t, msg.sender, address(this), address(this).makePayable(), tmp.repayAmount, msg.value ); emit RepayFastBorrowLog( msg.sender, t, tmp.repayAmount, tmp.startingBalance, tmp.userBorrowUpdated ); } // shortfall/(price*(minPledgeRate-liquidationDiscount-1)) // underwaterAsset is borrowAsset function calcDiscountedRepayToEvenAmount( address targetAccount, address underwaterAsset, uint256 underwaterAssetPrice ) public view returns (uint256) { (, uint256 shortfall) = calcAccountLiquidity(targetAccount); uint256 minPledgeRate = mkts[underwaterAsset].minPledgeRate; uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount; uint256 gap = minPledgeRate.sub(liquidationDiscount).sub(1 ether); return shortfall.mul(10**mkts[underwaterAsset].decimals).div( underwaterAssetPrice.mul(gap).div(ONE_ETH) ); //underwater asset amount } //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow) //[supplyCurrent * (Oracle price for the collateral)] / [ (1 + liquidationDiscount) * (Oracle price for the borrow) ] // amount of underwaterAsset to be repayed by liquidator, calculated by the amount of collateral asset function calcDiscountedBorrowDenominatedCollateral( address underwaterAsset, address collateralAsset, uint256 underwaterAssetPrice, uint256 collateralPrice, uint256 supplyCurrent_TargetCollateralAsset ) public view returns (uint256 res) { uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount; uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount); uint256 supplyCurrentTimesOracleCollateral = supplyCurrent_TargetCollateralAsset.mul(collateralPrice); res = supplyCurrentTimesOracleCollateral.div( onePlusLiquidationDiscount.mul(underwaterAssetPrice).div(ONE_ETH) ); //underwaterAsset amout res = res.mul(10**mkts[underwaterAsset].decimals); res = res.div(10**mkts[collateralAsset].decimals); } //closeBorrowAmount_TargetUnderwaterAsset * (1+liquidationDiscount) * priceBorrow/priceCollateral //underwaterAssetPrice * (1+liquidationDiscount) *closeBorrowAmount_TargetUnderwaterAsset) / collateralPrice //underwater is borrow // calc the amount of collateral asset bought by underwaterAsset(amount: closeBorrowAmount_TargetUnderwaterAsset) function calcAmountSeize( address underwaterAsset, address collateralAsset, uint256 underwaterAssetPrice, uint256 collateralPrice, uint256 closeBorrowAmount_TargetUnderwaterAsset ) public view returns (uint256 res) { uint256 liquidationDiscount = mkts[underwaterAsset].liquidationDiscount; uint256 onePlusLiquidationDiscount = (ONE_ETH).add(liquidationDiscount); res = underwaterAssetPrice.mul(onePlusLiquidationDiscount); res = res.mul(closeBorrowAmount_TargetUnderwaterAsset); res = res.div(collateralPrice); res = res.div(ONE_ETH); res = res.mul(10**mkts[collateralAsset].decimals); res = res.div(10**mkts[underwaterAsset].decimals); } struct LiquidateIR { // we need these addresses in the struct for use with `emitLiquidationEvent` to avoid `CompilerError: Stack too deep, try removing local variables.` address targetAccount; address assetBorrow; address liquidator; address assetCollateral; // borrow index and supply index are global to the asset, not specific to the user uint256 newBorrowIndex_UnderwaterAsset; uint256 newSupplyIndex_UnderwaterAsset; uint256 newBorrowIndex_CollateralAsset; uint256 newSupplyIndex_CollateralAsset; // the target borrow's full balance with accumulated interest uint256 currentBorrowBalance_TargetUnderwaterAsset; // currentBorrowBalance_TargetUnderwaterAsset minus whatever gets repaid as part of the liquidation uint256 updatedBorrowBalance_TargetUnderwaterAsset; uint256 newTotalBorrows_ProtocolUnderwaterAsset; uint256 startingBorrowBalance_TargetUnderwaterAsset; uint256 startingSupplyBalance_TargetCollateralAsset; uint256 startingSupplyBalance_LiquidatorCollateralAsset; uint256 currentSupplyBalance_TargetCollateralAsset; uint256 updatedSupplyBalance_TargetCollateralAsset; // If liquidator already has a balance of collateralAsset, we will accumulate // interest on it before transferring seized collateral from the borrower. uint256 currentSupplyBalance_LiquidatorCollateralAsset; // This will be the liquidator's accumulated balance of collateral asset before the liquidation (if any) // plus the amount seized from the borrower. uint256 updatedSupplyBalance_LiquidatorCollateralAsset; uint256 newTotalSupply_ProtocolCollateralAsset; uint256 currentCash_ProtocolUnderwaterAsset; uint256 updatedCash_ProtocolUnderwaterAsset; // cash does not change for collateral asset //mkts[t] uint256 newSupplyRateMantissa_ProtocolUnderwaterAsset; uint256 newBorrowRateMantissa_ProtocolUnderwaterAsset; // Why no variables for the interest rates for the collateral asset? // We don't need to calculate new rates for the collateral asset since neither cash nor borrows change uint256 discountedRepayToEvenAmount; //[supplyCurrent / (1 + liquidationDiscount)] * (Oracle price for the collateral / Oracle price for the borrow) (discountedBorrowDenominatedCollateral) uint256 discountedBorrowDenominatedCollateral; uint256 maxCloseableBorrowAmount_TargetUnderwaterAsset; uint256 closeBorrowAmount_TargetUnderwaterAsset; uint256 seizeSupplyAmount_TargetCollateralAsset; uint256 collateralPrice; uint256 underwaterAssetPrice; } // get the max amount to be liquidated function calcMaxLiquidateAmount( address targetAccount, address assetBorrow, address assetCollateral ) external view returns (uint256) { require(msg.sender != targetAccount, "can't self-liquidate"); LiquidateIR memory tmp; uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber; Market storage borrowMarket = mkts[assetBorrow]; Market storage collateralMarket = mkts[assetCollateral]; Balance storage borrowBalance_TargeUnderwaterAsset = accountBorrowSnapshot[assetBorrow][targetAccount]; Balance storage supplyBalance_TargetCollateralAsset = accountSupplySnapshot[assetCollateral][targetAccount]; tmp.newSupplyIndex_CollateralAsset = uint256( collateralMarket.irm.pert( int256(collateralMarket.supplyIndex), collateralMarket.supplyRate, int256(blockDelta) ) ); tmp.newBorrowIndex_UnderwaterAsset = uint256( borrowMarket.irm.pert( int256(borrowMarket.borrowIndex), borrowMarket.demondRate, int256(blockDelta) ) ); tmp.currentSupplyBalance_TargetCollateralAsset = uint256( collateralMarket.irm.calculateBalance( valid_uint(supplyBalance_TargetCollateralAsset.principal), int256(supplyBalance_TargetCollateralAsset.interestIndex), int256(tmp.newSupplyIndex_CollateralAsset) ) ); tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256( borrowMarket.irm.calculateBalance( valid_uint(borrowBalance_TargeUnderwaterAsset.principal), int256(borrowBalance_TargeUnderwaterAsset.interestIndex), int256(tmp.newBorrowIndex_UnderwaterAsset) ) ); bool ok; (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral); require(ok, "fail to get collateralPrice"); (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow); require(ok, "fail to get underwaterAssetPrice"); tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral( assetBorrow, assetCollateral, tmp.underwaterAssetPrice, tmp.collateralPrice, tmp.currentSupplyBalance_TargetCollateralAsset ); tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount( targetAccount, assetBorrow, tmp.underwaterAssetPrice ); tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min( tmp.currentBorrowBalance_TargetUnderwaterAsset, tmp.discountedBorrowDenominatedCollateral ); tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min( tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset, tmp.discountedRepayToEvenAmount ); return tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset; } // liquidate function liquidateBorrowPawn( address targetAccount, address assetBorrow, address assetCollateral, uint256 requestedAmountClose ) external payable nonReentrant { require(msg.sender != targetAccount, "can't self-liquidate"); LiquidateIR memory tmp; // Copy these addresses into the struct for use with `emitLiquidationEvent` // We'll use tmp.liquidator inside this function for clarity vs using msg.sender. tmp.targetAccount = targetAccount; tmp.assetBorrow = assetBorrow; tmp.liquidator = msg.sender; tmp.assetCollateral = assetCollateral; uint256 blockDelta = now - mkts[assetBorrow].accrualBlockNumber; Market storage borrowMarket = mkts[assetBorrow]; Market storage collateralMarket = mkts[assetCollateral]; // borrower's borrow balance and supply balance Balance storage borrowBalance_TargeUnderwaterAsset = accountBorrowSnapshot[assetBorrow][targetAccount]; Balance storage supplyBalance_TargetCollateralAsset = accountSupplySnapshot[assetCollateral][targetAccount]; // Liquidator might already hold some of the collateral asset Balance storage supplyBalance_LiquidatorCollateralAsset = accountSupplySnapshot[assetCollateral][tmp.liquidator]; bool ok; (tmp.collateralPrice, ok) = fetchAssetPrice(assetCollateral); require(ok, "fail to get collateralPrice"); (tmp.underwaterAssetPrice, ok) = fetchAssetPrice(assetBorrow); require(ok, "fail to get underwaterAssetPrice"); // calc borrower's borrow balance with the newest interest tmp.newBorrowIndex_UnderwaterAsset = uint256( borrowMarket.irm.pert( int256(borrowMarket.borrowIndex), borrowMarket.demondRate, int256(blockDelta) ) ); tmp.currentBorrowBalance_TargetUnderwaterAsset = uint256( borrowMarket.irm.calculateBalance( valid_uint(borrowBalance_TargeUnderwaterAsset.principal), int256(borrowBalance_TargeUnderwaterAsset.interestIndex), int256(tmp.newBorrowIndex_UnderwaterAsset) ) ); // calc borrower's supply balance with the newest interest tmp.newSupplyIndex_CollateralAsset = uint256( collateralMarket.irm.pert( int256(collateralMarket.supplyIndex), collateralMarket.supplyRate, int256(blockDelta) ) ); tmp.currentSupplyBalance_TargetCollateralAsset = uint256( collateralMarket.irm.calculateBalance( valid_uint(supplyBalance_TargetCollateralAsset.principal), int256(supplyBalance_TargetCollateralAsset.interestIndex), int256(tmp.newSupplyIndex_CollateralAsset) ) ); // calc liquidator's balance of the collateral asset tmp.currentSupplyBalance_LiquidatorCollateralAsset = uint256( collateralMarket.irm.calculateBalance( valid_uint(supplyBalance_LiquidatorCollateralAsset.principal), int256(supplyBalance_LiquidatorCollateralAsset.interestIndex), int256(tmp.newSupplyIndex_CollateralAsset) ) ); // update collateral asset of the market tmp.newTotalSupply_ProtocolCollateralAsset = collateralMarket .totalSupply .add(tmp.currentSupplyBalance_TargetCollateralAsset) .sub(supplyBalance_TargetCollateralAsset.principal); tmp.newTotalSupply_ProtocolCollateralAsset = tmp .newTotalSupply_ProtocolCollateralAsset .add(tmp.currentSupplyBalance_LiquidatorCollateralAsset) .sub(supplyBalance_LiquidatorCollateralAsset.principal); // calc the max amount to be liquidated tmp.discountedBorrowDenominatedCollateral = calcDiscountedBorrowDenominatedCollateral( assetBorrow, assetCollateral, tmp.underwaterAssetPrice, tmp.collateralPrice, tmp.currentSupplyBalance_TargetCollateralAsset ); tmp.discountedRepayToEvenAmount = calcDiscountedRepayToEvenAmount( targetAccount, assetBorrow, tmp.underwaterAssetPrice ); tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset = min( min( tmp.currentBorrowBalance_TargetUnderwaterAsset, tmp.discountedBorrowDenominatedCollateral ), tmp.discountedRepayToEvenAmount ); // uint(-1) represents the user want to liquidate all if (requestedAmountClose == uint256(-1)) { tmp.closeBorrowAmount_TargetUnderwaterAsset = tmp .maxCloseableBorrowAmount_TargetUnderwaterAsset; } else { tmp.closeBorrowAmount_TargetUnderwaterAsset = requestedAmountClose; } require( tmp.closeBorrowAmount_TargetUnderwaterAsset <= tmp.maxCloseableBorrowAmount_TargetUnderwaterAsset, "closeBorrowAmount > maxCloseableBorrowAmount err" ); // address(0) represents for eth if (assetBorrow == address(0)) { // just the repay method, eth amount be transfered should be a litte more require( msg.value >= tmp.closeBorrowAmount_TargetUnderwaterAsset, "Not enough ETH" ); } else { // user needs to have enough balance require( getBalanceOf(assetBorrow, tmp.liquidator) >= tmp.closeBorrowAmount_TargetUnderwaterAsset, "insufficient balance" ); } // 计算清算人实际清算得到的此质押币数量 // The amount of collateral asset that liquidator can get tmp.seizeSupplyAmount_TargetCollateralAsset = calcAmountSeize( assetBorrow, assetCollateral, tmp.underwaterAssetPrice, tmp.collateralPrice, tmp.closeBorrowAmount_TargetUnderwaterAsset ); // 被清算人借币余额减少 // Update borrower's balance tmp.updatedBorrowBalance_TargetUnderwaterAsset = tmp .currentBorrowBalance_TargetUnderwaterAsset .sub(tmp.closeBorrowAmount_TargetUnderwaterAsset); // 更新借币市场总量 // Update borrow market tmp.newTotalBorrows_ProtocolUnderwaterAsset = borrowMarket .totalBorrows .add(tmp.updatedBorrowBalance_TargetUnderwaterAsset) .sub(borrowBalance_TargeUnderwaterAsset.principal); tmp.currentCash_ProtocolUnderwaterAsset = getCash(assetBorrow); // address(0) represents for eth // eth has been transfered when called tmp.updatedCash_ProtocolUnderwaterAsset = assetBorrow != address(0) ? tmp.currentCash_ProtocolUnderwaterAsset.add( tmp.closeBorrowAmount_TargetUnderwaterAsset ) : tmp.currentCash_ProtocolUnderwaterAsset; tmp.newSupplyIndex_UnderwaterAsset = uint256( borrowMarket.irm.pert( int256(borrowMarket.supplyIndex), borrowMarket.demondRate, int256(blockDelta) ) ); borrowMarket.supplyRate = borrowMarket.irm.getDepositRate( int256(tmp.updatedCash_ProtocolUnderwaterAsset), int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset) ); borrowMarket.demondRate = borrowMarket.irm.getLoanRate( int256(tmp.updatedCash_ProtocolUnderwaterAsset), int256(tmp.newTotalBorrows_ProtocolUnderwaterAsset) ); tmp.newBorrowIndex_CollateralAsset = uint256( collateralMarket.irm.pert( int256(collateralMarket.supplyIndex), collateralMarket.demondRate, int256(blockDelta) ) ); // Update the balance of liquidator and borrower tmp.updatedSupplyBalance_TargetCollateralAsset = tmp .currentSupplyBalance_TargetCollateralAsset .sub(tmp.seizeSupplyAmount_TargetCollateralAsset); tmp.updatedSupplyBalance_LiquidatorCollateralAsset = tmp .currentSupplyBalance_LiquidatorCollateralAsset .add(tmp.seizeSupplyAmount_TargetCollateralAsset); borrowMarket.accrualBlockNumber = now; borrowMarket.totalBorrows = tmp.newTotalBorrows_ProtocolUnderwaterAsset; borrowMarket.supplyIndex = tmp.newSupplyIndex_UnderwaterAsset; borrowMarket.borrowIndex = tmp.newBorrowIndex_UnderwaterAsset; // mkts[assetBorrow] = borrowMarket; collateralMarket.accrualBlockNumber = now; collateralMarket.totalSupply = tmp .newTotalSupply_ProtocolCollateralAsset; collateralMarket.supplyIndex = tmp.newSupplyIndex_CollateralAsset; collateralMarket.borrowIndex = tmp.newBorrowIndex_CollateralAsset; // mkts[assetCollateral] = collateralMarket; tmp.startingBorrowBalance_TargetUnderwaterAsset = borrowBalance_TargeUnderwaterAsset .principal; // save for use in event borrowBalance_TargeUnderwaterAsset.principal = tmp .updatedBorrowBalance_TargetUnderwaterAsset; borrowBalance_TargeUnderwaterAsset.interestIndex = tmp .newBorrowIndex_UnderwaterAsset; tmp.startingSupplyBalance_TargetCollateralAsset = supplyBalance_TargetCollateralAsset .principal; // save for use in event supplyBalance_TargetCollateralAsset.principal = tmp .updatedSupplyBalance_TargetCollateralAsset; supplyBalance_TargetCollateralAsset.interestIndex = tmp .newSupplyIndex_CollateralAsset; tmp.startingSupplyBalance_LiquidatorCollateralAsset = supplyBalance_LiquidatorCollateralAsset .principal; // save for use in event supplyBalance_LiquidatorCollateralAsset.principal = tmp .updatedSupplyBalance_LiquidatorCollateralAsset; supplyBalance_LiquidatorCollateralAsset.interestIndex = tmp .newSupplyIndex_CollateralAsset; setLiquidateInfoMap( tmp.targetAccount, tmp.liquidator, tmp.assetCollateral, assetBorrow, tmp.seizeSupplyAmount_TargetCollateralAsset, tmp.closeBorrowAmount_TargetUnderwaterAsset ); safeTransferFrom( assetBorrow, tmp.liquidator.makePayable(), address(this), address(this).makePayable(), tmp.closeBorrowAmount_TargetUnderwaterAsset, msg.value ); emit LiquidateBorrowPawnLog( tmp.targetAccount, assetBorrow, tmp.updatedBorrowBalance_TargetUnderwaterAsset, tmp.liquidator, tmp.assetCollateral, tmp.updatedSupplyBalance_TargetCollateralAsset ); } function safeTransferFrom( address token, address payable owner, address spender, address payable to, uint256 amount, uint256 msgValue ) internal { require(amount != 0, "invalid safeTransferFrom amount"); if (owner != spender && token != address(0)) { // transfer in ERC20 require( IERC20(token).allowance(owner, spender) >= amount, "Insufficient allowance" ); } if (token != address(0)) { require( IERC20(token).balanceOf(owner) >= amount, "Insufficient balance" ); } else if (owner == spender) { // eth, owner == spender represents for transfer out, requires enough balance require(owner.balance >= amount, "Insufficient eth balance"); } if (owner != spender) { // transfer in if (token != address(0)) { // transferFrom ERC20 IERC20(token).safeTransferFrom(owner, to, amount); } else if (msgValue != 0 && msgValue > amount) { // return the extra eth to user owner.transfer(msgValue.sub(amount)); } // eth has been transfered when called using msg.value } else { // transfer out if (token != address(0)) { // ERC20 IERC20(token).safeTransfer(to, amount); } else { // 参数设置, msgValue 大于0,即还款或清算逻辑,实际还的钱大于需要还的钱,需要返回多余的钱 // msgValue 等于 0,借钱或取钱逻辑,直接转出 amount 数量的币 // msgValue greater than 0 represents for repay or liquidate, // which means we should give back the extra eth to user // msgValue equals to 0 represents for withdraw or borrow // just take the wanted money if (msgValue != 0 && msgValue > amount) { to.transfer(msgValue.sub(amount)); } else { to.transfer(amount); } } } } // admin transfers profit out function withdrawPawnEquity(address t, uint256 amount) external nonReentrant onlyAdmin { uint256 cash = getCash(t); uint256 equity = cash.add(mkts[t].totalBorrows).sub( mkts[t].totalSupply ); require(equity >= amount, "insufficient equity amount"); safeTransferFrom( t, address(this).makePayable(), address(this), admin.makePayable(), amount, 0 ); emit WithdrawPawnEquityLog(t, equity, amount, admin); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"BorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"tBorrow","type":"address"},{"indexed":false,"internalType":"uint256","name":"endBorrow","type":"uint256"},{"indexed":false,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"address","name":"tCol","type":"address"},{"indexed":false,"internalType":"uint256","name":"endCol","type":"uint256"}],"name":"LiquidateBorrowPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"RepayFastBorrowLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"SupplyPawnLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"equityAvailableBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WithdrawPawnEquityLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"address","name":"t","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"beg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"WithdrawPawnLog","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BorrowPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ONE_ETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountBorrowSnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"accountSupplySnapshot","outputs":[{"internalType":"uint256","name":"principal","type":"uint256"},{"internalType":"uint256","name":"interestIndex","type":"uint256"},{"internalType":"uint256","name":"totalPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"accounts","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"addCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountAllTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"sumSupplies","type":"uint256"},{"internalType":"uint256","name":"sumBorrowLeverage","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"calcAccountLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"calcAccountTokenValuesLeverageInternal","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"closeBorrowAmount_TargetUnderwaterAsset","type":"uint256"}],"name":"calcAmountSeize","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"borrowAmount","type":"uint256"}],"name":"calcBorrowAmountWithFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"},{"internalType":"uint256","name":"collateralPrice","type":"uint256"},{"internalType":"uint256","name":"supplyCurrent_TargetCollateralAsset","type":"uint256"}],"name":"calcDiscountedBorrowDenominatedCollateral","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"underwaterAsset","type":"address"},{"internalType":"uint256","name":"underwaterAssetPrice","type":"uint256"}],"name":"calcDiscountedRepayToEvenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"}],"name":"calcMaxLiquidateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"claimAdministration","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultOriginationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"fetchAssetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"usdValue","type":"uint256"}],"name":"getAssetAmountForValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowBalanceLeverage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getBorrowPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"getCash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCollateralMarketsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"getPriceForAssetAmountMulCollatRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyBalanceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"address","name":"t","type":"address"}],"name":"getSupplyPnlInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalBorrowPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"getTotalSupplyPnl","outputs":[{"internalType":"uint256","name":"sumPnl","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"indexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"initCollateralMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialInterestIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"int_max","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"address","name":"assetCollateral","type":"address"},{"internalType":"uint256","name":"requestedAmountClose","type":"uint256"}],"name":"liquidateBorrowPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"liquidateIndexes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidateInfoMap","outputs":[{"internalType":"address","name":"targetAccount","type":"address"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"address","name":"assetCollatera","type":"address"},{"internalType":"address","name":"assetBorrow","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"targetAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"asset","type":"address"}],"name":"loanToDepositRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mkts","outputs":[{"internalType":"uint256","name":"accrualBlockNumber","type":"uint256"},{"internalType":"int256","name":"supplyRate","type":"int256"},{"internalType":"int256","name":"demondRate","type":"int256"},{"internalType":"contract IInterestRateModel","name":"irm","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"supplyIndex","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"borrowIndex","type":"uint256"},{"internalType":"uint256","name":"totalReserves","type":"uint256"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracleInstance","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"originationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"admin_","type":"address"}],"name":"proposeNewAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposedAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayFastBorrow","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"decimals","type":"uint256"}],"name":"setDecimals","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setInitialTimestamp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"address","name":"irm","type":"address"}],"name":"setInterestRateModel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"liquidationDiscount","type":"uint256"}],"name":"setLiquidationDiscount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"minPledgeRate","type":"uint256"}],"name":"setMinPledgeRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"oracle","type":"address"}],"name":"setOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyPawn","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"requestedAmount","type":"uint256"}],"name":"withdrawPawn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"t","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPawnEquity","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600160085534801561001557600080fd5b5060008054600160ff1990911617610100600160a81b0319166101003302178155615f549081906200004790396000f3fe6080604052600436106103975760003560e01c80637701d0bd116101dc578063c5af0bab11610102578063e03368c1116100a0578063f2a40db81161006f578063f2a40db814610f5f578063f673e9ca14610f89578063f851a44014610fcc578063feb59ccf14610fe157610397565b8063e03368c114610ed8578063ea3a4c6014610ed8578063ed1d840d14610eed578063f0f8aff914610f2657610397565b8063d3339024116100dc578063d333902414610da2578063d7d9dba014610db7578063ddec280e14610df2578063de6843c314610e3e57610397565b8063c5af0bab14610d27578063c92fcfb314610d3c578063cb3db56314610d6f57610397565b8063a21accdc1161017a578063b7fc3ada11610149578063b7fc3ada14610c7a578063b8bb5c421461060e578063ba37773114610cb3578063bbde010214610cee57610397565b8063a21accdc14610bc4578063a637674614610bf7578063ad2cb23914610c2a578063b19322a614610c3f57610397565b8063841d0071116101b6578063841d007114610add5780638cd3b02214610b1057806391de89c614610b5f5780639c74acda14610b8b57610397565b80637701d0bd14610a225780637adbf97314610a715780637e67e5ce14610aa457610397565b806335b773cb116102c157806341ed3ad61161025f578063607b463a1161022e578063607b463a1461096c57806365dc4e3a1461099f5780636e04d137146109d25780636e2ede0314610a0d57610397565b806341ed3ad6146108315780634613f1271461087657806353131ab5146108ea5780636012481a1461093357610397565b80633e3ae88a1161029b5780633e3ae88a146107575780634100b9f01461079057806341b41316146107e957806341d6864e1461081c57610397565b806335b773cb146106a65780633c03d33e146106e15780633cb7317b1461071c57610397565b80631b6a935e116103395780632c7769b2116103085780632c7769b21461060e5780632db78d931461062357806332f751ec14610656578063332279b11461066b57610397565b80631b6a935e1461054857806326bc59fa1461057257806327001627146105c65780632986c0e5146105f957610397565b8063118e31b711610375578063118e31b71461043f578063172c48c71461048c57806317585b12146104d25780631925a7511461050d57610397565b80630cffc6761461039c5780630ddeb327146103da578063101828d114610406575b600080fd5b6103d8600480360360808110156103b257600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561101c565b005b6103d8600480360360408110156103f057600080fd5b506001600160a01b038135169060200135611c69565b34801561041257600080fd5b506103d86004803603604081101561042957600080fd5b506001600160a01b038135169060200135612250565b34801561044b57600080fd5b5061047a6004803603604081101561046257600080fd5b506001600160a01b038135811691602001351661281b565b60408051918252519081900360200190f35b34801561049857600080fd5b506104b6600480360360208110156104af57600080fd5b503561298e565b604080516001600160a01b039092168252519081900360200190f35b3480156104de57600080fd5b506103d8600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166129b5565b34801561051957600080fd5b5061047a6004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516612a38565b34801561055457600080fd5b5061047a6004803603602081101561056b57600080fd5b5035612a54565b34801561057e57600080fd5b506105ad6004803603604081101561059557600080fd5b506001600160a01b0381358116916020013516612a96565b6040805192835260208301919091528051918290030190f35b3480156105d257600080fd5b5061047a600480360360208110156105e957600080fd5b50356001600160a01b0316612ab8565b34801561060557600080fd5b5061047a612aff565b34801561061a57600080fd5b5061047a612b05565b34801561062f57600080fd5b5061047a6004803603602081101561064657600080fd5b50356001600160a01b0316612b0a565b34801561066257600080fd5b506104b6612b1c565b34801561067757600080fd5b5061047a6004803603604081101561068e57600080fd5b506001600160a01b0381358116916020013516612b2b565b3480156106b257600080fd5b5061047a600480360360408110156106c957600080fd5b506001600160a01b0381358116916020013516612cba565b3480156106ed57600080fd5b5061047a6004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516612cc6565b34801561072857600080fd5b5061047a6004803603604081101561073f57600080fd5b506001600160a01b0381358116916020013516612e77565b34801561076357600080fd5b506103d86004803603604081101561077a57600080fd5b506001600160a01b038135169060200135612e87565b34801561079c57600080fd5b506107cb600480360360408110156107b357600080fd5b506001600160a01b0381358116916020013516613066565b60408051938452602084019290925282820152519081900360600190f35b3480156107f557600080fd5b506105ad6004803603602081101561080c57600080fd5b50356001600160a01b031661308e565b34801561082857600080fd5b5061047a613108565b34801561083d57600080fd5b5061047a6004803603606081101561085457600080fd5b506001600160a01b038135811691602081013582169160409091013516613113565b34801561088257600080fd5b506108a06004803603602081101561089957600080fd5b503561357f565b604080516001600160a01b039889168152968816602088015294871686860152929095166060850152608084015260a083019390935260c082019290925290519081900360e00190f35b3480156108f657600080fd5b506103d86004803603608081101561090d57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356135ce565b34801561093f57600080fd5b506103d86004803603604081101561095657600080fd5b506001600160a01b0381351690602001356137ef565b34801561097857600080fd5b5061047a6004803603602081101561098f57600080fd5b50356001600160a01b0316613ee6565b3480156109ab57600080fd5b506103d8600480360360208110156109c257600080fd5b50356001600160a01b0316613f79565b3480156109de57600080fd5b5061047a600480360360408110156109f557600080fd5b506001600160a01b0381358116916020013516614068565b348015610a1957600080fd5b5061047a614078565b348015610a2e57600080fd5b5061047a600480360360a0811015610a4557600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561407e565b348015610a7d57600080fd5b506103d860048036036020811015610a9457600080fd5b50356001600160a01b0316614175565b348015610ab057600080fd5b506103d860048036036040811015610ac757600080fd5b506001600160a01b0381351690602001356141e9565b348015610ae957600080fd5b5061047a60048036036020811015610b0057600080fd5b50356001600160a01b031661425a565b348015610b1c57600080fd5b5061047a600480360360a0811015610b3357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356142bb565b6103d860048036036040811015610b7557600080fd5b506001600160a01b0381351690602001356143a5565b348015610b9757600080fd5b5061047a60048036036040811015610bae57600080fd5b506001600160a01b03813516906020013561495d565b348015610bd057600080fd5b506105ad60048036036020811015610be757600080fd5b50356001600160a01b0316614a50565b348015610c0357600080fd5b506103d860048036036020811015610c1a57600080fd5b50356001600160a01b0316614aae565b348015610c3657600080fd5b506103d8614b22565b348015610c4b57600080fd5b506105ad60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516614ba9565b348015610c8657600080fd5b506103d860048036036040811015610c9d57600080fd5b506001600160a01b038135169060200135614bc0565b348015610cbf57600080fd5b5061047a60048036036040811015610cd657600080fd5b506001600160a01b0381358116916020013516614c31565b348015610cfa57600080fd5b506103d860048036036040811015610d1157600080fd5b506001600160a01b038135169060200135614cc1565b348015610d3357600080fd5b506104b6614d33565b348015610d4857600080fd5b506103d860048036036020811015610d5f57600080fd5b50356001600160a01b0316614d42565b348015610d7b57600080fd5b5061047a60048036036020811015610d9257600080fd5b50356001600160a01b0316614db0565b348015610dae57600080fd5b5061047a614e0a565b348015610dc357600080fd5b5061047a60048036036040811015610dda57600080fd5b506001600160a01b0381358116916020013516614e10565b348015610dfe57600080fd5b50610e2560048036036020811015610e1557600080fd5b50356001600160a01b0316614e54565b6040805192835290151560208301528051918290030190f35b348015610e4a57600080fd5b50610e7160048036036020811015610e6157600080fd5b50356001600160a01b0316614f2d565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b348015610ee457600080fd5b5061047a614fa0565b348015610ef957600080fd5b5061047a60048036036040811015610f1057600080fd5b506001600160a01b038135169060200135614fac565b348015610f3257600080fd5b5061047a60048036036040811015610f4957600080fd5b506001600160a01b038135169060200135615093565b348015610f6b57600080fd5b506104b660048036036020811015610f8257600080fd5b50356150cb565b348015610f9557600080fd5b5061047a60048036036060811015610fac57600080fd5b506001600160a01b038135811691602081013590911690604001356150e6565b348015610fd857600080fd5b506104b6615188565b348015610fed57600080fd5b506107cb6004803603604081101561100457600080fd5b506001600160a01b038135811691602001351661519c565b60005460ff16611061576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055336001600160a01b03851614156110c0576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b6110c8615b14565b6001600160a01b03808616808352858216602080850182905233604080870191825288861660608801819052600085815260098552828120805483835284832097835260038752848320898452875284832084845260028089528685209a85528a89528685209585528852955190991682529690945290832042969096039591929091906111558a614e54565b6103808a01919091529050806111b2576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6111bb8b614e54565b6103a08a0191909152905080611218576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b600386015460078701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d60208110156112a957600080fd5b50516080890152600386015484546001600160a01b039091169063e14768ed906112d2906151c8565b86600101548b608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b5051610100890152600385015460058601546001870154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b505160e0890152600385015483546001600160a01b039091169063e14768ed9061140a906151c8565b85600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50516101c0890152600385015482546001600160a01b039091169063e14768ed906114aa906151c8565b84600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161020089015282546101c08901516004870154611556929161154a919063ffffffff61522016565b9063ffffffff61526e16565b610240890181905282546102008a01516115799261154a9163ffffffff61522016565b6102408901526103a08801516103808901516101c08a015161159e928e928e926142bb565b6103008901526103a08801516115b7908d908d906150e6565b6102e08901526101008801516103008901516115e1916115d6916152bf565b896102e001516152bf565b6103208901526000198914156116025761032088015161034089015261160b565b61034088018990525b87610320015188610340015111156116545760405162461bcd60e51b8152600401808060200182810382526030815260200180615ef06030913960400191505060405180910390fd5b6001600160a01b038b166116b2578761034001513410156116ad576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b611710565b8761034001516116c68c8a604001516152d7565b1015611710576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61172c8b8b8a6103a001518b61038001518c610340015161407e565b61036089015261034088015161010089015161174d9163ffffffff61526e16565b6101208901819052845460068801546117709261154a919063ffffffff61522016565b61014089015261177f8b613ee6565b6102608901526001600160a01b038b1661179e578761026001516117b9565b6103408801516102608901516117b99163ffffffff61522016565b610280890152600386015460058701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505160a089015260038601546102808901516101408a01516040805163a1d7796760e01b815260048101939093526024830191909152516001600160a01b039092169163a1d7796791604480820192602092909190829003018186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b5051600187015560038601546102808901516101408a0151604080516313f17e7360e21b815260048101939093526024830191909152516001600160a01b0390921691634fc5f9cc91604480820192602092909190829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516002808801919091556003860154600587015491870154604080516396e973f560e01b815260048101949094526024840191909152604483018a9052516001600160a01b03909116916396e973f5916064808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b505160c08901526103608801516101c0890151611a329163ffffffff61526e16565b6101e0890152610360880151610200890151611a539163ffffffff61522016565b8861022001818152505042866000018190555087610140015186600601819055508760a0015186600501819055508760800151866007018190555042856000018190555087610240015185600401819055508760e0015185600501819055508760c001518560070181905550836000015488610160018181525050876101200151846000018190555087608001518460010181905550826000015488610180018181525050876101e0015183600001819055508760e0015183600101819055508160000154886101a001818152505087610220015182600001819055508760e001518260010181905550611b61886000015189604001518a606001518e8c61036001518d6103400151615376565b611b918b611b7b8a604001516001600160a01b0316615454565b30611b8581615454565b8c610340015134615457565b7f564b05ce5b1718b3406f5483d56f1b9609a9aab4603bdaeba9c415e0b38b039e88600001518c8a61012001518b604001518c606001518d6101e0015160405180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001965050505050505060405180910390a150506000805460ff1916600117905550505050505050505050565b60005460ff16611cae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055611cc0615c17565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed90611db7906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015611dff57600080fd5b505afa158015611e13573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b50516020870152600019871415611eab57611e51611e4789336152d7565b87602001516152bf565b60408701526001600160a01b038816611ea65785604001513411611ea65760405162461bcd60e51b815260040180806020018281038252602b815260200180615ec5602b913960400191505060405180910390fd5b611f02565b604086018790526001600160a01b038816611f025785604001513414611f025760405162461bcd60e51b8152600401808060200182810382526028815260200180615e5b6028913960400191505060405180910390fd5b60408601516020870151611f1b9163ffffffff61526e16565b6060870181905284546006870154611f3d9261154a919063ffffffff61522016565b6080870152611f4b88613ee6565b60a08701526001600160a01b038816611f68578560a00151611f81565b604086015160a0870151611f819163ffffffff61522016565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d602081101561202557600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612060906151c8565b61206d89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc9061210d906151c8565b61211a89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556121d48833306121c981615454565b8a6040015134615457565b6040808701516101008801516060808a015184513381526001600160a01b038e1660208201528086019490945290830191909152608082015290517f95536f77ac48f30901e02b7e98147d28fa621a9296283b46afa87ea9f994290d9181900360a00190a150506000805460ff19166001179055505050505050565b60005460ff16612295576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191690556122a7615c63565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed9061239e906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156123e657600080fd5b505afa1580156123fa573d6000803e3d6000fd5b505050506040513d602081101561241057600080fd5b5051602087015261242087612a54565b60408701819052602087015161243b9163ffffffff61522016565b606087018190528454600687015461245d9261154a919063ffffffff61522016565b608087015261246b33614a50565b61014088015261012087018190521580159061248a5750610140860151155b6124db576040805162461bcd60e51b815260206004820152601760248201527f63616e277420626f72726f772c2073686f727466616c6c000000000000000000604482015290519081900360640190fd5b6124e9888760400151615093565b610160870181905261012087015110156125345760405162461bcd60e51b8152600401808060200182810382526022815260200180615ea36022913960400191505060405180910390fd5b61253d88613ee6565b60a08701819052612554908863ffffffff61526e16565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b1580156125ce57600080fd5b505afa1580156125e2573d6000803e3d6000fd5b505050506040513d60208110156125f857600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612633906151c8565b61264089608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561267b57600080fd5b505afa15801561268f573d6000803e3d6000fd5b505050506040513d60208110156126a557600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc906126e0906151c8565b6126ed89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d602081101561275257600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556127a48861279a30615454565b30338b6000615457565b610100860151606080880151604080513381526001600160a01b038d1660208201528082018c905292830193909352608082015290517fccf497a6d8ab6e2d0cd3345e3f91702b378c9ba26a707adc43e47ec8ceccacbd9181900360a00190a150506000805460ff19166001179055505050505050565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b1580156128ac57600080fd5b505afa1580156128c0573d6000803e3d6000fd5b505050506040513d60208110156128d657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed9061290e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d602081101561298057600080fd5b505193505050505b92915050565b600a818154811061299b57fe5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b03163314612a07576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260096020526040902060030180546001600160a01b03191691909216179055565b6000612a4d82612a488585614c31565b614fac565b9392505050565b6000612a8e670de0b6b3a7640000612a82612a75828563ffffffff61522016565b859063ffffffff61583c16565b9063ffffffff61589f16565b90505b919050565b600080612aa38484612a38565b612aad8585614e10565b915091509250929050565b6001600160a01b03811660009081526009602052604081206006810154600490910154612af781612a8284670de0b6b3a764000063ffffffff61583c16565b949350505050565b60085481565b600081565b60076020526000908152604090205481565b6001546001600160a01b031681565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612c1e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612c6657600080fd5b505afa158015612c7a573d6000803e3d6000fd5b505050506040513d6020811015612c9057600080fd5b505183546002850154919250612cb09161154a908463ffffffff61522016565b9695505050505050565b6000612a4d82612a4885855b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b158015612d5657600080fd5b505afa158015612d6a573d6000803e3d6000fd5b505050506040513d6020811015612d8057600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612db8906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612e0057600080fd5b505afa158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b50518354909150811115612e6a578254612e6090612e4f90839063ffffffff61526e16565b60028501549063ffffffff61522016565b9350505050612988565b5050600201549050612988565b6000612a4d82612a48858561281b565b60005460ff16612ecc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169081905561010090046001600160a01b03163314612f27576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6000612f3283613ee6565b6001600160a01b038416600090815260096020526040812060048101546006909101549293509091612f70919061154a90859063ffffffff61522016565b905082811015612fc7576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e742065717569747920616d6f756e74000000000000604482015290519081900360640190fd5b612ff884612fd430615454565b6000543090612ff09061010090046001600160a01b0316615454565b876000615457565b600054604080516001600160a01b03808816825260208201859052818301879052610100909304929092166060830152517ff436439e28c1812ec03906f344bbce09c25881eae35d800d55585265cc9d7c8b9181900360800190a150506000805460ff191660011790555050565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b600a546000908190815b81811015613101576000806130ce87600a85815481106130b457fe5b6000918252602090912001546001600160a01b0316612a96565b90925090506130e3868363ffffffff61522016565b95506130f5858263ffffffff61522016565b94505050600101613098565b5050915091565b6001600160ff1b0381565b6000336001600160a01b038516141561316a576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b613172615b14565b6001600160a01b038085166000818152600960209081526040808320805489871680865283862096865260038086528487208e8a1680895290875285882092885260028752858820908852865295849020958701546005880154600189015486516396e973f560e01b81526004810192909252602482015242939093036044840181905294519498939796919591949316926396e973f5926064808201939291829003018186803b15801561322657600080fd5b505afa15801561323a573d6000803e3d6000fd5b505050506040513d602081101561325057600080fd5b505160e0870152600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201889052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156132be57600080fd5b505afa1580156132d2573d6000803e3d6000fd5b505050506040513d60208110156132e857600080fd5b50516080870152600383015481546001600160a01b039091169063e14768ed90613311906151c8565b83600101548960e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d602081101561338757600080fd5b50516101c0870152600384015482546001600160a01b039091169063e14768ed906133b1906151c8565b846001015489608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156133fd57600080fd5b505afa158015613411573d6000803e3d6000fd5b505050506040513d602081101561342757600080fd5b5051610100870152600061343a89614e54565b610380890191909152905080613497576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6134a08a614e54565b6103a08901919091529050806134fd576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b6135198a8a896103a001518a61038001518b6101c001516142bb565b6103008801526103a0870151613532908c908c906150e6565b6102e088015261010087015161030088015161354e91906152bf565b61032088018190526102e088015161356691906152bf565b6103209097018790525094955050505050509392505050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b039485169693851695928516949093169290919087565b60005461010090046001600160a01b03163314613620576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b546001600160a01b03166136395761363982614175565b613641615cc4565b506001600160a01b038085166000908152600960208181526040928390208351610180810185528154815260018201549281019290925260028101549382019390935260038301549093166060840181905260048301546080850152600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015290820154610120840152600a820154610140840152600b909101546101608301526136f5576136f585856129b5565b6136fe85613f79565b60a081015161371657670de0b6b3a764000060a08201525b60e081015161372e57670de0b6b3a764000060e08201525b6101608101516137415761016081018290525b6001600160a01b039485166000908152600960208181526040928390208451815590840151600182015591830151600283015560608301516003830180546001600160a01b03191691909816179096556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015195810195909555610140810151600a8601556101600151600b90940193909355505050565b60005460ff16613834576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191681556001600160a01b03831681526009602090815260408083206002835281842033855290925290912061386e615d2e565b6001600160a01b0385166000908152600960205260409020544281900361389433614a50565b6101408501526101208401819052158015906138b35750610140830151155b613904576040805162461bcd60e51b815260206004820152601960248201527f63616e27742077697468647261772c2073686f727466616c6c00000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b15801561397957600080fd5b505afa15801561398d573d6000803e3d6000fd5b505050506040513d60208110156139a357600080fd5b50516040808501919091526001600160a01b03808916600090815260096020529190912060030154855491169063e14768ed906139df906151c8565b866001015486604001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613a2b57600080fd5b505afa158015613a3f573d6000803e3d6000fd5b505050506040513d6020811015613a5557600080fd5b50516060840152613a6587613ee6565b60c0840152600019861415613aae57613a838784610120015161495d565b61018084018190526060840151613aa791613a9d916152bf565b8460c001516152bf565b8352613ab2565b8583525b825160c0840151613ac89163ffffffff61526e16565b60e084015282516060840151613ae39163ffffffff61526e16565b60808401528251613af5908890614fac565b61016084018190526101208401511015613b49576040805162461bcd60e51b815260206004820152601060248201526f1858d8dbdd5b9d081a5cc81cda1bdc9d60821b604482015290519081900360640190fd5b835460808401516004870154613b6a929161154a919063ffffffff61522016565b60a08401526001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613be457600080fd5b505afa158015613bf8573d6000803e3d6000fd5b505050506040513d6020811015613c0e57600080fd5b50516040808501919091526001600160a01b0380891660009081526009602052919091206003015460e085015191169063a1d7796790613c4d906151c8565b613c5a88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d6020811015613cbf57600080fd5b505160018601556001600160a01b038088166000908152600960209081526040918290206003810154600782015460029092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613d3b57600080fd5b505afa158015613d4f573d6000803e3d6000fd5b505050506040513d6020811015613d6557600080fd5b50516101008401526001600160a01b0380881660009081526009602052604090206003015460e0850151911690634fc5f9cc90613da1906151c8565b613dae88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d6020811015613e1357600080fd5b5051600286015542855560a08301516004860155604083015160058601819055610100840151600787015584546020850152608084015185556001850155613e6c87613e5e30615454565b303387600001516000615457565b8251602080850151608080870151604080513381526001600160a01b038e169581019590955284810195909552606084019290925282015290517f3a0d99036aff524c10246e725551deede13cd5021ca17c7e974432fa11d0faab9181900360a00190a150506000805460ff191660011790555050505050565b60006001600160a01b038216613efd575047612a91565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015613f4657600080fd5b505afa158015613f5a573d6000803e3d6000fd5b505050506040513d6020811015613f7057600080fd5b50519392505050565b60005461010090046001600160a01b03163314613fcb576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b60005b600a5481101561401857816001600160a01b0316600a8281548110613fef57fe5b6000918252602090912001546001600160a01b031614156140105750614065565b600101613fce565b50600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0383161790555b50565b6000612a4d82612a488585612b2b565b600a5490565b6001600160a01b0385166000908152600960205260408120600a0154816140b3670de0b6b3a76400008363ffffffff61522016565b90506140c5868263ffffffff61583c16565b92506140d7838563ffffffff61583c16565b92506140e9838663ffffffff61589f16565b925061410383670de0b6b3a764000063ffffffff61589f16565b6001600160a01b0388166000908152600960205260409020600b0154909350614136908490600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909350614169908490600a0a63ffffffff61589f16565b98975050505050505050565b60005461010090046001600160a01b031633146141c7576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b0316331461423b576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600b0155565b600a54600090815b818110156142b457600061429785600a848154811061427d57fe5b6000918252602090912001546001600160a01b0316614068565b90506142a9848263ffffffff61522016565b935050600101614262565b5050919050565b6001600160a01b0385166000908152600960205260408120600a0154816142f0670de0b6b3a76400008363ffffffff61522016565b90506000614304858763ffffffff61583c16565b9050614332614325670de0b6b3a7640000612a82858b63ffffffff61583c16565b829063ffffffff61589f16565b6001600160a01b038a166000908152600960205260409020600b0154909450614365908590600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909450614398908590600a0a63ffffffff61589f16565b9998505050505050505050565b60005460ff166143ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055806001600160a01b038316614448573482146144415760405162461bcd60e51b8152600401808060200182810382526023815260200180615e186023913960400191505060405180910390fd5b503461449b565b341561449b576040805162461bcd60e51b815260206004820152601a60248201527f4574682073686f756c64206e6f742062652070726f7669646564000000000000604482015290519081900360640190fd5b6144a3615d96565b6001600160a01b03808516600090815260096020908152604080832060028352818420338552835292819020835460038501546005860154600187015485516396e973f560e01b8152600481019290925260248201524283900360448201819052945196979396929591909316926396e973f59260648083019392829003018186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d602081101561455c57600080fd5b505160208681019190915260038501546001600160a01b038a81166000908152600284526040808220338352909452929092205491169063e14768ed906145a2906151c8565b856001015488602001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156145ee57600080fd5b505afa158015614602573d6000803e3d6000fd5b505050506040513d602081101561461857600080fd5b505160408601819052614631908763ffffffff61522016565b60608601819052835460048601546146539261154a919063ffffffff61522016565b608086015261466188613ee6565b60a08601526001600160a01b03881661467e578460a00151614693565b60a0850151614693908763ffffffff61522016565b60c0860181905260038501546001600160a01b03169063a1d77967906146b8906151c8565b6146c587600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561470057600080fd5b505afa158015614714573d6000803e3d6000fd5b505050506040513d602081101561472a57600080fd5b50516001850155600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201849052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561479857600080fd5b505afa1580156147ac573d6000803e3d6000fd5b505050506040513d60208110156147c257600080fd5b505160e0860152600384015460c08601516001600160a01b0390911690634fc5f9cc906147ee906151c8565b6147fb87600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d602081101561486057600080fd5b5051600285015560e08501516007850155602085015160058501819055608086015160048601554285558354808752606087015185556001850191909155604086015111156148ca57845160408601516148c491612e4f919063ffffffff61526e16565b60028401555b6148d3336158fa565b6148ea8833306148e281615454565b8a6000615457565b8451606080870151604080513381526001600160a01b038d1660208201528082018b905292830193909352608082015290517f143bd853fff4531b869cc4385ac10699088f797a4b6fbdfe28577d7fd3fa3fa29181900360a00190a150506000805460ff19166001179055505050505050565b600b546000906001600160a01b03166149ae576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b6000806149ba85614e54565b915091508080156149ca57508115155b614a11576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a47908390612a82908790600a0a63ffffffff61583c16565b95945050505050565b600080600080614a5f8561308e565b909250905080821015614a8b576000614a7e828463ffffffff61526e16565b9094509250614aa9915050565b614a9b828263ffffffff61526e16565b935060009250614aa9915050565b915091565b60005461010090046001600160a01b03163314614b00576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314614b77576040805162461bcd60e51b81526020600482015260136024820152722737ba10383937b837b9b2b21030b236b4b71760691b604482015290519081900360640190fd5b6001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600080614bb68484612a38565b612aad8585612e77565b60005461010090046001600160a01b03163314614c12576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600a0155565b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b1580156128ac57600080fd5b60005461010090046001600160a01b03163314614d13576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b0390911660009081526009602081905260409091200155565b600b546001600160a01b031681565b60005461010090046001600160a01b03163314614d94576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020429055565b600a54600090815b818110156142b4576000614ded85600a8481548110614dd357fe5b6000918252602090912001546001600160a01b0316612cba565b9050614dff848263ffffffff61522016565b935050600101614db8565b60055481565b6001600160a01b038116600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787612e77565b9063ffffffff61583c16565b600b5460009081906001600160a01b0316614ea7576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b600b54604080516330af0bbf60e21b81526001600160a01b038681166004830152825193169263c2bc2efc92602480840193919291829003018186803b158015614ef057600080fd5b505afa158015614f04573d6000803e3d6000fd5b505050506040513d6040811015614f1a57600080fd5b5080516020909101519092509050915091565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a90046001600160a01b03169080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b670de0b6b3a764000081565b600b546000906001600160a01b0316614ffd576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b60008061500985614e54565b9150915080801561501957508115155b615060576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a4790600a0a612a82848763ffffffff61583c16565b6001600160a01b038216600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787614fac565b6006602052600090815260409020546001600160a01b031681565b6000806150f285614a50565b6001600160a01b0386166000908152600960208190526040822090810154600a909101549294509250615137670de0b6b3a764000061154a858563ffffffff61526e16565b9050614169615158670de0b6b3a7640000612a82898563ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154612a82908790600a0a63ffffffff61583c16565b60005461010090046001600160a01b031681565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60006001600160ff1b0382111561521c576040805162461bcd60e51b81526020600482015260136024820152721d5a5b9d081c881a5cc81b9bdd081d985b1a59606a1b604482015290519081900360640190fd5b5090565b600082820183811015612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e7420616464206f766572666c6f7760781b604482015290519081900360640190fd5b6000828211156152b9576040805162461bcd60e51b815260206004820152601160248201527075696e7420737562206f766572666c6f7760781b604482015290519081900360640190fd5b50900390565b6000818310156152d0575081612988565b5080612988565b60006001600160a01b0383166152f857506001600160a01b03811631612988565b604080516370a0823160e01b81526001600160a01b038481166004830152915185928316916370a08231916024808301926020929190829003018186803b15801561534257600080fd5b505afa158015615356573d6000803e3d6000fd5b505050506040513d602081101561536c57600080fd5b5051949350505050565b61537e615ddb565b506040805160e0810182526001600160a01b0397881681529587166020808801918252958816878301908152948816606088019081526080880194855260a088019384524260c089019081526005805460009081526004998a905294909420985189546001600160a01b0319908116918c16919091178a5592516001808b0180548616928d1692909217909155965160028a0180548516918c1691909117905590516003890180549093169916989098179055915193850193909355915183830155925160069092019190915580549091019055565b90565b816154a9576040805162461bcd60e51b815260206004820152601f60248201527f696e76616c696420736166655472616e7366657246726f6d20616d6f756e7400604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316141580156154d357506001600160a01b03861615155b156155a25760408051636eb1769f60e11b81526001600160a01b03878116600483015286811660248301529151849289169163dd62ed3e916044808301926020929190829003018186803b15801561552a57600080fd5b505afa15801561553e573d6000803e3d6000fd5b505050506040513d602081101561555457600080fd5b505110156155a2576040805162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015290519081900360640190fd5b6001600160a01b038616156156835781866001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561560857600080fd5b505afa15801561561c573d6000803e3d6000fd5b505050506040513d602081101561563257600080fd5b5051101561567e576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6156fc565b836001600160a01b0316856001600160a01b031614156156fc5781856001600160a01b03163110156156fc576040805162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74206574682062616c616e63650000000000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316146157a3576001600160a01b038616156157445761573f6001600160a01b03871686858563ffffffff61596116565b61579e565b801580159061575257508181115b1561579e576001600160a01b0385166108fc615774838563ffffffff61526e16565b6040518115909202916000818181858888f1935050505015801561579c573d6000803e3d6000fd5b505b615834565b6001600160a01b038616156157cc5761579e6001600160a01b038716848463ffffffff6159c116565b80158015906157da57508181115b156157fc576001600160a01b0383166108fc615774838563ffffffff61526e16565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015615832573d6000803e3d6000fd5b505b505050505050565b60008261584b57506000612988565b8282028284828161585857fe5b0414612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e74206d756c206f766572666c6f7760781b604482015290519081900360640190fd5b6000816158e6576040805162461bcd60e51b815260206004820152601060248201526f75696e7420646976206279207a65726f60801b604482015290519081900360640190fd5b60008284816158f157fe5b04949350505050565b6001600160a01b0381166000908152600760205260409020546140655760088054600090815260066020908152604080832080546001600160a01b0387166001600160a01b0319909116811790915584549084526007909252909120819055600101905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526159bb908590615a18565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a13908490615a18565b505050565b615a2a826001600160a01b0316615b0e565b615a3357600080fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a715780518252601f199092019160209182019101615a52565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ad3576040519150601f19603f3d011682016040523d82523d6000602084013e615ad8565b606091505b509150915081615ae757600080fd5b8051156159bb57808060200190516020811015615b0357600080fd5b50516159bb57600080fd5b3b151590565b604051806103c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe4574682076616c75652073686f756c6420626520657175616c20746f20616d6f756e745265656e7472616e637947756172643a207265656e7472616e742063616c6c004574682076616c75652073686f756c6420626520657175616c20746f207265706179416d6f756e746f6e6c792061646d696e2063616e20646f20746869732100000000000000000063616e277420626f72726f772c20776974686f757420656e6f7567682076616c75654574682076616c75652073686f756c64206265206c6172676572207468616e207265706179416d6f756e74636c6f7365426f72726f77416d6f756e74203e206d6178436c6f736561626c65426f72726f77416d6f756e7420657272a265627a7a7231582092b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c62764736f6c634300050d0032
Deployed Bytecode
0x6080604052600436106103975760003560e01c80637701d0bd116101dc578063c5af0bab11610102578063e03368c1116100a0578063f2a40db81161006f578063f2a40db814610f5f578063f673e9ca14610f89578063f851a44014610fcc578063feb59ccf14610fe157610397565b8063e03368c114610ed8578063ea3a4c6014610ed8578063ed1d840d14610eed578063f0f8aff914610f2657610397565b8063d3339024116100dc578063d333902414610da2578063d7d9dba014610db7578063ddec280e14610df2578063de6843c314610e3e57610397565b8063c5af0bab14610d27578063c92fcfb314610d3c578063cb3db56314610d6f57610397565b8063a21accdc1161017a578063b7fc3ada11610149578063b7fc3ada14610c7a578063b8bb5c421461060e578063ba37773114610cb3578063bbde010214610cee57610397565b8063a21accdc14610bc4578063a637674614610bf7578063ad2cb23914610c2a578063b19322a614610c3f57610397565b8063841d0071116101b6578063841d007114610add5780638cd3b02214610b1057806391de89c614610b5f5780639c74acda14610b8b57610397565b80637701d0bd14610a225780637adbf97314610a715780637e67e5ce14610aa457610397565b806335b773cb116102c157806341ed3ad61161025f578063607b463a1161022e578063607b463a1461096c57806365dc4e3a1461099f5780636e04d137146109d25780636e2ede0314610a0d57610397565b806341ed3ad6146108315780634613f1271461087657806353131ab5146108ea5780636012481a1461093357610397565b80633e3ae88a1161029b5780633e3ae88a146107575780634100b9f01461079057806341b41316146107e957806341d6864e1461081c57610397565b806335b773cb146106a65780633c03d33e146106e15780633cb7317b1461071c57610397565b80631b6a935e116103395780632c7769b2116103085780632c7769b21461060e5780632db78d931461062357806332f751ec14610656578063332279b11461066b57610397565b80631b6a935e1461054857806326bc59fa1461057257806327001627146105c65780632986c0e5146105f957610397565b8063118e31b711610375578063118e31b71461043f578063172c48c71461048c57806317585b12146104d25780631925a7511461050d57610397565b80630cffc6761461039c5780630ddeb327146103da578063101828d114610406575b600080fd5b6103d8600480360360808110156103b257600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561101c565b005b6103d8600480360360408110156103f057600080fd5b506001600160a01b038135169060200135611c69565b34801561041257600080fd5b506103d86004803603604081101561042957600080fd5b506001600160a01b038135169060200135612250565b34801561044b57600080fd5b5061047a6004803603604081101561046257600080fd5b506001600160a01b038135811691602001351661281b565b60408051918252519081900360200190f35b34801561049857600080fd5b506104b6600480360360208110156104af57600080fd5b503561298e565b604080516001600160a01b039092168252519081900360200190f35b3480156104de57600080fd5b506103d8600480360360408110156104f557600080fd5b506001600160a01b03813581169160200135166129b5565b34801561051957600080fd5b5061047a6004803603604081101561053057600080fd5b506001600160a01b0381358116916020013516612a38565b34801561055457600080fd5b5061047a6004803603602081101561056b57600080fd5b5035612a54565b34801561057e57600080fd5b506105ad6004803603604081101561059557600080fd5b506001600160a01b0381358116916020013516612a96565b6040805192835260208301919091528051918290030190f35b3480156105d257600080fd5b5061047a600480360360208110156105e957600080fd5b50356001600160a01b0316612ab8565b34801561060557600080fd5b5061047a612aff565b34801561061a57600080fd5b5061047a612b05565b34801561062f57600080fd5b5061047a6004803603602081101561064657600080fd5b50356001600160a01b0316612b0a565b34801561066257600080fd5b506104b6612b1c565b34801561067757600080fd5b5061047a6004803603604081101561068e57600080fd5b506001600160a01b0381358116916020013516612b2b565b3480156106b257600080fd5b5061047a600480360360408110156106c957600080fd5b506001600160a01b0381358116916020013516612cba565b3480156106ed57600080fd5b5061047a6004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516612cc6565b34801561072857600080fd5b5061047a6004803603604081101561073f57600080fd5b506001600160a01b0381358116916020013516612e77565b34801561076357600080fd5b506103d86004803603604081101561077a57600080fd5b506001600160a01b038135169060200135612e87565b34801561079c57600080fd5b506107cb600480360360408110156107b357600080fd5b506001600160a01b0381358116916020013516613066565b60408051938452602084019290925282820152519081900360600190f35b3480156107f557600080fd5b506105ad6004803603602081101561080c57600080fd5b50356001600160a01b031661308e565b34801561082857600080fd5b5061047a613108565b34801561083d57600080fd5b5061047a6004803603606081101561085457600080fd5b506001600160a01b038135811691602081013582169160409091013516613113565b34801561088257600080fd5b506108a06004803603602081101561089957600080fd5b503561357f565b604080516001600160a01b039889168152968816602088015294871686860152929095166060850152608084015260a083019390935260c082019290925290519081900360e00190f35b3480156108f657600080fd5b506103d86004803603608081101561090d57600080fd5b506001600160a01b038135811691602081013582169160408201351690606001356135ce565b34801561093f57600080fd5b506103d86004803603604081101561095657600080fd5b506001600160a01b0381351690602001356137ef565b34801561097857600080fd5b5061047a6004803603602081101561098f57600080fd5b50356001600160a01b0316613ee6565b3480156109ab57600080fd5b506103d8600480360360208110156109c257600080fd5b50356001600160a01b0316613f79565b3480156109de57600080fd5b5061047a600480360360408110156109f557600080fd5b506001600160a01b0381358116916020013516614068565b348015610a1957600080fd5b5061047a614078565b348015610a2e57600080fd5b5061047a600480360360a0811015610a4557600080fd5b506001600160a01b0381358116916020810135909116906040810135906060810135906080013561407e565b348015610a7d57600080fd5b506103d860048036036020811015610a9457600080fd5b50356001600160a01b0316614175565b348015610ab057600080fd5b506103d860048036036040811015610ac757600080fd5b506001600160a01b0381351690602001356141e9565b348015610ae957600080fd5b5061047a60048036036020811015610b0057600080fd5b50356001600160a01b031661425a565b348015610b1c57600080fd5b5061047a600480360360a0811015610b3357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608001356142bb565b6103d860048036036040811015610b7557600080fd5b506001600160a01b0381351690602001356143a5565b348015610b9757600080fd5b5061047a60048036036040811015610bae57600080fd5b506001600160a01b03813516906020013561495d565b348015610bd057600080fd5b506105ad60048036036020811015610be757600080fd5b50356001600160a01b0316614a50565b348015610c0357600080fd5b506103d860048036036020811015610c1a57600080fd5b50356001600160a01b0316614aae565b348015610c3657600080fd5b506103d8614b22565b348015610c4b57600080fd5b506105ad60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516614ba9565b348015610c8657600080fd5b506103d860048036036040811015610c9d57600080fd5b506001600160a01b038135169060200135614bc0565b348015610cbf57600080fd5b5061047a60048036036040811015610cd657600080fd5b506001600160a01b0381358116916020013516614c31565b348015610cfa57600080fd5b506103d860048036036040811015610d1157600080fd5b506001600160a01b038135169060200135614cc1565b348015610d3357600080fd5b506104b6614d33565b348015610d4857600080fd5b506103d860048036036020811015610d5f57600080fd5b50356001600160a01b0316614d42565b348015610d7b57600080fd5b5061047a60048036036020811015610d9257600080fd5b50356001600160a01b0316614db0565b348015610dae57600080fd5b5061047a614e0a565b348015610dc357600080fd5b5061047a60048036036040811015610dda57600080fd5b506001600160a01b0381358116916020013516614e10565b348015610dfe57600080fd5b50610e2560048036036020811015610e1557600080fd5b50356001600160a01b0316614e54565b6040805192835290151560208301528051918290030190f35b348015610e4a57600080fd5b50610e7160048036036020811015610e6157600080fd5b50356001600160a01b0316614f2d565b604080519c8d5260208d019b909b528b8b01999099526001600160a01b0390971660608b015260808a019590955260a089019390935260c088019190915260e087015261010086015261012085015261014084015261016083015251908190036101800190f35b348015610ee457600080fd5b5061047a614fa0565b348015610ef957600080fd5b5061047a60048036036040811015610f1057600080fd5b506001600160a01b038135169060200135614fac565b348015610f3257600080fd5b5061047a60048036036040811015610f4957600080fd5b506001600160a01b038135169060200135615093565b348015610f6b57600080fd5b506104b660048036036020811015610f8257600080fd5b50356150cb565b348015610f9557600080fd5b5061047a60048036036060811015610fac57600080fd5b506001600160a01b038135811691602081013590911690604001356150e6565b348015610fd857600080fd5b506104b6615188565b348015610fed57600080fd5b506107cb6004803603604081101561100457600080fd5b506001600160a01b038135811691602001351661519c565b60005460ff16611061576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055336001600160a01b03851614156110c0576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b6110c8615b14565b6001600160a01b03808616808352858216602080850182905233604080870191825288861660608801819052600085815260098552828120805483835284832097835260038752848320898452875284832084845260028089528685209a85528a89528685209585528852955190991682529690945290832042969096039591929091906111558a614e54565b6103808a01919091529050806111b2576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6111bb8b614e54565b6103a08a0191909152905080611218576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b600386015460078701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d60208110156112a957600080fd5b50516080890152600386015484546001600160a01b039091169063e14768ed906112d2906151c8565b86600101548b608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561131e57600080fd5b505afa158015611332573d6000803e3d6000fd5b505050506040513d602081101561134857600080fd5b5051610100890152600385015460058601546001870154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156113b757600080fd5b505afa1580156113cb573d6000803e3d6000fd5b505050506040513d60208110156113e157600080fd5b505160e0890152600385015483546001600160a01b039091169063e14768ed9061140a906151c8565b85600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561145657600080fd5b505afa15801561146a573d6000803e3d6000fd5b505050506040513d602081101561148057600080fd5b50516101c0890152600385015482546001600160a01b039091169063e14768ed906114aa906151c8565b84600101548b60e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156114f657600080fd5b505afa15801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161020089015282546101c08901516004870154611556929161154a919063ffffffff61522016565b9063ffffffff61526e16565b610240890181905282546102008a01516115799261154a9163ffffffff61522016565b6102408901526103a08801516103808901516101c08a015161159e928e928e926142bb565b6103008901526103a08801516115b7908d908d906150e6565b6102e08901526101008801516103008901516115e1916115d6916152bf565b896102e001516152bf565b6103208901526000198914156116025761032088015161034089015261160b565b61034088018990525b87610320015188610340015111156116545760405162461bcd60e51b8152600401808060200182810382526030815260200180615ef06030913960400191505060405180910390fd5b6001600160a01b038b166116b2578761034001513410156116ad576040805162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b604482015290519081900360640190fd5b611710565b8761034001516116c68c8a604001516152d7565b1015611710576040805162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b61172c8b8b8a6103a001518b61038001518c610340015161407e565b61036089015261034088015161010089015161174d9163ffffffff61526e16565b6101208901819052845460068801546117709261154a919063ffffffff61522016565b61014089015261177f8b613ee6565b6102608901526001600160a01b038b1661179e578761026001516117b9565b6103408801516102608901516117b99163ffffffff61522016565b610280890152600386015460058701546002880154604080516396e973f560e01b815260048101939093526024830191909152604482018a9052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561182657600080fd5b505afa15801561183a573d6000803e3d6000fd5b505050506040513d602081101561185057600080fd5b505160a089015260038601546102808901516101408a01516040805163a1d7796760e01b815260048101939093526024830191909152516001600160a01b039092169163a1d7796791604480820192602092909190829003018186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d60208110156118e357600080fd5b5051600187015560038601546102808901516101408a0151604080516313f17e7360e21b815260048101939093526024830191909152516001600160a01b0390921691634fc5f9cc91604480820192602092909190829003018186803b15801561194c57600080fd5b505afa158015611960573d6000803e3d6000fd5b505050506040513d602081101561197657600080fd5b50516002808801919091556003860154600587015491870154604080516396e973f560e01b815260048101949094526024840191909152604483018a9052516001600160a01b03909116916396e973f5916064808301926020929190829003018186803b1580156119e657600080fd5b505afa1580156119fa573d6000803e3d6000fd5b505050506040513d6020811015611a1057600080fd5b505160c08901526103608801516101c0890151611a329163ffffffff61526e16565b6101e0890152610360880151610200890151611a539163ffffffff61522016565b8861022001818152505042866000018190555087610140015186600601819055508760a0015186600501819055508760800151866007018190555042856000018190555087610240015185600401819055508760e0015185600501819055508760c001518560070181905550836000015488610160018181525050876101200151846000018190555087608001518460010181905550826000015488610180018181525050876101e0015183600001819055508760e0015183600101819055508160000154886101a001818152505087610220015182600001819055508760e001518260010181905550611b61886000015189604001518a606001518e8c61036001518d6103400151615376565b611b918b611b7b8a604001516001600160a01b0316615454565b30611b8581615454565b8c610340015134615457565b7f564b05ce5b1718b3406f5483d56f1b9609a9aab4603bdaeba9c415e0b38b039e88600001518c8a61012001518b604001518c606001518d6101e0015160405180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001858152602001846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001965050505050505060405180910390a150506000805460ff1916600117905550505050505050505050565b60005460ff16611cae576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055611cc0615c17565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d6020811015611d7d57600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed90611db7906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015611dff57600080fd5b505afa158015611e13573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b50516020870152600019871415611eab57611e51611e4789336152d7565b87602001516152bf565b60408701526001600160a01b038816611ea65785604001513411611ea65760405162461bcd60e51b815260040180806020018281038252602b815260200180615ec5602b913960400191505060405180910390fd5b611f02565b604086018790526001600160a01b038816611f025785604001513414611f025760405162461bcd60e51b8152600401808060200182810382526028815260200180615e5b6028913960400191505060405180910390fd5b60408601516020870151611f1b9163ffffffff61526e16565b6060870181905284546006870154611f3d9261154a919063ffffffff61522016565b6080870152611f4b88613ee6565b60a08701526001600160a01b038816611f68578560a00151611f81565b604086015160a0870151611f819163ffffffff61522016565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d602081101561202557600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612060906151c8565b61206d89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc9061210d906151c8565b61211a89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561215557600080fd5b505afa158015612169573d6000803e3d6000fd5b505050506040513d602081101561217f57600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556121d48833306121c981615454565b8a6040015134615457565b6040808701516101008801516060808a015184513381526001600160a01b038e1660208201528086019490945290830191909152608082015290517f95536f77ac48f30901e02b7e98147d28fa621a9296283b46afa87ea9f994290d9181900360a00190a150506000805460ff19166001179055505050505050565b60005460ff16612295576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191690556122a7615c63565b6001600160a01b03808416600081815260096020818152604080842060038084528286203387528452828620969095529282528254938301546007840154600285015483516396e973f560e01b815260048101929092526024820152428690036044820181905292519497929491909216926396e973f59260648082019391829003018186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d602081101561236457600080fd5b5051855260018301546001600160a01b03808916600090815260096020526040902060030154855491169063e14768ed9061239e906151c8565b8389600001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156123e657600080fd5b505afa1580156123fa573d6000803e3d6000fd5b505050506040513d602081101561241057600080fd5b5051602087015261242087612a54565b60408701819052602087015161243b9163ffffffff61522016565b606087018190528454600687015461245d9261154a919063ffffffff61522016565b608087015261246b33614a50565b61014088015261012087018190521580159061248a5750610140860151155b6124db576040805162461bcd60e51b815260206004820152601760248201527f63616e277420626f72726f772c2073686f727466616c6c000000000000000000604482015290519081900360640190fd5b6124e9888760400151615093565b610160870181905261012087015110156125345760405162461bcd60e51b8152600401808060200182810382526022815260200180615ea36022913960400191505060405180910390fd5b61253d88613ee6565b60a08701819052612554908863ffffffff61526e16565b60c08701526001600160a01b038089166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201879052925192909316926396e973f59260648083019392829003018186803b1580156125ce57600080fd5b505afa1580156125e2573d6000803e3d6000fd5b505050506040513d60208110156125f857600080fd5b505160e08701526001600160a01b0380891660009081526009602052604090206003015460c088015191169063a1d7796790612633906151c8565b61264089608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561267b57600080fd5b505afa15801561268f573d6000803e3d6000fd5b505050506040513d60208110156126a557600080fd5b505160018601556001600160a01b0380891660009081526009602052604090206003015460c0880151911690634fc5f9cc906126e0906151c8565b6126ed89608001516151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561272857600080fd5b505afa15801561273c573d6000803e3d6000fd5b505050506040513d602081101561275257600080fd5b505160028601554285556080860151600686015560e0860151600586015585516007860181905584546101008801526060870151855560018501556127a48861279a30615454565b30338b6000615457565b610100860151606080880151604080513381526001600160a01b038d1660208201528082018c905292830193909352608082015290517fccf497a6d8ab6e2d0cd3345e3f91702b378c9ba26a707adc43e47ec8ceccacbd9181900360a00190a150506000805460ff19166001179055505050505050565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b1580156128ac57600080fd5b505afa1580156128c0573d6000803e3d6000fd5b505050506040513d60208110156128d657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed9061290e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561295657600080fd5b505afa15801561296a573d6000803e3d6000fd5b505050506040513d602081101561298057600080fd5b505193505050505b92915050565b600a818154811061299b57fe5b6000918252602090912001546001600160a01b0316905081565b60005461010090046001600160a01b03163314612a07576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03918216600090815260096020526040902060030180546001600160a01b03191691909216179055565b6000612a4d82612a488585614c31565b614fac565b9392505050565b6000612a8e670de0b6b3a7640000612a82612a75828563ffffffff61522016565b859063ffffffff61583c16565b9063ffffffff61589f16565b90505b919050565b600080612aa38484612a38565b612aad8585614e10565b915091509250929050565b6001600160a01b03811660009081526009602052604081206006810154600490910154612af781612a8284670de0b6b3a764000063ffffffff61583c16565b949350505050565b60085481565b600081565b60076020526000908152604090205481565b6001546001600160a01b031681565b6001600160a01b03808216600081815260036020818152604080842088871685528252808420948452600982528084209283015460078401546002850154945483516396e973f560e01b815260048101929092526024820195909552429490940360448501529051939586949116926396e973f5926064808301939192829003018186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612c1e906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612c6657600080fd5b505afa158015612c7a573d6000803e3d6000fd5b505050506040513d6020811015612c9057600080fd5b505183546002850154919250612cb09161154a908463ffffffff61522016565b9695505050505050565b6000612a4d82612a4885855b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b158015612d5657600080fd5b505afa158015612d6a573d6000803e3d6000fd5b505050506040513d6020811015612d8057600080fd5b50516001600160a01b038086166000908152600960205260408120600301548554939450909291169063e14768ed90612db8906151c8565b8560010154856040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015612e0057600080fd5b505afa158015612e14573d6000803e3d6000fd5b505050506040513d6020811015612e2a57600080fd5b50518354909150811115612e6a578254612e6090612e4f90839063ffffffff61526e16565b60028501549063ffffffff61522016565b9350505050612988565b5050600201549050612988565b6000612a4d82612a48858561281b565b60005460ff16612ecc576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169081905561010090046001600160a01b03163314612f27576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6000612f3283613ee6565b6001600160a01b038416600090815260096020526040812060048101546006909101549293509091612f70919061154a90859063ffffffff61522016565b905082811015612fc7576040805162461bcd60e51b815260206004820152601a60248201527f696e73756666696369656e742065717569747920616d6f756e74000000000000604482015290519081900360640190fd5b612ff884612fd430615454565b6000543090612ff09061010090046001600160a01b0316615454565b876000615457565b600054604080516001600160a01b03808816825260208201859052818301879052610100909304929092166060830152517ff436439e28c1812ec03906f344bbce09c25881eae35d800d55585265cc9d7c8b9181900360800190a150506000805460ff191660011790555050565b6002602081815260009384526040808520909152918352912080546001820154919092015483565b600a546000908190815b81811015613101576000806130ce87600a85815481106130b457fe5b6000918252602090912001546001600160a01b0316612a96565b90925090506130e3868363ffffffff61522016565b95506130f5858263ffffffff61522016565b94505050600101613098565b5050915091565b6001600160ff1b0381565b6000336001600160a01b038516141561316a576040805162461bcd60e51b815260206004820152601460248201527363616e27742073656c662d6c697175696461746560601b604482015290519081900360640190fd5b613172615b14565b6001600160a01b038085166000818152600960209081526040808320805489871680865283862096865260038086528487208e8a1680895290875285882092885260028752858820908852865295849020958701546005880154600189015486516396e973f560e01b81526004810192909252602482015242939093036044840181905294519498939796919591949316926396e973f5926064808201939291829003018186803b15801561322657600080fd5b505afa15801561323a573d6000803e3d6000fd5b505050506040513d602081101561325057600080fd5b505160e0870152600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201889052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b1580156132be57600080fd5b505afa1580156132d2573d6000803e3d6000fd5b505050506040513d60208110156132e857600080fd5b50516080870152600383015481546001600160a01b039091169063e14768ed90613311906151c8565b83600101548960e001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b15801561335d57600080fd5b505afa158015613371573d6000803e3d6000fd5b505050506040513d602081101561338757600080fd5b50516101c0870152600384015482546001600160a01b039091169063e14768ed906133b1906151c8565b846001015489608001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156133fd57600080fd5b505afa158015613411573d6000803e3d6000fd5b505050506040513d602081101561342757600080fd5b5051610100870152600061343a89614e54565b610380890191909152905080613497576040805162461bcd60e51b815260206004820152601b60248201527f6661696c20746f2067657420636f6c6c61746572616c50726963650000000000604482015290519081900360640190fd5b6134a08a614e54565b6103a08901919091529050806134fd576040805162461bcd60e51b815260206004820181905260248201527f6661696c20746f2067657420756e646572776174657241737365745072696365604482015290519081900360640190fd5b6135198a8a896103a001518a61038001518b6101c001516142bb565b6103008801526103a0870151613532908c908c906150e6565b6102e088015261010087015161030088015161354e91906152bf565b61032088018190526102e088015161356691906152bf565b6103209097018790525094955050505050509392505050565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b039485169693851695928516949093169290919087565b60005461010090046001600160a01b03163314613620576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b546001600160a01b03166136395761363982614175565b613641615cc4565b506001600160a01b038085166000908152600960208181526040928390208351610180810185528154815260018201549281019290925260028101549382019390935260038301549093166060840181905260048301546080850152600583015460a0850152600683015460c0850152600783015460e0850152600883015461010085015290820154610120840152600a820154610140840152600b909101546101608301526136f5576136f585856129b5565b6136fe85613f79565b60a081015161371657670de0b6b3a764000060a08201525b60e081015161372e57670de0b6b3a764000060e08201525b6101608101516137415761016081018290525b6001600160a01b039485166000908152600960208181526040928390208451815590840151600182015591830151600283015560608301516003830180546001600160a01b03191691909816179096556080820151600482015560a0820151600582015560c0820151600682015560e08201516007820155610100820151600882015561012082015195810195909555610140810151600a8601556101600151600b90940193909355505050565b60005460ff16613834576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff191681556001600160a01b03831681526009602090815260408083206002835281842033855290925290912061386e615d2e565b6001600160a01b0385166000908152600960205260409020544281900361389433614a50565b6101408501526101208401819052158015906138b35750610140830151155b613904576040805162461bcd60e51b815260206004820152601960248201527f63616e27742077697468647261772c2073686f727466616c6c00000000000000604482015290519081900360640190fd5b6001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b15801561397957600080fd5b505afa15801561398d573d6000803e3d6000fd5b505050506040513d60208110156139a357600080fd5b50516040808501919091526001600160a01b03808916600090815260096020529190912060030154855491169063e14768ed906139df906151c8565b866001015486604001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b158015613a2b57600080fd5b505afa158015613a3f573d6000803e3d6000fd5b505050506040513d6020811015613a5557600080fd5b50516060840152613a6587613ee6565b60c0840152600019861415613aae57613a838784610120015161495d565b61018084018190526060840151613aa791613a9d916152bf565b8460c001516152bf565b8352613ab2565b8583525b825160c0840151613ac89163ffffffff61526e16565b60e084015282516060840151613ae39163ffffffff61526e16565b60808401528251613af5908890614fac565b61016084018190526101208401511015613b49576040805162461bcd60e51b815260206004820152601060248201526f1858d8dbdd5b9d081a5cc81cda1bdc9d60821b604482015290519081900360640190fd5b835460808401516004870154613b6a929161154a919063ffffffff61522016565b60a08401526001600160a01b038088166000908152600960209081526040918290206003810154600582015460019092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613be457600080fd5b505afa158015613bf8573d6000803e3d6000fd5b505050506040513d6020811015613c0e57600080fd5b50516040808501919091526001600160a01b0380891660009081526009602052919091206003015460e085015191169063a1d7796790613c4d906151c8565b613c5a88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613c9557600080fd5b505afa158015613ca9573d6000803e3d6000fd5b505050506040513d6020811015613cbf57600080fd5b505160018601556001600160a01b038088166000908152600960209081526040918290206003810154600782015460029092015484516396e973f560e01b81526004810193909352602483015260448201869052925192909316926396e973f59260648083019392829003018186803b158015613d3b57600080fd5b505afa158015613d4f573d6000803e3d6000fd5b505050506040513d6020811015613d6557600080fd5b50516101008401526001600160a01b0380881660009081526009602052604090206003015460e0850151911690634fc5f9cc90613da1906151c8565b613dae88600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d6020811015613e1357600080fd5b5051600286015542855560a08301516004860155604083015160058601819055610100840151600787015584546020850152608084015185556001850155613e6c87613e5e30615454565b303387600001516000615457565b8251602080850151608080870151604080513381526001600160a01b038e169581019590955284810195909552606084019290925282015290517f3a0d99036aff524c10246e725551deede13cd5021ca17c7e974432fa11d0faab9181900360a00190a150506000805460ff191660011790555050505050565b60006001600160a01b038216613efd575047612a91565b604080516370a0823160e01b8152306004820152905183916001600160a01b038316916370a0823191602480820192602092909190829003018186803b158015613f4657600080fd5b505afa158015613f5a573d6000803e3d6000fd5b505050506040513d6020811015613f7057600080fd5b50519392505050565b60005461010090046001600160a01b03163314613fcb576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b60005b600a5481101561401857816001600160a01b0316600a8281548110613fef57fe5b6000918252602090912001546001600160a01b031614156140105750614065565b600101613fce565b50600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0383161790555b50565b6000612a4d82612a488585612b2b565b600a5490565b6001600160a01b0385166000908152600960205260408120600a0154816140b3670de0b6b3a76400008363ffffffff61522016565b90506140c5868263ffffffff61583c16565b92506140d7838563ffffffff61583c16565b92506140e9838663ffffffff61589f16565b925061410383670de0b6b3a764000063ffffffff61589f16565b6001600160a01b0388166000908152600960205260409020600b0154909350614136908490600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909350614169908490600a0a63ffffffff61589f16565b98975050505050505050565b60005461010090046001600160a01b031633146141c7576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b60005461010090046001600160a01b0316331461423b576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600b0155565b600a54600090815b818110156142b457600061429785600a848154811061427d57fe5b6000918252602090912001546001600160a01b0316614068565b90506142a9848263ffffffff61522016565b935050600101614262565b5050919050565b6001600160a01b0385166000908152600960205260408120600a0154816142f0670de0b6b3a76400008363ffffffff61522016565b90506000614304858763ffffffff61583c16565b9050614332614325670de0b6b3a7640000612a82858b63ffffffff61583c16565b829063ffffffff61589f16565b6001600160a01b038a166000908152600960205260409020600b0154909450614365908590600a0a63ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154909450614398908590600a0a63ffffffff61589f16565b9998505050505050505050565b60005460ff166143ea576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e3b833981519152604482015290519081900360640190fd5b6000805460ff19169055806001600160a01b038316614448573482146144415760405162461bcd60e51b8152600401808060200182810382526023815260200180615e186023913960400191505060405180910390fd5b503461449b565b341561449b576040805162461bcd60e51b815260206004820152601a60248201527f4574682073686f756c64206e6f742062652070726f7669646564000000000000604482015290519081900360640190fd5b6144a3615d96565b6001600160a01b03808516600090815260096020908152604080832060028352818420338552835292819020835460038501546005860154600187015485516396e973f560e01b8152600481019290925260248201524283900360448201819052945196979396929591909316926396e973f59260648083019392829003018186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d602081101561455c57600080fd5b505160208681019190915260038501546001600160a01b038a81166000908152600284526040808220338352909452929092205491169063e14768ed906145a2906151c8565b856001015488602001516040518463ffffffff1660e01b815260040180848152602001838152602001828152602001935050505060206040518083038186803b1580156145ee57600080fd5b505afa158015614602573d6000803e3d6000fd5b505050506040513d602081101561461857600080fd5b505160408601819052614631908763ffffffff61522016565b60608601819052835460048601546146539261154a919063ffffffff61522016565b608086015261466188613ee6565b60a08601526001600160a01b03881661467e578460a00151614693565b60a0850151614693908763ffffffff61522016565b60c0860181905260038501546001600160a01b03169063a1d77967906146b8906151c8565b6146c587600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561470057600080fd5b505afa158015614714573d6000803e3d6000fd5b505050506040513d602081101561472a57600080fd5b50516001850155600384015460078501546002860154604080516396e973f560e01b81526004810193909352602483019190915260448201849052516001600160a01b03909216916396e973f591606480820192602092909190829003018186803b15801561479857600080fd5b505afa1580156147ac573d6000803e3d6000fd5b505050506040513d60208110156147c257600080fd5b505160e0860152600384015460c08601516001600160a01b0390911690634fc5f9cc906147ee906151c8565b6147fb87600601546151c8565b6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561483657600080fd5b505afa15801561484a573d6000803e3d6000fd5b505050506040513d602081101561486057600080fd5b5051600285015560e08501516007850155602085015160058501819055608086015160048601554285558354808752606087015185556001850191909155604086015111156148ca57845160408601516148c491612e4f919063ffffffff61526e16565b60028401555b6148d3336158fa565b6148ea8833306148e281615454565b8a6000615457565b8451606080870151604080513381526001600160a01b038d1660208201528082018b905292830193909352608082015290517f143bd853fff4531b869cc4385ac10699088f797a4b6fbdfe28577d7fd3fa3fa29181900360a00190a150506000805460ff19166001179055505050505050565b600b546000906001600160a01b03166149ae576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b6000806149ba85614e54565b915091508080156149ca57508115155b614a11576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a47908390612a82908790600a0a63ffffffff61583c16565b95945050505050565b600080600080614a5f8561308e565b909250905080821015614a8b576000614a7e828463ffffffff61526e16565b9094509250614aa9915050565b614a9b828263ffffffff61526e16565b935060009250614aa9915050565b915091565b60005461010090046001600160a01b03163314614b00576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314614b77576040805162461bcd60e51b81526020600482015260136024820152722737ba10383937b837b9b2b21030b236b4b71760691b604482015290519081900360640190fd5b6001805460008054610100600160a81b0319166101006001600160a01b038416021790556001600160a01b0319169055565b600080614bb68484612a38565b612aad8585612e77565b60005461010090046001600160a01b03163314614c12576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600960205260409020600a0155565b6001600160a01b0380821660008181526002602090815260408083208786168452825280832093835260098252808320600381015460058201546001830154925484516396e973f560e01b815260048101929092526024820193909352429290920360448301529151939586949216926396e973f592606480840193829003018186803b1580156128ac57600080fd5b60005461010090046001600160a01b03163314614d13576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b0390911660009081526009602081905260409091200155565b600b546001600160a01b031681565b60005461010090046001600160a01b03163314614d94576040805162461bcd60e51b81526020600482015260176024820152600080516020615e83833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600960205260409020429055565b600a54600090815b818110156142b4576000614ded85600a8481548110614dd357fe5b6000918252602090912001546001600160a01b0316612cba565b9050614dff848263ffffffff61522016565b935050600101614db8565b60055481565b6001600160a01b038116600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787612e77565b9063ffffffff61583c16565b600b5460009081906001600160a01b0316614ea7576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b600b54604080516330af0bbf60e21b81526001600160a01b038681166004830152825193169263c2bc2efc92602480840193919291829003018186803b158015614ef057600080fd5b505afa158015614f04573d6000803e3d6000fd5b505050506040513d6040811015614f1a57600080fd5b5080516020909101519092509050915091565b60096020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a90046001600160a01b03169080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508c565b670de0b6b3a764000081565b600b546000906001600160a01b0316614ffd576040805162461bcd60e51b815260206004820152600e60248201526d1bdc9858db19481b9bdd081cd95d60921b604482015290519081900360640190fd5b60008061500985614e54565b9150915080801561501957508115155b615060576040805162461bcd60e51b8152602060048201526013602482015272696e76616c696420746f6b656e20707269636560681b604482015290519081900360640190fd5b6001600160a01b0385166000908152600960205260409020600b0154614a4790600a0a612a82848763ffffffff61583c16565b6001600160a01b038216600090815260096020819052604082200154612a4d90670de0b6b3a764000090612a8290614e488787614fac565b6006602052600090815260409020546001600160a01b031681565b6000806150f285614a50565b6001600160a01b0386166000908152600960208190526040822090810154600a909101549294509250615137670de0b6b3a764000061154a858563ffffffff61526e16565b9050614169615158670de0b6b3a7640000612a82898563ffffffff61583c16565b6001600160a01b0389166000908152600960205260409020600b0154612a82908790600a0a63ffffffff61583c16565b60005461010090046001600160a01b031681565b600360209081526000928352604080842090915290825290208054600182015460029092015490919083565b60006001600160ff1b0382111561521c576040805162461bcd60e51b81526020600482015260136024820152721d5a5b9d081c881a5cc81b9bdd081d985b1a59606a1b604482015290519081900360640190fd5b5090565b600082820183811015612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e7420616464206f766572666c6f7760781b604482015290519081900360640190fd5b6000828211156152b9576040805162461bcd60e51b815260206004820152601160248201527075696e7420737562206f766572666c6f7760781b604482015290519081900360640190fd5b50900390565b6000818310156152d0575081612988565b5080612988565b60006001600160a01b0383166152f857506001600160a01b03811631612988565b604080516370a0823160e01b81526001600160a01b038481166004830152915185928316916370a08231916024808301926020929190829003018186803b15801561534257600080fd5b505afa158015615356573d6000803e3d6000fd5b505050506040513d602081101561536c57600080fd5b5051949350505050565b61537e615ddb565b506040805160e0810182526001600160a01b0397881681529587166020808801918252958816878301908152948816606088019081526080880194855260a088019384524260c089019081526005805460009081526004998a905294909420985189546001600160a01b0319908116918c16919091178a5592516001808b0180548616928d1692909217909155965160028a0180548516918c1691909117905590516003890180549093169916989098179055915193850193909355915183830155925160069092019190915580549091019055565b90565b816154a9576040805162461bcd60e51b815260206004820152601f60248201527f696e76616c696420736166655472616e7366657246726f6d20616d6f756e7400604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316141580156154d357506001600160a01b03861615155b156155a25760408051636eb1769f60e11b81526001600160a01b03878116600483015286811660248301529151849289169163dd62ed3e916044808301926020929190829003018186803b15801561552a57600080fd5b505afa15801561553e573d6000803e3d6000fd5b505050506040513d602081101561555457600080fd5b505110156155a2576040805162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b604482015290519081900360640190fd5b6001600160a01b038616156156835781866001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561560857600080fd5b505afa15801561561c573d6000803e3d6000fd5b505050506040513d602081101561563257600080fd5b5051101561567e576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6156fc565b836001600160a01b0316856001600160a01b031614156156fc5781856001600160a01b03163110156156fc576040805162461bcd60e51b815260206004820152601860248201527f496e73756666696369656e74206574682062616c616e63650000000000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b0316146157a3576001600160a01b038616156157445761573f6001600160a01b03871686858563ffffffff61596116565b61579e565b801580159061575257508181115b1561579e576001600160a01b0385166108fc615774838563ffffffff61526e16565b6040518115909202916000818181858888f1935050505015801561579c573d6000803e3d6000fd5b505b615834565b6001600160a01b038616156157cc5761579e6001600160a01b038716848463ffffffff6159c116565b80158015906157da57508181115b156157fc576001600160a01b0383166108fc615774838563ffffffff61526e16565b6040516001600160a01b0384169083156108fc029084906000818181858888f19350505050158015615832573d6000803e3d6000fd5b505b505050505050565b60008261584b57506000612988565b8282028284828161585857fe5b0414612a4d576040805162461bcd60e51b815260206004820152601160248201527075696e74206d756c206f766572666c6f7760781b604482015290519081900360640190fd5b6000816158e6576040805162461bcd60e51b815260206004820152601060248201526f75696e7420646976206279207a65726f60801b604482015290519081900360640190fd5b60008284816158f157fe5b04949350505050565b6001600160a01b0381166000908152600760205260409020546140655760088054600090815260066020908152604080832080546001600160a01b0387166001600160a01b0319909116811790915584549084526007909252909120819055600101905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526159bb908590615a18565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052615a13908490615a18565b505050565b615a2a826001600160a01b0316615b0e565b615a3357600080fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310615a715780518252601f199092019160209182019101615a52565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114615ad3576040519150601f19603f3d011682016040523d82523d6000602084013e615ad8565b606091505b509150915081615ae757600080fd5b8051156159bb57808060200190516020811015615b0357600080fd5b50516159bb57600080fd5b3b151590565b604051806103c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610180016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091529056fe4574682076616c75652073686f756c6420626520657175616c20746f20616d6f756e745265656e7472616e637947756172643a207265656e7472616e742063616c6c004574682076616c75652073686f756c6420626520657175616c20746f207265706179416d6f756e746f6e6c792061646d696e2063616e20646f20746869732100000000000000000063616e277420626f72726f772c20776974686f757420656e6f7567682076616c75654574682076616c75652073686f756c64206265206c6172676572207468616e207265706179416d6f756e74636c6f7365426f72726f77416d6f756e74203e206d6178436c6f736561626c65426f72726f77416d6f756e7420657272a265627a7a7231582092b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c62764736f6c634300050d0032
Deployed Bytecode Sourcemap
10560:57953:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54306:11252;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;54306:11252:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41135:3967;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41135:3967:0;;;;;;;;:::i;37594:3519::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37594:3519:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37594:3519:0;;;;;;;;:::i;23037:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23037:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23037:663:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;14736:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14736:33:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14736:33:0;;:::i;:::-;;;;-1:-1:-1;;;;;14736:33:0;;;;;;;;;;;;;;15502:127;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15502:127:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15502:127:0;;;;;;;;;;:::i;21156:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21156:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21156:182:0;;;;;;;;;;:::i;36613:191::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36613:191:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36613:191:0;;:::i;25949:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25949:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25949:251:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;19994:267;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19994:267:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19994:267:0;-1:-1:-1;;;;;19994:267:0;;:::i;13494:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13494:24:0;;;:::i;14889:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14889:49:0;;;:::i;13445:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13445:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13445:42:0;-1:-1:-1;;;;;13445:42:0;;:::i;10879:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10879:28:0;;;:::i;23898:751::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23898:751:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23898:751:0;;;;;;;;;;:::i;22375:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22375:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:174:0;;;;;;;;;;:::i;21400:900::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21400:900:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21400:900:0;;;;;;;;;;:::i;23708:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23708:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23708:182:0;;;;;;;;;;:::i;67928:582::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67928:582:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;67928:582:0;;;;;;;;:::i;12031:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12031:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12031:81:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26272:621;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26272:621:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26272:621:0;-1:-1:-1;;;;;26272:621:0;;:::i;10715:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10715:108:0;;;:::i;51117:3163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51117:3163:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51117:3163:0;;;;;;;;;;;;;;;;;;;:::i;12678:57::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12678:57:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12678:57:0;;:::i;:::-;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15977:724;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15977:724:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15977:724:0;;;;;;;;;;;;;;;;;;;;;;:::i;31806:4243::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31806:4243:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31806:4243:0;;;;;;;;:::i;19285:277::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19285:277:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19285:277:0;-1:-1:-1;;;;;19285:277:0;;:::i;15094:273::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15094:273:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15094:273:0;-1:-1:-1;;;;;15094:273:0;;:::i;24657:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24657:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24657:174:0;;;;;;;;;;:::i;15375:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15375:119:0;;;:::i;47476:765::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47476:765:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;47476:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17723:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17723:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17723:103:0;-1:-1:-1;;;;;17723:103:0;;:::i;17600:115::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17600:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17600:115:0;;;;;;;;:::i;24888:384::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24888:384:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24888:384:0;-1:-1:-1;;;;;24888:384:0;;:::i;46232:872::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46232:872:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;46232:872:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27772:3533::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27772:3533:0;;;;;;;;:::i;18859:372::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18859:372:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18859:372:0;;;;;;;;:::i;26901:550::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26901:550:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26901:550:0;-1:-1:-1;;;;;26901:550:0;;:::i;17126:101::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17126:101:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17126:101:0;-1:-1:-1;;;;;17126:101:0;;:::i;17235:187::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17235:187:0;;;:::i;25670:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25670:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25670:211:0;;;;;;;;;;:::i;15795:174::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15795:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15795:174:0;;;;;;;;:::i;20421:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20421:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20421:663:0;;;;;;;;;;:::i;15637:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15637:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15637:150:0;;;;;;;;:::i;14791:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14791:29:0;;;:::i;17474:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17474:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17474:118:0;-1:-1:-1;;;;;17474:118:0;;:::i;22608:328::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22608:328:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22608:328:0;-1:-1:-1;;;;;22608:328:0;;:::i;12742:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12742:31:0;;;:::i;25366:236::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25366:236:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25366:236:0;;;;;;;;;;:::i;17988:222::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17988:222:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17988:222:0;-1:-1:-1;;;;;17988:222:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14668:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14668:38:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14668:38:0;-1:-1:-1;;;;;14668:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14829:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14829:53:0;;;:::i;18419:390::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18419:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18419:390:0;;;;;;;;:::i;36851:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36851:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36851:266:0;;;;;;;;:::i;13395:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13395:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13395:43:0;;:::i;45213:663::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45213:663:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45213:663:0;;;;;;;;;;;;;;;;;:::i;10832:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10832:20:0;;;:::i;12165:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12165:81:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12165:81:0;;;;;;;;;;:::i;54306:11252::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;54526:10;-1:-1:-1;;;;;54526:27:0;;;;54518:60;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;-1:-1:-1;;;54518:60:0;;;;;;;;;;;;;;;54589:22;;:::i;:::-;-1:-1:-1;;;;;54798:33:0;;;;;;54842:29;;;:15;;;;:29;;;54899:10;54882:14;;;;:27;;;54920:37;;;:19;;;:37;;;54798:17;54997;;;:4;:17;;;;;:36;;55138:21;;;;;;55291:34;;;:21;:34;;;;;:49;;;;;;;;55416:38;;;:21;:38;;;;;;:53;;;;;;;;;55620:38;;;;;55659:14;;55620:54;;;;;;;;;;;;54991:3;:42;;;;;55291:49;;55416:53;;55620:54;55733:32;54942:15;55733;:32::i;:::-;55706:19;;;55705:60;;;;;-1:-1:-1;55705:60:0;55776:42;;;;;-1:-1:-1;;;55776:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55864:28;55880:11;55864:15;:28::i;:::-;55832:24;;;55831:61;;;;;-1:-1:-1;55831:61:0;55903:47;;;;;-1:-1:-1;;;55903:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56090:16;;;;56137:24;;;;56181:23;;;;56090:166;;;-1:-1:-1;;;56090:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56090:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;56090:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56090:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56090:166:0;56031:34;;;:236;56349:16;;;;56412:44;;-1:-1:-1;;;;;56349:16:0;;;;:33;;56401:56;;:10;:56::i;:::-;56483:34;:48;;;56558:3;:34;;;56349:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56349:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56349:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56349:259:0;56278:46;;;:341;56759:20;;;;56810:28;;;;56759:20;56858:27;;;56759:178;;;-1:-1:-1;;;56759:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56759:20:0;;;;:25;;:178;;;;;56349:259;;56759:178;;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;56759:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56759:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56759:178:0;56700:34;;;:248;57030:20;;;;57097:45;;-1:-1:-1;;;;;57030:20:0;;;;:37;;57086:57;;:10;:57::i;:::-;57169:35;:49;;;57245:3;:34;;;57030:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57030:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57030:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57030:265:0;56959:46;;;:347;57456:20;;;;57523:49;;-1:-1:-1;;;;;57456:20:0;;;;:37;;57512:61;;:10;:61::i;:::-;57599:39;:53;;;57679:3;:34;;;57456:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57456:273:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57456:273:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57456:273:0;57381:50;;;:359;57963:45;;57901:46;;;;57848:38;;;;:161;;57963:45;57848:100;;:38;:100;:52;:100;:::i;:::-;:114;:161;:114;:161;:::i;:::-;57803:42;;;:206;;;58198:49;;58132:50;;;;58065:183;;:118;;;:66;:118;:::i;:183::-;58020:42;;;:228;58466:24;;;;58505:19;;;;58539:46;;;;58354:242;;58410:11;;58436:15;;58354:41;:242::i;:::-;58310:41;;;:286;58741:24;;;;58641:135;;58687:13;;58715:11;;58641:31;:135::i;:::-;58607:31;;;:169;58880:46;;;;58945:41;;;;58840:218;;58858:143;;:3;:143::i;:::-;59016:3;:31;;;58840:3;:218::i;:::-;58787:50;;;:271;-1:-1:-1;;59138:35:0;;59134:277;;;59236:64;;;;59190:43;;;:110;59134:277;;;59333:43;;;:66;;;59134:277;59503:3;:50;;;59443:3;:43;;;:110;;59421:208;;;;-1:-1:-1;;;59421:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59686:25:0;;59682:547;;59854:3;:43;;;59841:9;:56;;59815:132;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;-1:-1:-1;;;59815:132:0;;;;;;;;;;;;;;;59682:547;;;60118:3;:43;;;60056:41;60069:11;60082:3;:14;;;60056:12;:41::i;:::-;:105;;60030:187;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;-1:-1:-1;;;60030:187:0;;;;;;;;;;;;;;;60421:213;60451:11;60477:15;60507:3;:24;;;60546:3;:19;;;60580:3;:43;;;60421:15;:213::i;:::-;60375:43;;;:259;60848:43;;;;60777:56;;;;:115;;;:70;:115;:::i;:::-;60728:46;;;:164;;;61131:44;;61019:35;;;;:157;;:97;;:35;:97;:49;:97;:::i;:157::-;60973:43;;;:203;61231:20;61239:11;61231:7;:20::i;:::-;61189:39;;;:62;-1:-1:-1;;;;;61394:25:0;;:200;;61555:3;:39;;;61394:200;;;61489:43;;;;61431:39;;;;:112;;;:43;:112;:::i;:::-;61352:39;;;:242;61666:16;;;;61713:24;;;;61757:23;;;;61666:166;;;-1:-1:-1;;;61666:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61666:16:0;;;;:21;;:166;;;;;;;;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;61666:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61666:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61666:166:0;61607:34;;;:236;61880:16;;;;61933:39;;;;61995:43;;;;61880:170;;;-1:-1:-1;;;61880:170:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61880:16:0;;;;:31;;:170;;;;;61666:166;;61880:170;;;;;;;;:16;:170;;;5:2:-1;;;;30:1;27;20:12;5:2;61880:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61880:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61880:170:0;61854:23;;;:196;62087:16;;;;62137:39;;;;62199:43;;;;62087:167;;;-1:-1:-1;;;62087:167:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62087:16:0;;;;:28;;:167;;;;;61880:170;;62087:167;;;;;;;;:16;:167;;;5:2:-1;;;;30:1;27;20:12;5:2;62087:167:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62087:167:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62087:167:0;62061:23;;;;:193;;;;62324:20;;;;62375:28;;;;62423:27;;;;62324:178;;;-1:-1:-1;;;62324:178:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62324:20:0;;;;:25;;:178;;;;;62087:167;;62324:178;;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;62324:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62324:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62324:178:0;62265:34;;;:248;62704:43;;;;62633:56;;;;:115;;;:70;:115;:::i;:::-;62584:46;;;:164;62887:43;;;;62812:60;;;;:119;;;:74;:119;:::i;:::-;62759:3;:50;;:172;;;;;62978:3;62944:12;:31;;:37;;;;63020:3;:43;;;62992:12;:25;;:71;;;;63101:3;:34;;;63074:12;:24;;:61;;;;63173:3;:34;;;63146:12;:24;;:61;;;;63302:3;63264:16;:35;;:41;;;;63347:3;:52;;;63316:16;:28;;:83;;;;63441:3;:34;;;63410:16;:28;;:65;;;;63517:3;:34;;;63486:16;:28;;:65;;;;63666:34;:54;;;63616:3;:47;;:104;;;;;63803:3;:56;;;63756:34;:44;;:103;;;;63921:3;:44;;;63870:34;:48;;:95;;;;64028:35;:55;;;63978:3;:47;;:105;;;;;64167:3;:56;;;64119:35;:45;;:104;;;;64286:3;:44;;;64234:35;:49;;:96;;;;64397:39;:59;;;64343:3;:51;;:113;;;;;64544:3;:60;;;64492:39;:49;;:112;;;;64671:3;:44;;;64615:39;:53;;:100;;;;64728:267;64762:3;:17;;;64794:3;:14;;;64823:3;:19;;;64857:11;64883:3;:43;;;64941:3;:43;;;64728:19;:267::i;:::-;65008:248;65039:11;65065:28;:3;:14;;;-1:-1:-1;;;;;65065:26:0;;:28::i;:::-;65116:4;65136:27;65116:4;65136:25;:27::i;:::-;65178:3;:43;;;65236:9;65008:16;:248::i;:::-;65274:276;65311:3;:17;;;65343:11;65369:3;:46;;;65430:3;:14;;;65459:3;:19;;;65493:3;:46;;;65274:276;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;-1:-1:-1;;;;;65274:276:0;-1:-1:-1;;;;;65274:276:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;;;;;54306:11252:0:o;41135:3967::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;41248:22;;:::i;:::-;-1:-1:-1;;;;;41305:7:0;;;41281:21;41305:7;;;:4;:7;;;;;;;;41355:21;:24;;;;;;41380:10;41355:36;;;;;;;41428:7;;;;;;;:26;;41599:11;;;;41641:19;;;;41680:18;;;;41599:151;;-1:-1:-1;;;41599:151:0;;;;;;;;;;;;;41486:3;:19;;;41599:151;;;;;;;;41305:7;;41486:19;;41599:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;41599:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41599:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41599:151:0;41556:205;;41800:27;;;;-1:-1:-1;;;;;41885:7:0;;;41556:18;41885:7;;;:4;41599:151;41885:7;;;;:11;;;41943:23;;41885:11;;;:28;;41932:35;;:10;:35::i;:::-;41986:9;42021:3;:18;;;41885:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41885:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41885:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41885:170:0;;41839:21;;:227;-1:-1:-1;;42170:21:0;;42166:994;;;42292:104;42314:27;42327:1;42330:10;42314:12;:27::i;:::-;42360:3;:21;;;42292:3;:104::i;:::-;42274:15;;;:122;-1:-1:-1;;;;;42684:15:0;;42680:200;;42762:3;:15;;;42750:9;:27;42720:144;;;;-1:-1:-1;;;42720:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42166:994;;;42912:15;;;:24;;;-1:-1:-1;;;;;42955:15:0;;42951:198;;43034:3;:15;;;43021:9;:28;42991:142;;;;-1:-1:-1;;;42991:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43263:15;;;;43237:21;;;;:42;;;:25;:42;:::i;:::-;43213:21;;;:66;;;43436:23;;43355:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;43333:19;;;:127;43489:10;43497:1;43489:7;:10::i;:::-;43471:15;;;:28;-1:-1:-1;;;;;43642:15:0;;:90;;43717:3;:15;;;43642:90;;;43689:15;;;;43669;;;;:36;;;:19;:36;:::i;:::-;43624:15;;;:108;-1:-1:-1;;;;;43788:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;43830:19;;;;43788:11;43869:18;;;;43788:151;;-1:-1:-1;;;43788:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;43788:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43788:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43788:151:0;43745:18;;;:205;-1:-1:-1;;;;;44022:7:0;;;;;;;:4;43788:151;44022:7;;;;:11;;;44074:15;;;;44022:11;;;:26;;44063:27;;:10;:27::i;:::-;44105:31;44116:3;:19;;;44105:10;:31::i;:::-;44022:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44022:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44022:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44022:125:0;44002:17;;;:145;-1:-1:-1;;;;;44178:7:0;;;;;;;:4;44022:125;44178:7;;;;:11;;;44227:15;;;;44178:11;;;:23;;44216:27;;:10;:27::i;:::-;44258:31;44269:3;:19;;;44258:10;:31::i;:::-;44178:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44178:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44178:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44178:122:0;44158:17;;;:142;44341:3;44313:31;;44377:19;;;;44355;;;:41;44428:18;;;;44407;;;:39;44478:18;;44457;;;:39;;;44559:23;;44537:19;;;:45;44619:21;;;;44593:47;;-1:-1:-1;44651:27:0;;:48;44712:192;44743:1;44759:10;44792:4;44812:27;44792:4;44812:25;:27::i;:::-;44854:3;:15;;;44884:9;44712:16;:192::i;:::-;44996:15;;;;;45026:19;;;;45060:21;;;;;44922:170;;44955:10;44922:170;;-1:-1:-1;;;;;44922:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;41135:3967:0:o;37594:3519::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;37674;;:::i;:::-;-1:-1:-1;;;;;37728:7:0;;;37704:21;37728:7;;;:4;:7;;;;;;;;37778:21;:24;;;;;;37803:10;37778:36;;;;;;;37851:7;;;;;;;:26;;38014:11;;;;38056:19;;;;38095:18;;;;38014:151;;-1:-1:-1;;;38014:151:0;;;;;;;;;;;;;37909:3;:19;;;38014:151;;;;;;;;37728:7;;37909:19;;38014:11;;;;;:16;;:151;;;;;;;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;38014:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38014:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38014:151:0;37971:205;;38213:27;;;;-1:-1:-1;;;;;38298:7:0;;;37971:18;38298:7;;;:4;38014:151;38298:7;;;;:11;;;38356:23;;38298:11;;;:28;;38345:35;;:10;:35::i;:::-;38399:9;38434:3;:18;;;38298:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38298:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38298:170:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38298:170:0;;38252:21;;:227;38543:31;38567:6;38543:23;:31::i;:::-;38517:23;;;:57;;;38611:21;;;;:74;;;:25;:74;:::i;:::-;38587:21;;;:98;;;38833:23;;38752:29;;;;:105;;:66;;:29;:66;:43;:66;:::i;:105::-;38730:19;;;:127;38952:56;38987:10;38952:20;:56::i;:::-;38928:20;;;38905:103;38906:20;;;38905:103;;;39041:25;;;;:54;;-1:-1:-1;39070:20:0;;;;:25;39041:54;39019:127;;;;;-1:-1:-1;;;39019:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39242:101;39293:1;39309:3;:23;;;39242:36;:101::i;:::-;39206:33;;;:137;;;39413:20;;;;-1:-1:-1;39376:57:0;39354:141;;;;-1:-1:-1;;;39354:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39574:10;39582:1;39574:7;:10::i;:::-;39556:15;;;:28;;;39613:27;;39633:6;39613:27;:19;:27;:::i;:::-;39595:15;;;:45;-1:-1:-1;;;;;39696:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;39738:19;;;;39696:11;39777:18;;;;39696:151;;-1:-1:-1;;;39696:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;39696:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39696:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39696:151:0;39653:18;;;:205;-1:-1:-1;;;;;39889:7:0;;;;;;;:4;39696:151;39889:7;;;;:11;;;39941:15;;;;39889:11;;;:26;;39930:27;;:10;:27::i;:::-;39972:31;39983:3;:19;;;39972:10;:31::i;:::-;39889:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39889:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39889:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39889:125:0;39869:17;;;:145;-1:-1:-1;;;;;40045:7:0;;;;;;;:4;39889:125;40045:7;;;;:11;;;40094:15;;;;40045:11;;;:23;;40083:27;;:10;:27::i;:::-;40125:31;40136:3;:19;;;40125:10;:31::i;:::-;40045:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40045:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40045:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40045:122:0;40025:17;;;:142;40208:3;40180:31;;40244:19;;;;40222;;;:41;40295:18;;;;40274;;;:39;40345:18;;40324;;;:39;;;40426:23;;40404:19;;;:45;40486:21;;;;40460:47;;-1:-1:-1;40518:27:0;;:48;40734:175;40765:1;40781:27;40789:4;40781:25;:27::i;:::-;40831:4;40851:10;40876:6;40897:1;40734:16;:175::i;:::-;41017:19;;;;41051:21;;;;;40927:156;;;40955:10;40927:156;;-1:-1:-1;;;;;40927:156:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;37594:3519:0:o;23037:663::-;-1:-1:-1;;;;;23180:24:0;;;23123:7;23180:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;23244:7;;;:4;:7;;;;;:11;;;;23282:19;;;;23317:18;;;;23363:26;;23244:157;;-1:-1:-1;;;23244:157:0;;;;;;;;;;;;;;;;23357:3;:32;;;;23244:157;;;;;;23123:7;;;;23244:11;;;:16;;:157;;;;;23180:24;;23244:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;23244:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23244:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23244:157:0;-1:-1:-1;;;;;23464:7:0;;;23414:25;23464:7;;;:4;23244:157;23464:7;;;;:11;;;23522:23;;23244:157;;-1:-1:-1;23414:25:0;;23464:11;;;:28;;23511:35;;:10;:35::i;:::-;23572:13;:27;;;23619:12;23464:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23464:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23464:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23464:182:0;;-1:-1:-1;;;;23037:663:0;;;;;:::o;14736:33::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14736:33:0;;-1:-1:-1;14736:33:0;:::o;15502:127::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15584:7:0;;;;;;;:4;:7;;;;;:11;;:37;;-1:-1:-1;;;;;;15584:37:0;;;;;;;;15502:127::o;21156:182::-;21247:7;21279:51;21302:1;21305:24;21322:3;21327:1;21305:16;:24::i;:::-;21279:22;:51::i;:::-;21272:58;21156:182;-1:-1:-1;;;21156:182:0:o;36613:191::-;36704:7;36736:60;15051:7;36736:47;36753:29;15051:7;36704;36753:29;:13;:29;:::i;:::-;36736:12;;:47;:16;:47;:::i;:::-;:51;:60;:51;:60;:::i;:::-;36729:67;;36613:191;;;;:::o;25949:251::-;26057:7;26066;26109:29;26131:3;26136:1;26109:21;:29::i;:::-;26149:32;26174:3;26179:1;26149:24;:32::i;:::-;26091:101;;;;25949:251;;;;;:::o;19994:267::-;-1:-1:-1;;;;;20093:11:0;;20058:7;20093:11;;;:4;:11;;;;;:24;;;;20146:23;;;;;20223:30;20146:23;20223:17;20093:24;15051:7;20223:17;:8;:17;:::i;:30::-;20216:37;19994:267;-1:-1:-1;;;;19994:267:0:o;13494:24::-;;;;:::o;14889:49::-;14937:1;14889:49;:::o;13445:42::-;;;;;;;;;;;;;:::o;10879:28::-;;;-1:-1:-1;;;;;10879:28:0;;:::o;23898:751::-;-1:-1:-1;;;;;24037:24:0;;;23980:7;24037:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;24101:7;;;:4;:7;;;;;:11;;;;24139:19;;;;24174:18;;;;24220:26;;24101:157;;-1:-1:-1;;;24101:157:0;;;;;;;;;;;;;;;;24214:3;:32;;;;24101:157;;;;;;23980:7;;;;24101:11;;;:16;;:157;;;;;24037:24;;24101:157;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;24101:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24101:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24101:157:0;-1:-1:-1;;;;;24321:7:0;;;24271:25;24321:7;;;:4;24101:157;24321:7;;;;:11;;;24379:23;;24101:157;;-1:-1:-1;24271:25:0;;24321:11;;;:28;;24368:35;;:10;:35::i;:::-;24429:13;:27;;;24476:12;24321:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24321:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24321:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24321:182:0;24607:23;;24543:22;;;;24321:182;;-1:-1:-1;24543:98:0;;:45;;24321:182;24543:45;:26;:45;:::i;:98::-;24527:114;23898:751;-1:-1:-1;;;;;;23898:751:0:o;22375:174::-;22462:7;22494:47;22517:1;22520:20;22533:3;22538:1;21400:900;-1:-1:-1;;;;;21539:24:0;;;21482:7;21539:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;21603:7;;;:4;:7;;;;;:11;;;;21641:19;;;;21603:11;21676:18;;;21722:26;;21603:157;;-1:-1:-1;;;21603:157:0;;;;;;;;;;;;;;;;21716:3;:32;;;;21603:157;;;;;;21482:7;;;;21603:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;5:2;21603:157:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21603:157:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21603:157:0;-1:-1:-1;;;;;21823:7:0;;;21773:25;21823:7;;;:4;21603:157;21823:7;;;;:11;;;21881:23;;21603:157;;-1:-1:-1;21773:25:0;;21823:11;;;:28;;21870:35;;:10;:35::i;:::-;21931:13;:27;;;21978:12;21823:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21823:182:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21823:182:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21823:182:0;22053:23;;21823:182;;-1:-1:-1;22033:43:0;;22029:264;;;22180:23;;22113:106;;22158:46;;:17;;:46;:21;:46;:::i;:::-;22113:22;;;;;:106;:26;:106;:::i;:::-;22093:126;;;;;;;22029:264;-1:-1:-1;;22259:22:0;;;;-1:-1:-1;22252:29:0;;23708:182;23799:7;23831:51;23854:1;23857:24;23874:3;23879:1;23857:16;:24::i;67928:582::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;;;;17065:5;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;68046:12;68061:10;68069:1;68061:7;:10::i;:::-;-1:-1:-1;;;;;68148:7:0;;68082:14;68148:7;;;:4;:7;;;;;:19;;;;68108:20;;;;;68046:25;;-1:-1:-1;68082:14:0;;68099:79;;68148:19;68099:30;;68046:25;;68099:30;:8;:30;:::i;:79::-;68082:96;;68207:6;68197;:16;;68189:55;;;;;-1:-1:-1;;;68189:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68255:184;68286:1;68302:27;68310:4;68302:25;:27::i;:::-;68372:5;;68352:4;;68372:19;;:5;;;-1:-1:-1;;;;;68372:5:0;:17;:19::i;:::-;68406:6;68427:1;68255:16;:184::i;:::-;68496:5;;68455:47;;;-1:-1:-1;;;;;68455:47:0;;;;;;;;;;;;;;;;;68496:5;;;;;;;;68455:47;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;67928:582:0:o;12031:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26272:621::-;26453:16;:23;26372:19;;;;;26489:397;26513:6;26509:1;:10;26489:397;;;26556:19;26590:23;26631:113;26688:3;26710:16;26727:1;26710:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26710:19:0;26631:38;:113::i;:::-;26541:203;;-1:-1:-1;26541:203:0;-1:-1:-1;26773:28:0;:11;26541:203;26773:28;:15;:28;:::i;:::-;26759:42;-1:-1:-1;26836:38:0;:17;26858:15;26836:38;:21;:38;:::i;:::-;26816:58;-1:-1:-1;;;26521:3:0;;26489:397;;;;26272:621;;;;:::o;10715:108::-;-1:-1:-1;;;;;10715:108:0;:::o;51117:3163::-;51275:7;51303:10;-1:-1:-1;;;;;51303:27:0;;;;51295:60;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;-1:-1:-1;;;51295:60:0;;;;;;;;;;;;;;;51366:22;;:::i;:::-;-1:-1:-1;;;;;51428:17:0;;;51401:18;51428:17;;;:4;:17;;;;;;;;:36;;51569:21;;;;;;;;;51665:34;;;:21;:34;;;;;;:49;;;;;;;;;;;;51792:38;;;:21;:38;;;;;:53;;;;;;;;;51917:20;;;;51968:28;;;;51917:20;52016:27;;;51917:178;;-1:-1:-1;;;51917:178:0;;;;;;;;;;;;;51422:3;:42;;;;51917:178;;;;;;;;51422:42;;51428:17;;51569:21;51665:49;;51792:53;;51917:20;;;:25;;:178;;;;;51428:17;51917:178;;;;;;:20;:178;;;5:2:-1;;;;30:1;27;20:12;5:2;51917:178:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51917:178:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51917:178:0;51858:34;;;:248;52176:16;;;;52223:24;;;;52267:23;;;;52176:166;;;-1:-1:-1;;;52176:166:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52176:16:0;;;;:21;;:166;;;;;51917:178;;52176:166;;;;;;;;:16;:166;;;5:2:-1;;;;30:1;27;20:12;5:2;52176:166:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52176:166:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52176:166:0;52117:34;;;:236;52435:20;;;;52502:45;;-1:-1:-1;;;;;52435:20:0;;;;:37;;52491:57;;:10;:57::i;:::-;52574:35;:49;;;52650:3;:34;;;52435:265;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52435:265:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52435:265:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52435:265:0;52364:46;;;:347;52793:16;;;;52856:44;;-1:-1:-1;;;;;52793:16:0;;;;:33;;52845:56;;:10;:56::i;:::-;52927:34;:48;;;53002:3;:34;;;52793:259;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52793:259:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52793:259:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52793:259:0;52722:46;;;:341;53076:7;53122:32;53138:15;53122;:32::i;:::-;53095:19;;;53094:60;;;;;-1:-1:-1;53094:60:0;53165:42;;;;;-1:-1:-1;;;53165:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53253:28;53269:11;53253:15;:28::i;:::-;53221:24;;;53220:61;;;;;-1:-1:-1;53220:61:0;53292:47;;;;;-1:-1:-1;;;53292:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53396:242;53452:11;53478:15;53508:3;:24;;;53547:3;:19;;;53581:3;:46;;;53396:41;:242::i;:::-;53352:41;;;:286;53783:24;;;;53683:135;;53729:13;;53757:11;;53683:31;:135::i;:::-;53649:31;;;:169;53900:46;;;;53961:41;;;;53882:131;;53900:46;53882:3;:131::i;:::-;53829:50;;;:184;;;54160:31;;;;54077:125;;53829:184;54077:3;:125::i;:::-;54024:50;;;;:178;;;-1:-1:-1;54024:178:0;;-1:-1:-1;;;;;;51117:3163:0;;;;;:::o;12678:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12678:57:0;;;;;;;;;;;;;;;;;;;;:::o;15977:724::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;16150:14;;-1:-1:-1;;;;;16150:14:0;16138:87;;16196:17;16206:6;16196:9;:17::i;:::-;16235:15;;:::i;:::-;-1:-1:-1;;;;;;16253:7:0;;;;;;;:4;:7;;;;;;;;;16235:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16271:89;;16320:28;16341:1;16344:3;16320:20;:28::i;:::-;16372:22;16392:1;16372:19;:22::i;:::-;16409:13;;;;16405:87;;14876:6;16444:13;;;:36;16405:87;16508:13;;;;16504:87;;14876:6;16543:13;;;:36;16504:87;16607:10;;;;16603:69;;16639:10;;;:21;;;16603:69;-1:-1:-1;;;;;16682:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16682:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15977:724:0:o;31806:4243::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;-1:-1:-1;;;;;31936:7:0;;;;:4;:7;;;;;;;;31986:21;:24;;;;;32011:10;31986:36;;;;;;;;32035:21;;:::i;:::-;-1:-1:-1;;;;;32093:7:0;;32069:21;32093:7;;;:4;:7;;;;;:26;32151:3;:19;;;32284:56;32319:10;32284:20;:56::i;:::-;32260:20;;;32237:103;32238:20;;;32237:103;;;32373:25;;;;:54;;-1:-1:-1;32402:20:0;;;;:25;32373:54;32351:129;;;;;-1:-1:-1;;;32351:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32577:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;32619:19;;;;32577:11;32658:18;;;;32577:151;;-1:-1:-1;;;32577:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;32577:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32577:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32577:151:0;32534:18;;;;:205;;;;-1:-1:-1;;;;;32796:7:0;;;;;;;:4;32577:151;32796:7;;;;;:11;;;32854:23;;32796:11;;;:28;;32843:35;;:10;:35::i;:::-;32904:13;:27;;;32958:3;:18;;;32796:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32796:196:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32796:196:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32796:196:0;32750:21;;;:253;33079:10;33087:1;33079:7;:10::i;:::-;33061:15;;;:28;-1:-1:-1;;33199:30:0;;33195:563;;;33347:96;33388:1;33408:3;:20;;;33347:22;:96::i;:::-;33324:20;;;:119;;;33527:21;;;;33479:119;;33501:48;;:3;:48::i;:::-;33568:3;:15;;;33479:3;:119::i;:::-;33458:140;;33195:563;;;33710:36;;;33195:563;33852:18;;33832:15;;;;:39;;;:19;:39;:::i;:::-;33814:15;;;:57;33932:18;;33906:21;;;;:45;;;:25;:45;:::i;:::-;33882:21;;;:69;34092:18;;34039:82;;34076:1;;34039:22;:82::i;:::-;34012:24;;;:109;;;34230:20;;;;-1:-1:-1;34202:48:0;34180:114;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;-1:-1:-1;;;34180:114:0;;;;;;;;;;;;;;;34437:23;;34396:21;;;;34373:18;;;;:98;;34437:23;34373:45;;:18;:45;:22;:45;:::i;:98::-;34352:18;;;:119;-1:-1:-1;;;;;34527:7:0;;;;;;;:4;:7;;;;;;;;;:11;;;;34569:19;;;;34527:11;34608:18;;;;34527:151;;-1:-1:-1;;;34527:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;:7;:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34527:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34527:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34527:151:0;34484:18;;;;:205;;;;-1:-1:-1;;;;;34762:7:0;;;;;;;:4;34527:151;34762:7;;;;;:11;;;34814:15;;;;34762:11;;;:26;;34803:27;;:10;:27::i;:::-;34845:31;34856:6;:19;;;34845:10;:31::i;:::-;34762:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:125:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:125:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:125:0;34742:17;;;:145;-1:-1:-1;;;;;34941:7:0;;;;;;;:4;34762:125;34941:7;;;;;;;;:11;;;;34983:19;;;;35022:18;;;;;34941:151;;-1:-1:-1;;;34941:151:0;;;;;;;;;;;;;;;;;;;;;:11;;;;;:16;;:151;;;;;34762:125;34941:151;;;;;:11;:151;;;5:2:-1;;;;30:1;27;20:12;5:2;34941:151:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34941:151:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34941:151:0;34898:18;;;:205;-1:-1:-1;;;;;35134:7:0;;;;;;;:4;34941:151;35134:7;;;;:11;;;35183:15;;;;35134:11;;;:23;;35172:27;;:10;:27::i;:::-;35214:31;35225:6;:19;;;35214:10;:31::i;:::-;35134:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35134:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35134:122:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35134:122:0;35114:17;;;:142;35297:3;35269:31;;35332:18;;;;35311;;;:39;35382:18;;;;35361;;;:39;;;35432:18;;;;35411;;;:39;35513:23;;35134:122;35491:19;;:45;-1:-1:-1;35573:21:0;;;35547:47;;-1:-1:-1;35605:27:0;;:48;35666:187;35697:1;35713:27;35721:4;35713:25;:27::i;:::-;35763:4;35783:10;35808:3;:18;;;35841:1;35666:16;:187::i;:::-;35942:18;;35975:19;;;;;36009:21;;;;;35871:170;;;35901:10;35871:170;;-1:-1:-1;;;;;35871:170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;31806:4243:0:o;19285:277::-;19334:7;-1:-1:-1;;;;;19400:15:0;;19396:76;;-1:-1:-1;19439:21:0;19432:28;;19396:76;19524:30;;;-1:-1:-1;;;19524:30:0;;19548:4;19524:30;;;;;;19504:1;;-1:-1:-1;;;;;19524:15:0;;;;;:30;;;;;;;;;;;;;;;:15;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;19524:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19524:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19524:30:0;;19285:277;-1:-1:-1;;;19285:277:0:o;15094:273::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;15171:9;15166:155;15190:16;:23;15186:27;;15166:155;;;15262:5;-1:-1:-1;;;;;15239:28:0;:16;15256:1;15239:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15239:19:0;:28;15235:75;;;15288:7;;;15235:75;15215:3;;15166:155;;;-1:-1:-1;15331:16:0;27:10:-1;;39:1;23:18;;45:23;;-1:-1;15331:28:0;;;;;;;;-1:-1:-1;;;;;;15331:28:0;-1:-1:-1;;;;;15331:28:0;;;;;17109:1;15094:273;:::o;24657:174::-;24744:7;24776:47;24799:1;24802:20;24815:3;24820:1;24802:12;:20::i;15375:119::-;15463:16;:23;15375:119;:::o;47476:765::-;-1:-1:-1;;;;;47782:21:0;;47728:11;47782:21;;;:4;:21;;;;;:41;;;47728:11;47871:34;15051:7;47782:41;47871:34;:13;:34;:::i;:::-;47834:71;-1:-1:-1;47922:52:0;:20;47834:71;47922:52;:24;:52;:::i;:::-;47916:58;-1:-1:-1;47991:48:0;47916:58;47999:39;47991:48;:7;:48;:::i;:::-;47985:54;-1:-1:-1;48056:24:0;47985:54;48064:15;48056:24;:7;:24;:::i;:::-;48050:30;-1:-1:-1;48097:16:0;48050:30;15051:7;48097:16;:7;:16;:::i;:::-;-1:-1:-1;;;;;48142:21:0;;;;;;:4;:21;;;;;:30;;;48091:22;;-1:-1:-1;48130:43:0;;48091:22;;48138:2;:34;48130:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;48202:21:0;;;;;;:4;:21;;;;;:30;;;48124:49;;-1:-1:-1;48190:43:0;;48124:49;;48198:2;:34;48190:43;:7;:43;:::i;:::-;48184:49;47476:765;-1:-1:-1;;;;;;;;47476:765:0:o;17723:103::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17786:14;:32;;-1:-1:-1;;;;;;17786:32:0;-1:-1:-1;;;;;17786:32:0;;;;;;;;;;17723:103::o;17600:115::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17680:7:0;;;;;;;:4;:7;;;;;:16;;:27;17600:115::o;24888:384::-;25013:16;:23;24964:14;;;25078:160;25102:6;25098:1;:10;25078:160;;;25130:11;25144:43;25162:3;25167:16;25184:1;25167:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25167:19:0;25144:17;:43::i;:::-;25130:57;-1:-1:-1;25211:15:0;:6;25130:57;25211:15;:10;:15;:::i;:::-;25202:24;-1:-1:-1;;25110:3:0;;25078:160;;;;24888:384;;;;:::o;46232:872::-;-1:-1:-1;;;;;46560:21:0;;46506:11;46560:21;;;:4;:21;;;;;:41;;;46506:11;46649:34;15051:7;46560:41;46649:34;:13;:34;:::i;:::-;46612:71;-1:-1:-1;46694:42:0;46748:56;:35;46788:15;46748:56;:39;:56;:::i;:::-;46694:110;-1:-1:-1;46823:129:0;46876:65;15051:7;46876:52;:26;46907:20;46876:52;:30;:52;:::i;:65::-;46823:34;;:129;:38;:129;:::i;:::-;-1:-1:-1;;;;;47005:21:0;;;;;;:4;:21;;;;;:30;;;46817:135;;-1:-1:-1;46993:43:0;;46817:135;;47001:2;:34;46993:43;:7;:43;:::i;:::-;-1:-1:-1;;;;;47065:21:0;;;;;;:4;:21;;;;;:30;;;46987:49;;-1:-1:-1;47053:43:0;;46987:49;;47061:2;:34;47053:43;:7;:43;:::i;:::-;47047:49;46232:872;-1:-1:-1;;;;;;;;;46232:872:0:o;27772:3533::-;1304:11;;;;1296:55;;;;;-1:-1:-1;;;1296:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1296:55:0;;;;;;;;;;;;;;;1443:5;1429:19;;-1:-1:-1;;1429:19:0;;;27903:6;-1:-1:-1;;;;;27966:15:0;;27962:240;;28016:9;28006:6;:19;27998:67;;;;-1:-1:-1;;;27998:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28095:9:0;27962:240;;;28145:9;:14;28137:53;;;;;-1:-1:-1;;;28137:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28212:19;;:::i;:::-;-1:-1:-1;;;;;28266:7:0;;;28242:21;28266:7;;;:4;:7;;;;;;;;28316:21;:24;;;;;28341:10;28316:36;;;;;;;;28389:25;;28571:10;;;;28612:18;;;;28571:10;28650:17;;;28571:148;;-1:-1:-1;;;28571:148:0;;;;;;;;;;;;;28446:3;:19;;;28571:148;;;;;;;;28266:7;;28316:36;;28389:25;;28571:10;;;;;:15;;:148;;;;;28266:7;28571:148;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;28571:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28571:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28571:148:0;;28528:18;;;:202;;;;28787:10;;;;-1:-1:-1;;;;;28844:24:0;;;28787:10;28844:24;;;:21;:24;;;;;;28869:10;28844:36;;;;;;;;;:46;28787:10;;;:27;;28833:58;;:10;:58::i;:::-;28917:13;:27;;;28971:3;:18;;;28787:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28787:218:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28787:218:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28787:218:0;28741:21;;;:275;;;29051:39;;29077:12;29051:39;:25;:39;:::i;:::-;29027:21;;;:63;;;29226:23;;29162:18;;;;:98;;:45;;:18;:45;:22;:45;:::i;:98::-;29141:18;;;:119;29291:10;29299:1;29291:7;:10::i;:::-;29273:15;;;:28;-1:-1:-1;;;;;29584:15:0;;:87;;29656:3;:15;;;29584:87;;;29611:15;;;;:33;;29631:12;29611:33;:19;:33;:::i;:::-;29566:15;;;:105;;;29749:10;;;;-1:-1:-1;;;;;29749:10:0;;:25;;29789:27;;:10;:27::i;:::-;29831:31;29842:6;:19;;;29831:10;:31::i;:::-;29749:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29749:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29749:124:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29749:124:0;29729:17;;;:144;29927:10;;;;29968:18;;;;30006:17;;;;29927:148;;;-1:-1:-1;;;29927:148:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29927:10:0;;;;:15;;:148;;;;;29749:124;;29927:148;;;;;;;;:10;:148;;;5:2:-1;;;;30:1;27;20:12;5:2;29927:148:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29927:148:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29927:148:0;29884:18;;;:202;30117:10;;;;30165:15;;;;-1:-1:-1;;;;;30117:10:0;;;;:22;;30154:27;;:10;:27::i;:::-;30196:31;30207:6;:19;;;30196:10;:31::i;:::-;30117:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30117:121:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30117:121:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30117:121:0;30097:17;;;:141;30272:18;;;;30251;;;:39;30117:121;30322:18;;;30301;;;:39;;;30372:18;;;;30351;;;:39;30429:3;30401:31;;30495:23;;30473:45;;;30555:21;;;;30529:47;;-1:-1:-1;30587:27:0;;:48;;;;30692:21;;;;:43;30688:207;;;30848:19;;30822:21;;;;30777:106;;30822:46;;:21;:46;:25;:46;:::i;30777:106::-;30752:22;;;:131;30688:207;30907:16;30912:10;30907:4;:16::i;:::-;30936:181;30967:1;30983:10;31016:4;31036:27;31016:4;31036:25;:27::i;:::-;31078:12;31105:1;30936:16;:181::i;:::-;31231:19;;31265:21;;;;;31135:162;;;31163:10;31135:162;;-1:-1:-1;;;;;31135:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1609:11:0;:18;;-1:-1:-1;;1609:18:0;1623:4;1609:18;;;-1:-1:-1;;;;;;27772:3533:0:o;18859:372::-;18997:14;;18956:7;;-1:-1:-1;;;;;18997:14:0;18981:64;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;-1:-1:-1;;;18981:64:0;;;;;;;;;;;;;;;19057:13;19072:7;19083:18;19099:1;19083:15;:18::i;:::-;19056:45;;;;19120:2;:16;;;;-1:-1:-1;19126:10:0;;;19120:16;19112:48;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;-1:-1:-1;;;19112:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;19195:7:0;;;;;;:4;:7;;;;;:16;;;19178:45;;19217:5;;19178:34;;:8;;19191:2;:20;19178:34;:12;:34;:::i;:45::-;19171:52;18859:372;-1:-1:-1;;;;;18859:372:0:o;26901:550::-;26980:7;26989;27014:19;27044:26;27177:46;27219:3;27177:41;:46::i;:::-;27112:111;;-1:-1:-1;27112:111:0;-1:-1:-1;27238:32:0;;;27234:210;;;27295:1;27298:35;:18;27321:11;27298:35;:22;:35;:::i;:::-;27287:47;;-1:-1:-1;27287:47:0;-1:-1:-1;27287:47:0;;-1:-1:-1;;27287:47:0;27234:210;27384:35;:11;27400:18;27384:35;:15;:35;:::i;:::-;27376:47;-1:-1:-1;27421:1:0;;-1:-1:-1;27376:47:0;;-1:-1:-1;;27376:47:0;26901:550;;;;:::o;17126:101::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;17197:13;:22;;-1:-1:-1;;;;;;17197:22:0;-1:-1:-1;;;;;17197:22:0;;;;;;;;;;17126:101::o;17235:187::-;17308:13;;-1:-1:-1;;;;;17308:13:0;17294:10;:27;17286:59;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;-1:-1:-1;;;17286:59:0;;;;;;;;;;;;;;;17364:13;;;;17356:21;;-1:-1:-1;;;;;;17356:21:0;17364:13;-1:-1:-1;;;;;17364:13:0;;17356:21;;;;-1:-1:-1;;;;;;17388:26:0;;;17235:187::o;25670:211::-;25770:7;25779;25812:29;25834:3;25839:1;25812:21;:29::i;:::-;25843;25865:3;25870:1;25843:21;:29::i;15795:174::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15912:7:0;;;;;;;:4;:7;;;;;:27;;:49;15795:174::o;20421:663::-;-1:-1:-1;;;;;20564:24:0;;;20507:7;20564:24;;;:21;:24;;;;;;;;:29;;;;;;;;;;20628:7;;;:4;:7;;;;;:11;;;;20666:19;;;;20628:11;20701:18;;;20747:26;;20628:157;;-1:-1:-1;;;20628:157:0;;;;;;;;;;;;;;;;20741:3;:32;;;;20628:157;;;;;;20507:7;;;;20628:11;;;:16;;:157;;;;;;;;;;:11;:157;;;5:2:-1;;;;30:1;27;20:12;15637:150:0;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15742:7:0;;;;;;;:4;:7;;;;;;;;:21;:37;15637:150::o;14791:29::-;;;-1:-1:-1;;;;;14791:29:0;;:::o;17474:118::-;17065:5;;;;;-1:-1:-1;;;;;17065:5:0;17051:10;:19;17043:55;;;;;-1:-1:-1;;;17043:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17043:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:11:0;;;;;:4;:11;;;;;17581:3;17548:36;;17474:118::o;22608:328::-;22733:16;:23;22684:14;;;22769:160;22793:6;22789:1;:10;22769:160;;;22821:11;22835:43;22853:3;22858:16;22875:1;22858:19;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22858:19:0;22835:17;:43::i;:::-;22821:57;-1:-1:-1;22902:15:0;:6;22821:57;22902:15;:10;:15;:::i;:::-;22893:24;-1:-1:-1;;22801:3:0;;22769:160;;12742:31;;;;:::o;25366:236::-;-1:-1:-1;;;;;25535:7:0;;25460;25535;;;:4;:7;;;;;;;:21;;25501:93;;15051:7;;25501:56;;:29;25523:3;25540:1;25501:21;:29::i;:::-;:33;:56;:33;:56;:::i;17988:222::-;18111:14;;18064:7;;;;-1:-1:-1;;;;;18111:14:0;18095:64;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;-1:-1:-1;;;18095:64:0;;;;;;;;;;;;;;;18177:14;;:25;;;-1:-1:-1;;;18177:25:0;;-1:-1:-1;;;;;18177:25:0;;;;;;;;;:14;;;:18;;:25;;;;;;;;;;;;;:14;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;18177:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18177:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18177:25:0;;;;;;;;;-1:-1:-1;18177:25:0;-1:-1:-1;17988:222:0;;;:::o;14668:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14668:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14829:53::-;14876:6;14829:53;:::o;18419:390::-;18564:14;;18523:7;;-1:-1:-1;;;;;18564:14:0;18548:64;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;-1:-1:-1;;;18548:64:0;;;;;;;;;;;;;;;18624:13;18639:7;18650:22;18666:5;18650:15;:22::i;:::-;18623:49;;;;18691:2;:16;;;;-1:-1:-1;18697:10:0;;;18691:16;18683:48;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;-1:-1:-1;;;18683:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;18780:11:0;;;;;;:4;:11;;;;;:20;;;18749:52;;18776:2;:24;18749:22;:5;18759:11;18749:22;:9;:22;:::i;36851:266::-;-1:-1:-1;;;;;37064:7:0;;36975;37064;;;:4;:7;;;;;;;:21;;37011:98;;15051:7;;37011:75;;:38;37069:1;37037:11;37011:22;:38::i;13395:43::-;;;;;;;;;;;;-1:-1:-1;;;;;13395:43:0;;:::o;45213:663::-;45387:7;45410:17;45431:35;45452:13;45431:20;:35::i;:::-;-1:-1:-1;;;;;45501:21:0;;45477;45501;;;:4;:21;;;;;;;:35;;;;45577:41;;;;;45407:59;;-1:-1:-1;45501:35:0;-1:-1:-1;45643:51:0;45686:7;45643:38;45501:35;45577:41;45643:38;:17;:38;:::i;:51::-;45629:65;-1:-1:-1;45721:121:0;45789:42;15051:7;45789:29;:20;45629:65;45789:29;:24;:29;:::i;:42::-;-1:-1:-1;;;;;45739:21:0;;;;;;:4;:21;;;;;:30;;;45721:49;;:9;;45735:2;:34;45721:49;:13;:49;:::i;10832:20::-;;;;;;-1:-1:-1;;;;;10832:20:0;;:::o;12165:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18218:149::-;18269:6;-1:-1:-1;;;;;18296:1:0;:12;;18288:44;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;-1:-1:-1;;;18288:44:0;;;;;;;;;;;;;;;-1:-1:-1;18357:1:0;18218:149::o;4273:171::-;4331:7;4363:5;;;4387:6;;;;4379:36;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;-1:-1:-1;;;4379:36:0;;;;;;;;;;;;;;4014:171;4072:7;4105:1;4100;:6;;4092:36;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;-1:-1:-1;;;4092:36:0;;;;;;;;;;;;;;;-1:-1:-1;4151:5:0;;;4014:171::o;36388:172::-;36446:7;36474:1;36470;:5;36466:87;;;-1:-1:-1;36499:1:0;36492:8;;36466:87;-1:-1:-1;36540:1:0;36533:8;;19625:325;19714:7;-1:-1:-1;;;;;19785:19:0;;19781:80;;-1:-1:-1;;;;;;19828:21:0;;;19821:28;;19781:80;19921:21;;;-1:-1:-1;;;19921:21:0;;-1:-1:-1;;;;;19921:21:0;;;;;;;;;19895:5;;19921:15;;;;;:21;;;;;;;;;;;;;;:15;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;19921:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19921:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19921:21:0;;19625:325;-1:-1:-1;;;;19625:325:0:o;12782:587::-;13006:30;;:::i;:::-;-1:-1:-1;13039:198:0;;;;;;;;-1:-1:-1;;;;;13039:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13211:15;13039:198;;;;;;13303:16;;;-1:-1:-1;13286:34:0;;;:16;:34;;;;;;;;:46;;;;-1:-1:-1;;;;;;13286:46:0;;;;;;;;;;;;;;-1:-1:-1;13286:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13343:18;;;;;;;12782:587::o;9497:117::-;9603:1;9497:117::o;65566:2319::-;65790:11;65782:55;;;;;-1:-1:-1;;;65782:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65861:7;-1:-1:-1;;;;;65852:16:0;:5;-1:-1:-1;;;;;65852:16:0;;;:39;;;;-1:-1:-1;;;;;;65872:19:0;;;;65852:39;65848:239;;;65968:39;;;-1:-1:-1;;;65968:39:0;;-1:-1:-1;;;;;65968:39:0;;;;;;;;;;;;;;;;66011:6;;65968:23;;;;;:39;;;;;;;;;;;;;;:23;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;65968:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;65968:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;65968:39:0;:49;;65942:133;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;-1:-1:-1;;;65942:133:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;66101:19:0;;;66097:382;;66197:6;66170:5;-1:-1:-1;;;;;66163:23:0;;66187:5;66163:30;;;;;;;;;;;;;-1:-1:-1;;;;;66163:30:0;-1:-1:-1;;;;;66163:30:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;66163:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66163:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;66163:30:0;:40;;66137:122;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;-1:-1:-1;;;66137:122:0;;;;;;;;;;;;;;;66097:382;;;66290:7;-1:-1:-1;;;;;66281:16:0;:5;-1:-1:-1;;;;;66281:16:0;;66277:202;;;66432:6;66415:5;-1:-1:-1;;;;;66415:13:0;;:23;;66407:60;;;;;-1:-1:-1;;;66407:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;66504:7;-1:-1:-1;;;;;66495:16:0;:5;-1:-1:-1;;;;;66495:16:0;;66491:1387;;-1:-1:-1;;;;;66560:19:0;;;66556:314;;66639:49;-1:-1:-1;;;;;66639:30:0;;66670:5;66677:2;66681:6;66639:49;:30;:49;:::i;:::-;66556:314;;;66714:13;;;;;:34;;;66742:6;66731:8;:17;66714:34;66710:160;;;-1:-1:-1;;;;;66818:14:0;;:36;66833:20;:8;66846:6;66833:20;:12;:20;:::i;:::-;66818:36;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66818:36:0;66710:160;66491:1387;;;-1:-1:-1;;;;;67003:19:0;;;66999:868;;67069:38;-1:-1:-1;;;;;67069:26:0;;67096:2;67100:6;67069:38;:26;:38;:::i;66999:868::-;67672:13;;;;;:34;;;67700:6;67689:8;:17;67672:34;67668:184;;;-1:-1:-1;;;;;67731:11:0;;:33;67743:20;:8;67756:6;67743:20;:12;:20;:::i;67668:184::-;67813:19;;-1:-1:-1;;;;;67813:11:0;;;:19;;;;;67825:6;;67813:19;;;;67825:6;67813:11;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67813:19:0;67668:184;65566:2319;;;;;;:::o;2963:454::-;3021:7;3265:6;3261:47;;-1:-1:-1;3295:1:0;3288:8;;3261:47;3332:5;;;3336:1;3332;:5;:1;3356:5;;;;;:10;3348:40;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;-1:-1:-1;;;3348:40:0;;;;;;;;;;;;;;3552:324;3610:7;3705:6;3697:35;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;-1:-1:-1;;;3697:35:0;;;;;;;;;;;;;;;3743:9;3759:1;3755;:5;;;;;;;3552:324;-1:-1:-1;;;;3552:324:0:o;13548:182::-;-1:-1:-1;;;;;13599:12:0;;;;;;:7;:12;;;;;;13595:128;;13642:5;;;13633:15;;;;:8;:15;;;;;;;;:21;;-1:-1:-1;;;;;13633:21:0;;-1:-1:-1;;;;;;13633:21:0;;;;;;;;13684:5;;13669:12;;;:7;:12;;;;;;:20;;;13633:21;13704:7;;;13548:182;:::o;6408:284::-;6605:68;;;-1:-1:-1;;;;;6605:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6605:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6552:132:0;;6585:5;;6552:18;:132::i;:::-;6408:284;;;;:::o;6153:247::-;6323:58;;;-1:-1:-1;;;;;6323:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6323:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;6270:122:0;;6303:5;;6270:18;:122::i;:::-;6153:247;;;:::o;8556:900::-;9108:27;9116:5;-1:-1:-1;;;;;9108:25:0;;:27::i;:::-;9100:36;;;;;;9210:12;9224:23;9259:5;-1:-1:-1;;;;;9251:19:0;9271:4;9251:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9251:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9209:67:0;;;;9295:7;9287:16;;;;;;9320:17;;:21;9316:133;;9417:10;9406:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9406:30:0;9398:39;;;;;2091:650;2676:20;2724:9;;;2091:650::o;10560:57953::-;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;10560:57953:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://92b377c46f5c00676d5b91f01689410a809bd827018743d10d1cb5273cc8c627
Loading...
Loading
Loading...
Loading
OVERVIEW
Algorithm-driven crypto digital bank, deposit and withdraw anytime, borrow and repay anytime.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.