Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 23 from a total of 23 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 17329394 | 617 days ago | IN | 0 ETH | 0.00158208 | ||||
Exit Pool | 12348622 | 1370 days ago | IN | 0 ETH | 0.00466917 | ||||
Approve | 12245961 | 1386 days ago | IN | 0 ETH | 0.00320401 | ||||
Exit Pool | 12239784 | 1387 days ago | IN | 0 ETH | 0.02388529 | ||||
Exitswap Pool Am... | 12218740 | 1390 days ago | IN | 0 ETH | 0.00799157 | ||||
Approve | 12195740 | 1393 days ago | IN | 0 ETH | 0.00609606 | ||||
Approve | 12194260 | 1394 days ago | IN | 0 ETH | 0.00625123 | ||||
Approve | 12194035 | 1394 days ago | IN | 0 ETH | 0.00731527 | ||||
Exit Pool | 12187815 | 1395 days ago | IN | 0 ETH | 0.03073352 | ||||
Exit Pool | 12179771 | 1396 days ago | IN | 0 ETH | 0.0233842 | ||||
Exit Pool | 12135979 | 1403 days ago | IN | 0 ETH | 0.03496138 | ||||
Exit Pool | 12127191 | 1404 days ago | IN | 0 ETH | 0.01674565 | ||||
Exit Pool | 12126998 | 1404 days ago | IN | 0 ETH | 0.01216144 | ||||
Approve | 12126155 | 1404 days ago | IN | 0 ETH | 0.0020108 | ||||
Approve | 12126153 | 1404 days ago | IN | 0 ETH | 0.0035468 | ||||
Exit Pool | 12124931 | 1404 days ago | IN | 0 ETH | 0.01402993 | ||||
Approve | 12122109 | 1405 days ago | IN | 0 ETH | 0.00802463 | ||||
Approve | 12121919 | 1405 days ago | IN | 0 ETH | 0.00554187 | ||||
Approve | 12121807 | 1405 days ago | IN | 0 ETH | 0.00580788 | ||||
Approve | 12121719 | 1405 days ago | IN | 0 ETH | 0.00536453 | ||||
Approve | 12121630 | 1405 days ago | IN | 0 ETH | 0.00492118 | ||||
Approve | 12121158 | 1405 days ago | IN | 0 ETH | 0.00447783 | ||||
Approve | 12121007 | 1405 days ago | IN | 0 ETH | 0.00438916 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
12113838 | 1406 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x9436c214...Bee3F868d The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
XPool
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-13 */ // File: contracts/XVersion.sol pragma solidity 0.5.17; contract XVersion { function getVersion() external view returns (bytes32); } contract XApollo is XVersion { function getVersion() external view returns (bytes32) { return bytes32("APOLLO"); } } // File: contracts/XConst.sol pragma solidity 0.5.17; contract XConst { uint256 public constant BONE = 10**18; uint256 public constant MIN_BOUND_TOKENS = 2; uint256 public constant MAX_BOUND_TOKENS = 8; uint256 public constant EXIT_ZERO_FEE = 0; uint256 public constant MIN_WEIGHT = BONE; uint256 public constant MAX_WEIGHT = BONE * 50; uint256 public constant MAX_TOTAL_WEIGHT = BONE * 50; // min effective value: 0.000001 TOKEN uint256 public constant MIN_BALANCE = 10**6; // BONE/(10**10) XPT uint256 public constant MIN_POOL_AMOUNT = 10**8; uint256 public constant INIT_POOL_SUPPLY = BONE * 100; uint256 public constant MAX_IN_RATIO = BONE / 2; uint256 public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; } // File: contracts/lib/XNum.sol pragma solidity 0.5.17; library XNum { uint256 public constant BONE = 10**18; uint256 public constant MIN_BPOW_BASE = 1 wei; uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint256 public constant BPOW_PRECISION = BONE / 10**10; function btoi(uint256 a) internal pure returns (uint256) { return a / BONE; } function bfloor(uint256 a) internal pure returns (uint256) { return btoi(a) * BONE; } function badd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint256 a, uint256 b) internal pure returns (uint256) { (uint256 c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint256 a, uint256 b) internal pure returns (uint256, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint256 c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint256 c2 = c1 / BONE; return c2; } function bdiv(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "ERR_DIV_ZERO"); uint256 c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint256 c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint256 c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint256 a, uint256 n) internal pure returns (uint256) { uint256 z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint256 base, uint256 exp) internal pure returns (uint256) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint256 whole = bfloor(exp); uint256 remain = bsub(exp, whole); uint256 wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox( uint256 base, uint256 exp, uint256 precision ) internal pure returns (uint256) { // term 0: uint256 a = exp; (uint256 x, bool xneg) = bsubSign(base, BONE); uint256 term = BONE; uint256 sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i + 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint256 i = 1; term >= precision; i++) { uint256 bigK = i * BONE; (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } } // File: contracts/interface/IERC20.sol pragma solidity 0.5.17; interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); } // File: contracts/XPToken.sol pragma solidity 0.5.17; // Highly opinionated token implementation contract XTokenBase { using XNum for uint256; mapping(address => uint256) internal _balance; mapping(address => mapping(address => uint256)) internal _allowance; uint256 internal _totalSupply; event Approval(address indexed src, address indexed dst, uint256 amt); event Transfer(address indexed src, address indexed dst, uint256 amt); function _mint(uint256 amt) internal { _balance[address(this)] = (_balance[address(this)]).badd(amt); _totalSupply = _totalSupply.badd(amt); emit Transfer(address(0), address(this), amt); } function _burn(uint256 amt) internal { require(_balance[address(this)] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[address(this)] = (_balance[address(this)]).bsub(amt); _totalSupply = _totalSupply.bsub(amt); emit Transfer(address(this), address(0), amt); } function _move( address src, address dst, uint256 amt ) internal { require(_balance[src] >= amt, "ERR_INSUFFICIENT_BAL"); _balance[src] = (_balance[src]).bsub(amt); _balance[dst] = (_balance[dst]).badd(amt); emit Transfer(src, dst, amt); } } contract XPToken is XTokenBase, IERC20, XApollo { using XNum for uint256; string private constant _name = "XDeFi Pool Token"; string private constant _symbol = "XPT"; uint8 private constant _decimals = 18; function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function decimals() external view returns (uint8) { return _decimals; } function allowance(address src, address dst) external view returns (uint256) { return _allowance[src][dst]; } function balanceOf(address whom) external view returns (uint256) { return _balance[whom]; } function totalSupply() public view returns (uint256) { return _totalSupply; } function approve(address dst, uint256 amt) external returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function transfer(address dst, uint256 amt) external returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom( address src, address dst, uint256 amt ) external returns (bool) { require( msg.sender == src || amt <= _allowance[src][msg.sender], "ERR_BTOKEN_BAD_CALLER" ); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = (_allowance[src][msg.sender]).bsub( amt ); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } } // File: contracts/lib/XMath.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.17; library XMath { using XNum for uint256; uint256 public constant BONE = 10**18; uint256 public constant EXIT_ZERO_FEE = 0; /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcSpotPrice( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 swapFee ) public pure returns (uint256 spotPrice) { uint256 numer = tokenBalanceIn.bdiv(tokenWeightIn); uint256 denom = tokenBalanceOut.bdiv(tokenWeightOut); uint256 ratio = numer.bdiv(denom); uint256 scale = BONE.bdiv(BONE.bsub(swapFee)); return (spotPrice = ratio.bmul(scale)); } /********************************************************************************************** // calcOutGivenIn // // aO = tokenAmountOut // // bO = tokenBalanceOut // // bI = tokenBalanceIn / / bI \ (wI / wO) \ // // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | // // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcOutGivenIn( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 tokenAmountIn, uint256 swapFee ) public pure returns (uint256 tokenAmountOut) { uint256 weightRatio; if (tokenWeightIn == tokenWeightOut) { weightRatio = 1 * BONE; } else if (tokenWeightIn >> 1 == tokenWeightOut) { weightRatio = 2 * BONE; } else { weightRatio = tokenWeightIn.bdiv(tokenWeightOut); } uint256 adjustedIn = BONE.bsub(swapFee); adjustedIn = tokenAmountIn.bmul(adjustedIn); uint256 y = tokenBalanceIn.bdiv(tokenBalanceIn.badd(adjustedIn)); uint256 foo; if (tokenWeightIn == tokenWeightOut) { foo = y; } else if (tokenWeightIn >> 1 == tokenWeightOut) { foo = y.bmul(y); } else { foo = y.bpow(weightRatio); } uint256 bar = BONE.bsub(foo); tokenAmountOut = tokenBalanceOut.bmul(bar); return tokenAmountOut; } /********************************************************************************************** // calcInGivenOut // // aI = tokenAmountIn // // bO = tokenBalanceOut / / bO \ (wO / wI) \ // // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | // // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / // // wI = tokenWeightIn -------------------------------------------- // // wO = tokenWeightOut ( 1 - sF ) // // sF = swapFee // **********************************************************************************************/ function calcInGivenOut( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 tokenAmountOut, uint256 swapFee ) public pure returns (uint256 tokenAmountIn) { uint256 weightRatio; if (tokenWeightOut == tokenWeightIn) { weightRatio = 1 * BONE; } else if (tokenWeightOut >> 1 == tokenWeightIn) { weightRatio = 2 * BONE; } else { weightRatio = tokenWeightOut.bdiv(tokenWeightIn); } uint256 diff = tokenBalanceOut.bsub(tokenAmountOut); uint256 y = tokenBalanceOut.bdiv(diff); uint256 foo; if (tokenWeightOut == tokenWeightIn) { foo = y; } else if (tokenWeightOut >> 1 == tokenWeightIn) { foo = y.bmul(y); } else { foo = y.bpow(weightRatio); } foo = foo.bsub(BONE); tokenAmountIn = BONE.bsub(swapFee); tokenAmountIn = tokenBalanceIn.bmul(foo).bdiv(tokenAmountIn); return tokenAmountIn; } /********************************************************************************************** // calcPoolOutGivenSingleIn // // pAo = poolAmountOut / \ // // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ // // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ // // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS // // tBi = tokenBalanceIn \\ ------------------------------------- / / // // pS = poolSupply \\ tBi / / // // sF = swapFee \ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 poolSupply, uint256 totalWeight, uint256 tokenAmountIn, uint256 swapFee ) public pure returns (uint256 poolAmountOut) { // Charge the trading fee for the proportion of tokenAi /// which is implicitly traded to the other pool tokens. // That proportion is (1- weightTokenIn) // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee); uint256 normalizedWeight = tokenWeightIn.bdiv(totalWeight); uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee); uint256 tokenAmountInAfterFee = tokenAmountIn.bmul(BONE.bsub(zaz)); uint256 newTokenBalanceIn = tokenBalanceIn.badd(tokenAmountInAfterFee); uint256 tokenInRatio = newTokenBalanceIn.bdiv(tokenBalanceIn); // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply; uint256 poolRatio = tokenInRatio.bpow(normalizedWeight); uint256 newPoolSupply = poolRatio.bmul(poolSupply); poolAmountOut = newPoolSupply.bsub(poolSupply); return poolAmountOut; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 poolSupply, uint256 totalWeight, uint256 poolAmountIn, uint256 swapFee ) public pure returns (uint256 tokenAmountOut) { uint256 normalizedWeight = tokenWeightOut.bdiv(totalWeight); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint256 poolAmountInAfterExitFee = poolAmountIn.bmul(BONE.bsub(EXIT_ZERO_FEE)); uint256 newPoolSupply = poolSupply.bsub(poolAmountInAfterExitFee); uint256 poolRatio = newPoolSupply.bdiv(poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint256 tokenOutRatio = poolRatio.bpow(BONE.bdiv(normalizedWeight)); uint256 newTokenBalanceOut = tokenOutRatio.bmul(tokenBalanceOut); uint256 tokenAmountOutBeforeSwapFee = tokenBalanceOut.bsub(newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint256 zaz = BONE.bsub(normalizedWeight).bmul(swapFee); tokenAmountOut = tokenAmountOutBeforeSwapFee.bmul(BONE.bsub(zaz)); return tokenAmountOut; } } // File: contracts/interface/IXConfig.sol pragma solidity 0.5.17; interface IXConfig { function getCore() external view returns (address); function getSAFU() external view returns (address); function getMaxExitFee() external view returns (uint256); function getSafuFee() external view returns (uint256); function getSwapProxy() external view returns (address); function dedupPool(address[] calldata tokens, uint256[] calldata denorms) external returns (bool exist, bytes32 sig); function addPoolSig(bytes32 sig, address pool) external; } // File: contracts/XPool.sol pragma solidity 0.5.17; contract XPool is XApollo, XPToken, XConst { using XNum for uint256; //Swap Fees: 0.1%, 0.25%, 1%, 2.5%, 10% uint256[5] public SWAP_FEES = [ BONE / 1000, (25 * BONE) / 10000, BONE / 100, (25 * BONE) / 1000, BONE / 10 ]; struct Record { bool bound; // is token bound to pool uint256 index; // private uint256 denorm; // denormalized weight uint256 balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_REFER( address indexed caller, address indexed ref, address indexed tokenIn, uint256 fee ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_BIND( address indexed caller, address indexed token, uint256 denorm, uint256 balance ); event LOG_UPDATE_SAFU(address indexed safu, uint256 fee); event LOG_EXIT_FEE(uint256 fee); event LOG_FINAL(uint256 swapFee); event SET_CONTROLLER(address indexed manager); event UPDATE_FARM(address indexed caller, bool isFarm); // anonymous event event LOG_CALL( bytes4 indexed sig, address indexed caller, bytes data ) anonymous; modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex, "ERR_REENTRY"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "ERR_REENTRY"); _; } bool private _mutex; address public controller; // has CONTROL role // `finalize` require CONTROL, `finalize` sets `can SWAP and can JOIN` bool public finalized; uint256 public swapFee; uint256 public exitFee; // Pool Governance address public SAFU; uint256 public safuFee; bool public isFarmPool; address[] internal _tokens; mapping(address => Record) internal _records; uint256 private _totalWeight; IXConfig public xconfig; address public origin; constructor(address _xconfig, address _controller) public { controller = _controller; origin = tx.origin; swapFee = SWAP_FEES[1]; exitFee = EXIT_ZERO_FEE; finalized = false; xconfig = IXConfig(_xconfig); SAFU = xconfig.getSAFU(); safuFee = xconfig.getSafuFee(); } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint256) { return _tokens.length; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(finalized, "ERR_NOT_FINALIZED"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint256) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint256) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint256) { require(_records[token].bound, "ERR_NOT_BOUND"); uint256 denorm = _records[token].denorm; return denorm.bdiv(_totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint256) { require(_records[token].bound, "ERR_NOT_BOUND"); return _records[token].balance; } function setController(address manager) external _logs_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(manager != address(0), "ERR_ZERO_ADDR"); controller = manager; emit SET_CONTROLLER(manager); } function setExitFee(uint256 fee) external { require(!finalized, "ERR_IS_FINALIZED"); require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(fee <= xconfig.getMaxExitFee(), "INVALID_EXIT_FEE"); exitFee = fee; emit LOG_EXIT_FEE(fee); } // allow SAFU address and SAFE FEE be updated by xconfig function updateSafu(address safu, uint256 fee) external { require(msg.sender == address(xconfig), "ERR_NOT_CONFIG"); require(safu != address(0), "ERR_ZERO_ADDR"); SAFU = safu; safuFee = fee; emit LOG_UPDATE_SAFU(safu, fee); } // allow isFarmPool be updated by xconfig function updateFarm(bool isFarm) external { require(msg.sender == address(xconfig), "ERR_NOT_CONFIG"); isFarmPool = isFarm; emit UPDATE_FARM(msg.sender, isFarm); } function bind(address token, uint256 denorm) external _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(!_records[token].bound, "ERR_IS_BOUND"); require(!finalized, "ERR_IS_FINALIZED"); require(_tokens.length < MAX_BOUND_TOKENS, "ERR_MAX_TOKENS"); require(denorm >= MIN_WEIGHT, "ERR_MIN_WEIGHT"); require(denorm <= MAX_WEIGHT, "ERR_MAX_WEIGHT"); uint256 balance = IERC20(token).balanceOf(address(this)); uint256 decimal = 10**uint256(IERC20(token).decimals()); require(decimal >= 10**6, "ERR_TOO_SMALL"); // 0.000001 TOKEN require(balance >= decimal / MIN_BALANCE, "ERR_MIN_BALANCE"); _totalWeight = _totalWeight.badd(denorm); require(_totalWeight <= MAX_TOTAL_WEIGHT, "ERR_MAX_TOTAL_WEIGHT"); _records[token] = Record({ bound: true, index: _tokens.length, denorm: denorm, balance: balance }); _tokens.push(token); emit LOG_BIND(msg.sender, token, denorm, balance); } // _swapFee must be one of SWAP_FEES function finalize(uint256 _swapFee) external _lock_ { require(msg.sender == controller, "ERR_NOT_CONTROLLER"); require(!finalized, "ERR_IS_FINALIZED"); require(_tokens.length >= MIN_BOUND_TOKENS, "ERR_MIN_TOKENS"); require(_tokens.length <= MAX_BOUND_TOKENS, "ERR_MAX_TOKENS"); require(_swapFee >= SWAP_FEES[0], "ERR_MIN_FEE"); require(_swapFee <= SWAP_FEES[SWAP_FEES.length - 1], "ERR_MAX_FEE"); bool found = false; for (uint256 i = 0; i < SWAP_FEES.length; i++) { if (_swapFee == SWAP_FEES[i]) { found = true; break; } } require(found, "ERR_INVALID_SWAP_FEE"); swapFee = _swapFee; finalized = true; _mintPoolShare(INIT_POOL_SUPPLY); _pushPoolShare(msg.sender, INIT_POOL_SUPPLY); emit LOG_FINAL(swapFee); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound, "ERR_NOT_BOUND"); _records[token].balance = IERC20(token).balanceOf(address(this)); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint256 spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); } function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint256 spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0 ); } function joinPool(uint256 poolAmountOut, uint256[] calldata maxAmountsIn) external _lock_ { require(finalized, "ERR_NOT_FINALIZED"); require(maxAmountsIn.length == _tokens.length, "ERR_LENGTH_MISMATCH"); uint256 poolTotal = totalSupply(); uint256 ratio = poolAmountOut.bdiv(poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); for (uint256 i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint256 bal = _records[t].balance; uint256 tokenAmountIn = ratio.bmul(bal); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN"); _records[t].balance = (_records[t].balance).badd(tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint256 poolAmountIn, uint256[] calldata minAmountsOut) external _lock_ { require(finalized, "ERR_NOT_FINALIZED"); require(minAmountsOut.length == _tokens.length, "ERR_LENGTH_MISMATCH"); // min pool amount require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT"); uint256 poolTotal = totalSupply(); uint256 _exitFee = poolAmountIn.bmul(exitFee); // never charge exitFee to pool origin if (msg.sender == origin) { _exitFee = 0; } uint256 pAiAfterExitFee = poolAmountIn.bsub(_exitFee); uint256 ratio = pAiAfterExitFee.bdiv(poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); _pullPoolShare(msg.sender, poolAmountIn); // send exitFee to origin if (_exitFee > 0) { _pushPoolShare(origin, _exitFee); } _burnPoolShare(pAiAfterExitFee); for (uint256 i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint256 bal = _records[t].balance; uint256 tokenAmountOut = ratio.bmul(bal); require(tokenAmountOut != 0, "ERR_MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT"); _records[t].balance = (_records[t].balance).bsub(tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountOut, uint256 spotPriceAfter) { return swapExactAmountInRefer( tokenIn, tokenAmountIn, tokenOut, minAmountOut, maxPrice, address(0x0) ); } function swapExactAmountInRefer( address tokenIn, uint256 tokenAmountIn, address tokenOut, uint256 minAmountOut, uint256 maxPrice, address referrer ) public _lock_ returns (uint256 tokenAmountOut, uint256 spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(finalized, "ERR_NOT_FINALIZED"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require( tokenAmountIn <= (inRecord.balance).bmul(MAX_IN_RATIO), "ERR_MAX_IN_RATIO" ); uint256 spotPriceBefore = XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); require( spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut), "ERR_MATH_APPROX" ); inRecord.balance = (inRecord.balance).badd(tokenAmountIn); outRecord.balance = (outRecord.balance).bsub(tokenAmountOut); spotPriceAfter = XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); emit LOG_SWAP( msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut ); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint256 _swapFee = tokenAmountIn.bmul(swapFee); // to referral uint256 _referFee = 0; if ( referrer != address(0) && referrer != msg.sender && referrer != tx.origin ) { _referFee = _swapFee / 5; // 20% to referrer _pushUnderlying(tokenIn, referrer, _referFee); inRecord.balance = (inRecord.balance).bsub(_referFee); emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee); } // to SAFU uint256 _safuFee = tokenAmountIn.bmul(safuFee); if (isFarmPool) { _safuFee = _swapFee.bsub(_referFee); } require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT"); _pushUnderlying(tokenIn, SAFU, _safuFee); inRecord.balance = (inRecord.balance).bsub(_safuFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint256 maxAmountIn, address tokenOut, uint256 tokenAmountOut, uint256 maxPrice ) external returns (uint256 tokenAmountIn, uint256 spotPriceAfter) { return swapExactAmountOutRefer( tokenIn, maxAmountIn, tokenOut, tokenAmountOut, maxPrice, address(0x0) ); } function swapExactAmountOutRefer( address tokenIn, uint256 maxAmountIn, address tokenOut, uint256 tokenAmountOut, uint256 maxPrice, address referrer ) public _lock_ returns (uint256 tokenAmountIn, uint256 spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(finalized, "ERR_NOT_FINALIZED"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require( tokenAmountOut <= (outRecord.balance).bmul(MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO" ); uint256 spotPriceBefore = XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, swapFee ); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); require( spotPriceBefore <= tokenAmountIn.bdiv(tokenAmountOut), "ERR_MATH_APPROX" ); inRecord.balance = (inRecord.balance).badd(tokenAmountIn); outRecord.balance = (outRecord.balance).bsub(tokenAmountOut); spotPriceAfter = XMath.calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); emit LOG_SWAP( msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut ); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint256 _swapFee = tokenAmountIn.bmul(swapFee); // to referral uint256 _referFee = 0; if ( referrer != address(0) && referrer != msg.sender && referrer != tx.origin ) { _referFee = _swapFee / 5; // 20% to referrer _pushUnderlying(tokenIn, referrer, _referFee); inRecord.balance = (inRecord.balance).bsub(_referFee); emit LOG_REFER(msg.sender, referrer, tokenIn, _referFee); } // to SAFU uint256 _safuFee = tokenAmountIn.bmul(safuFee); if (isFarmPool) { _safuFee = _swapFee.bsub(_referFee); } require(_safuFee.badd(_referFee) <= _swapFee, "ERR_FEE_LIMIT"); _pushUnderlying(tokenIn, SAFU, _safuFee); inRecord.balance = (inRecord.balance).bsub(_safuFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn( address tokenIn, uint256 tokenAmountIn, uint256 minPoolAmountOut ) external _lock_ returns (uint256 poolAmountOut) { require(finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require( tokenAmountIn <= (_records[tokenIn].balance).bmul(MAX_IN_RATIO), "ERR_MAX_IN_RATIO" ); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); // to SAFU uint256 _safuFee = tokenAmountIn.bmul(safuFee); if (isFarmPool) { _safuFee = tokenAmountIn.bmul(swapFee); } tokenAmountIn = tokenAmountIn.bsub(_safuFee); Record storage inRecord = _records[tokenIn]; poolAmountOut = XMath.calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, swapFee ); require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT"); inRecord.balance = (inRecord.balance).badd(tokenAmountIn); _pushUnderlying(tokenIn, SAFU, _safuFee); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); return poolAmountOut; } function exitswapPoolAmountIn( address tokenOut, uint256 poolAmountIn, uint256 minAmountOut ) external _logs_ _lock_ returns (uint256 tokenAmountOut) { require(finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(poolAmountIn >= MIN_POOL_AMOUNT, "ERR_MIN_AMOUNT"); _pullPoolShare(msg.sender, poolAmountIn); // exit fee to origin if (exitFee > 0 && msg.sender != origin) { uint256 _exitFee = poolAmountIn.bmul(exitFee); _pushPoolShare(origin, _exitFee); poolAmountIn = poolAmountIn.bsub(_exitFee); } _burnPoolShare(poolAmountIn); Record storage outRecord = _records[tokenOut]; tokenAmountOut = XMath.calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); require( tokenAmountOut <= (_records[tokenOut].balance).bmul(MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO" ); outRecord.balance = (outRecord.balance).bsub(tokenAmountOut); // to SAFU uint256 _safuFee = tokenAmountOut.bmul(safuFee); if (isFarmPool) { _safuFee = tokenAmountOut.bmul(swapFee); } emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pushUnderlying(tokenOut, SAFU, _safuFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut.bsub(_safuFee)); return tokenAmountOut; } function calcOutGivenIn( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 tokenAmountIn, uint256 _swapFee ) public pure returns (uint256) { return XMath.calcOutGivenIn( tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountIn, _swapFee ); } function calcInGivenOut( uint256 tokenBalanceIn, uint256 tokenWeightIn, uint256 tokenBalanceOut, uint256 tokenWeightOut, uint256 tokenAmountOut, uint256 _swapFee ) public pure returns (uint256) { return XMath.calcInGivenOut( tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountOut, _swapFee ); } // == // 'Underlying' token-manipulation functions make external calls but are NOT locked // You must `_lock_` or otherwise ensure reentry-safety // Fixed ERC-20 transfer revert for some special token such as USDT function _pullUnderlying( address erc20, address from, uint256 amount ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = erc20.call( abi.encodeWithSelector(0x23b872dd, from, address(this), amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "ERC20_TRANSFER_FROM_FAILED" ); } function _pushUnderlying( address erc20, address to, uint256 amount ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = erc20.call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require( success && (data.length == 0 || abi.decode(data, (bool))), "ERC20_TRANSFER_FAILED" ); } function _pullPoolShare(address from, uint256 amount) internal { _move(from, address(this), amount); } function _pushPoolShare(address to, uint256 amount) internal { _move(address(this), to, amount); } function _mintPoolShare(uint256 amount) internal { _mint(amount); } function _burnPoolShare(uint256 amount) internal { _burn(amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_xconfig","type":"address"},{"internalType":"address","name":"_controller","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"denorm","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"LOG_BIND","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_EXIT_FEE","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"LOG_FINAL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"ref","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_REFER","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"safu","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"LOG_UPDATE_SAFU","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"SET_CONTROLLER","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bool","name":"isFarm","type":"bool"}],"name":"UPDATE_FARM","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_ZERO_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_POOL_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAFU","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SWAP_FEES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFarmPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"origin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"safuFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setExitFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountInRefer","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swapExactAmountOutRefer","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"isFarm","type":"bool"}],"name":"updateFarm","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"safu","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateSafu","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"xconfig","outputs":[{"internalType":"contract IXConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061038e5760003560e01c80638c28cbe8116101de578063ba9530a61161010f578063e5a583a9116100ad578063f699a3911161007c578063f699a39114610ae5578063f77c479114610b02578063f8b2cb4f14610b0a578063f8d6aed414610b305761038e565b8063e5a583a914610a92578063e755f7ea14610aaf578063ec09302114610ab7578063f1b8a9b714610abf5761038e565b8063cd2ed8fb116100e9578063cd2ed8fb14610a30578063cd669be014610a38578063dd62ed3e14610a64578063e4a28a521461046f5761038e565b8063ba9530a61461099d578063be3bbd2e146109d8578063c36596a6146105485761038e565b8063992e2a921161017c578063b02f0b7311610156578063b02f0b731461090e578063b0e0d13614610985578063b3f05b971461098d578063b7b800a4146109955761038e565b8063992e2a92146108ae5780639c649fee146108b6578063a9059cbb146108e25761038e565b80639381cd2b116101b85780639381cd2b14610870578063938b5f3214610878578063948d8ce61461088057806395d89b41146108a65761038e565b80638c28cbe81461081c57806392eefe9b14610842578063936c3477146108685761038e565b80632f37b624116102c35780636a7f63fa116102615780637c5e9ea4116102305780637c5e9ea41461074c57806381efd24a1461078c5780638201aa3f146107d4578063867378c5146108145761038e565b80636a7f63fa146106b557806370a08231146106bd57806371cbfdca146106e35780637ae05237146106eb5761038e565b80634f69c0d41161029d5780634f69c0d4146105fc57806354cf2aeb146106735780635db342771461067b5780636284ae41146106ad5761038e565b80632f37b62414610586578063313ce567146105ac57806346ab38f1146105ca5761038e565b80631446a7ff1161033057806318160ddd1161030a57806318160ddd146105215780631ca22ea514610529578063218b53821461054857806323b872dd146105505761038e565b80631446a7ff146104bd57806315e84af9146104eb57806317ab06e1146105195761038e565b806309a3bbe41161036c57806309a3bbe41461046f5780630d8e6e2c146104895780630dbc6b3e1461049157806311b42b1e146104b55761038e565b806305261aea1461039357806306fdde03146103b2578063095ea7b31461042f575b600080fd5b6103b0600480360360208110156103a957600080fd5b5035610b6b565b005b6103ba610e84565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f45781810151838201526020016103dc565b50505050905090810190601f1680156104215780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61045b6004803603604081101561044557600080fd5b506001600160a01b038135169060200135610eae565b604080519115158252519081900360200190f35b610477610f14565b60408051918252519081900360200190f35b610477610f21565b610499610f2e565b604080516001600160a01b039092168252519081900360200190f35b610477610f3d565b610477600480360360408110156104d357600080fd5b506001600160a01b0381358116916020013516610f42565b6104776004803603604081101561050157600080fd5b506001600160a01b038135811691602001351661111d565b6104776112c7565b6104776112cf565b6103b06004803603602081101561053f57600080fd5b503515156112d5565b61047761136f565b61045b6004803603606081101561056657600080fd5b506001600160a01b0381358116916020810135909116906040013561137b565b61045b6004803603602081101561059c57600080fd5b50356001600160a01b03166114ed565b6105b461150b565b6040805160ff9092168252519081900360200190f35b610477600480360360608110156105e057600080fd5b506001600160a01b038135169060208101359060400135611510565b6103b06004803603604081101561061257600080fd5b8135919081019060408101602082013564010000000081111561063457600080fd5b82018360208201111561064657600080fd5b8035906020019184602083028401116401000000008311171561066857600080fd5b509092509050611999565b610477611c9f565b6104776004803603606081101561069157600080fd5b506001600160a01b038135169060208101359060400135611ca5565b61047761200f565b610499612015565b610477600480360360208110156106d357600080fd5b50356001600160a01b0316612024565b61047761203f565b610733600480360360c081101561070157600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516612045565b6040805192835260208301919091528051918290030190f35b610733600480360360a081101561076257600080fd5b506001600160a01b038135811691602081013591604082013516906060810135906080013561277e565b610733600480360360c08110156107a257600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a001351661279e565b610733600480360360a08110156107ea57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eba565b610477612ecc565b6103b06004803603602081101561083257600080fd5b50356001600160a01b0316612ed3565b6103b06004803603602081101561085857600080fd5b50356001600160a01b031661307f565b6104776131d6565b610477613226565b610499613233565b6104776004803603602081101561089657600080fd5b50356001600160a01b0316613242565b6103ba613307565b610477613324565b6103b0600480360360408110156108cc57600080fd5b506001600160a01b038135169060200135613330565b61045b600480360360408110156108f857600080fd5b506001600160a01b03813516906020013561384d565b6103b06004803603604081101561092457600080fd5b8135919081019060408101602082013564010000000081111561094657600080fd5b82018360208201111561095857600080fd5b8035906020019184602083028401116401000000008311171561097a57600080fd5b509092509050613863565b610477613c17565b61045b613c1c565b610477613c2c565b610477600480360360c08110156109b357600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613c31565b6109e0613ce1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610a1c578181015183820152602001610a04565b505050509050019250505060405180910390f35b610477613ddc565b6103b060048036036040811015610a4e57600080fd5b506001600160a01b038135169060200135613de2565b61047760048036036040811015610a7a57600080fd5b506001600160a01b0381358116916020013516613ed8565b6103b060048036036020811015610aa857600080fd5b5035613f03565b61045b6140aa565b6104776140b3565b61047760048036036020811015610ad557600080fd5b50356001600160a01b03166140bf565b61047760048036036020811015610afb57600080fd5b503561419c565b6104996141b0565b61047760048036036020811015610b2057600080fd5b50356001600160a01b03166141c4565b610477600480360360c0811015610b4657600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614289565b60085460ff1615610bb1576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b03163314610c18576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b600854600160a81b900460ff1615610c6a576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e5460021115610cb3576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d494e5f544f4b454e5360901b604482015290519081900360640190fd5b600e5460081015610cfc576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b600354811015610d41576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d494e5f46454560a81b604482015290519081900360640190fd5b600754811115610d86576040805162461bcd60e51b815260206004820152600b60248201526a4552525f4d41585f46454560a81b604482015290519081900360640190fd5b6000805b6005811015610dba5760038160058110610da057fe5b0154831415610db25760019150610dba565b600101610d8a565b5080610e04576040805162461bcd60e51b81526020600482015260146024820152734552525f494e56414c49445f535741505f46454560601b604482015290519081900360640190fd5b60098290556008805460ff60a81b1916600160a81b179055610e2e68056bc75e2d63100000614302565b610e413368056bc75e2d6310000061430e565b60095460408051918252517f385682b698dbab9a6c443fd4594a08df31e60958fa2369566cc3a76c0072a7fe9181900360200190a150506008805460ff19169055565b60408051808201909152601081526f2c2232a334902837b7b6102a37b5b2b760811b602082015290565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b6802b5e3af16b188000081565b6541504f4c4c4f60d01b90565b600b546001600160a01b031681565b600081565b60085460009060ff1615610f8b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff16610fe8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611045576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f6020908152604080832093861683528083206003808601546002808801549284015490840154855163a221ee4960e01b81526004810193909352602483019390935260448201526064810191909152608481019490945290519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b505af41580156110fc573d6000803e3d6000fd5b505050506040513d602081101561111257600080fd5b505195945050505050565b60085460009060ff1615611166576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f602052604090205460ff166111c3576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16611220576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600f602090815260408083209386168352918290206003808501546002808701549284015490840154600954875163a221ee4960e01b81526004810194909452602484019490945260448301919091526064820152608481019190915292519092734f8d1c6dabbb379134272cb1273638cc98212a449263a221ee499260a480840193829003018186803b1580156110e857600080fd5b6305f5e10081565b60025490565b6011546001600160a01b03163314611325576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b600d805482151560ff199091168117909155604080519182525133917f1c37382de11fec2ccd27d010eaa40491f045ea806bc44380827628e4f767040d919081900360200190a250565b670de0b6b3a764000081565b6000336001600160a01b03851614806113b757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b611400576040805162461bcd60e51b815260206004820152601560248201527422a9292fa12a27a5a2a72fa120a22fa1a0a62622a960591b604482015290519081900360640190fd5b61140b84848461431d565b336001600160a01b0385161480159061144957506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156114e3576001600160a01b0384166000908152600160209081526040808320338452909152902054611482908363ffffffff61443916565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35b5060019392505050565b6001600160a01b03166000908152600f602052604090205460ff1690565b601290565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff16156115b9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611617576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611674576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6305f5e1008310156116be576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b6116c8338461449b565b6000600a541180156116e557506012546001600160a01b03163314155b1561172e576000611701600a54856144a690919063ffffffff16565b60125490915061171a906001600160a01b03168261430e565b61172a848263ffffffff61443916565b9350505b6117378361456f565b6001600160a01b0384166000908152600f6020908152604091829020600381015460028083015490546010546009548751634494c00960e11b815260048101959095526024850193909352604484019190915260648301526084820188905260a482015292519092734f8d1c6dabbb379134272cb1273638cc98212a449263892980129260c480840193829003018186803b1580156117d557600080fd5b505af41580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b5051915082821015611848576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600f6020526040902060030154611876906704a03ce68d2155566144a6565b8211156118be576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b60038101546118d3908363ffffffff61443916565b6003820155600c546000906118ef90849063ffffffff6144a616565b600d5490915060ff16156119145760095461191190849063ffffffff6144a616565b90505b6040805184815290516001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9181900360200190a3600b5461196c9087906001600160a01b031683614578565b6119868633611981868563ffffffff61443916565b614578565b50506008805460ff191690559392505050565b60085460ff16156119df576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611a3d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114611a89576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6000611a936112cf565b90506000611aa7858363ffffffff6146da16565b905080611aed576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600e54811015611c7a576000600e8281548110611b0957fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090611b44858363ffffffff6144a616565b905080611b8a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878785818110611b9657fe5b90506020020135811115611be0576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154611c0c908263ffffffff6147e216565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9281900390910190a3611c6f83338361482f565b505050600101611af0565b50611c8485614302565b611c8e338661430e565b50506008805460ff19169055505050565b60095481565b60085460009060ff1615611cee576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16611d4c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f602052604090205460ff16611da9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600f6020526040902060030154611dd7906706f05b59d3b200006144a6565b831115611e1e576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b611e2984338561482f565b6000611e40600c54856144a690919063ffffffff16565b600d5490915060ff1615611e6557600954611e6290859063ffffffff6144a616565b90505b611e75848263ffffffff61443916565b6001600160a01b0386166000908152600f6020908152604091829020600381015460028083015490546010546009548751638656b65360e01b815260048101959095526024850193909352604484019190915260648301526084820186905260a4820152925193975092734f8d1c6dabbb379134272cb1273638cc98212a4492638656b6539260c4808301939192829003018186803b158015611f1757600080fd5b505af4158015611f2b573d6000803e3d6000fd5b505050506040513d6020811015611f4157600080fd5b5051925083831015611f8a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6003810154611f9f908663ffffffff6147e216565b6003820155600b54611fbc9087906001600160a01b031684614578565b6040805186815290516001600160a01b0388169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a361200583614302565b611986338461430e565b600a5481565b6011546001600160a01b031681565b6001600160a01b031660009081526020819052604090205490565b600c5481565b600854600090819060ff1615612090576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff166120fa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff16612157576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff166121a9576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f60205260408082209289168252902060038201546121e1906706f05b59d3b200006144a6565b891115612228576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b1580156122ab57600080fd5b505af41580156122bf573d6000803e3d6000fd5b505050506040513d60208110156122d557600080fd5b5051905086811115612324576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b61234483600301548460020154846003015485600201548e600954613c31565b94508785101561238b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61239b8a8663ffffffff6146da16565b8111156123e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60038301546123f6908b63ffffffff6147e216565b600380850191909155820154612412908663ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b15801561249b57600080fd5b505af41580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b5051935080841015612510576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612557576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788d89604051808381526020018281526020019250505060405180910390a46125bf8b338c61482f565b60006125d66009548c6144a690919063ffffffff16565b905060006001600160a01b038816158015906125fb57506001600160a01b0388163314155b801561261057506001600160a01b0388163214155b156126985750600581046126258d8983614578565b600385015461263a908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b60006126af600c548e6144a690919063ffffffff16565b600d5490915060ff16156126d0576126cd838363ffffffff61443916565b90505b826126e1828463ffffffff6147e216565b1115612724576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b5461273c908f906001600160a01b031683614578565b6003860154612751908263ffffffff61443916565b60038701556127618c338a614578565b5050505050506008805460ff191690559097909650945050505050565b6000806127908787878787600061279e565b915091509550959350505050565b600854600090819060ff16156127e9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0388166000908152600f602052604090205460ff16612853576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0386166000908152600f602052604090205460ff166128b0576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600854600160a81b900460ff16612902576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b038881166000908152600f602052604080822092891682529020600381015461293a906704a03ce68d2155566144a6565b871115612982576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612a0557600080fd5b505af4158015612a19573d6000803e3d6000fd5b505050506040513d6020811015612a2f57600080fd5b5051905086811115612a7e576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b612a9e83600301548460020154846003015485600201548c600954614289565b945089851115612ae4576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b612af4858963ffffffff6146da16565b811115612b3a576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b6003830154612b4f908663ffffffff6147e216565b600380850191909155820154612b6b908963ffffffff61443916565b8260030181905550734f8d1c6dabbb379134272cb1273638cc98212a4463a221ee4984600301548560020154856003015486600201546009546040518663ffffffff1660e01b8152600401808681526020018581526020018481526020018381526020018281526020019550505050505060206040518083038186803b158015612bf457600080fd5b505af4158015612c08573d6000803e3d6000fd5b505050506040513d6020811015612c1e57600080fd5b5051935080841015612c69576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b86841115612cb0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b886001600160a01b03168b6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888c604051808381526020018281526020019250505060405180910390a4612d188b338761482f565b6000612d2f600954876144a690919063ffffffff16565b905060006001600160a01b03881615801590612d5457506001600160a01b0388163314155b8015612d6957506001600160a01b0388163214155b15612df1575060058104612d7e8d8983614578565b6003850154612d93908263ffffffff61443916565b85600301819055508c6001600160a01b0316886001600160a01b0316336001600160a01b03167f2fa8f551635bc74da38059e0b4294901eedc1258f4dab545bbc85a3b809eb076846040518082815260200191505060405180910390a45b6000612e08600c54896144a690919063ffffffff16565b600d5490915060ff1615612e2957612e26838363ffffffff61443916565b90505b82612e3a828463ffffffff6147e216565b1115612e7d576040805162461bcd60e51b815260206004820152600d60248201526c11549497d1915157d312535255609a1b604482015290519081900360640190fd5b600b54612e95908f906001600160a01b031683614578565b6003860154612eaa908263ffffffff61443916565b60038701556127618c338d614578565b60008061279087878787876000612045565b620f424081565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085460ff1615612f7a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790556001600160a01b0381166000908152600f602052604090205460ff16612fe4576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b15801561302a57600080fd5b505afa15801561303e573d6000803e3d6000fd5b505050506040513d602081101561305457600080fd5b50516001600160a01b039091166000908152600f60205260409020600301556008805460ff19169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a260085461010090046001600160a01b03163314613139576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b038116613184576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b60088054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f37f86e4777739e0dbc5682f53e26f091cac39f3d134742d5431c06cbe0a58dff90600090a250565b60085460009060ff161561321f576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b5060105490565b68056bc75e2d6310000081565b6012546001600160a01b031681565b60085460009060ff161561328b576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff166132e8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206002015490565b60408051808201909152600381526216141560ea1b602082015290565b6704a03ce68d21555681565b60085460ff1615613376576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b60088054600160ff19909116179081905561010090046001600160a01b031633146133dd576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff161561343a576040805162461bcd60e51b815260206004820152600c60248201526b11549497d254d7d093d5539160a21b604482015290519081900360640190fd5b600854600160a81b900460ff161561348c576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b600e546008116134d4576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4d41585f544f4b454e5360901b604482015290519081900360640190fd5b670de0b6b3a7640000811015613522576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d5d15251d21560921b604482015290519081900360640190fd5b6802b5e3af16b1880000811115613571576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3505617d5d15251d21560921b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d60208110156135e557600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0386169163313ce567916004808301926020929190829003018186803b15801561362d57600080fd5b505afa158015613641573d6000803e3d6000fd5b505050506040513d602081101561365757600080fd5b505160ff16600a0a9050620f42408110156136a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d513d3d7d4d3505313609a1b604482015290519081900360640190fd5b620f424081048210156136f5576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4d494e5f42414c414e434560881b604482015290519081900360640190fd5b601054613708908463ffffffff6147e216565b60108190556802b5e3af16b18800001015613761576040805162461bcd60e51b815260206004820152601460248201527311549497d3505617d513d5105317d5d15251d21560621b604482015290519081900360640190fd5b604080516080810182526001808252600e80546020808501918252848601898152606086018981526001600160a01b038c166000818152600f85528981209851895460ff19169015151789559451888801559151600288015551600390960195909555825493840183559190527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd90910180546001600160a01b0319168317905582518681529081018590528251919233927f5deb8656732bee68a74ef874b834356bfc2936842bd13b816ec4c219e362a71e9281900390910190a350506008805460ff191690555050565b600061385a33848461431d565b50600192915050565b60085460ff16156138a9576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6008805460ff191660011790819055600160a81b900460ff16613907576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e548114613953576040805162461bcd60e51b815260206004820152601360248201527208aa4a4be988a9c8ea890be9a92a69a82a8869606b1b604482015290519081900360640190fd5b6305f5e10083101561399d576040805162461bcd60e51b815260206004820152600e60248201526d11549497d3525397d05353d5539560921b604482015290519081900360640190fd5b60006139a76112cf565b905060006139c0600a54866144a690919063ffffffff16565b6012549091506001600160a01b03163314156139da575060005b60006139ec868363ffffffff61443916565b90506000613a00828563ffffffff6146da16565b905080613a46576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613a50338861449b565b8215613a6c57601254613a6c906001600160a01b03168461430e565b613a758261456f565b60005b600e54811015613c03576000600e8281548110613a9157fe5b60009182526020808320909101546001600160a01b0316808352600f909152604082206003015490925090613acc858363ffffffff6144a616565b905080613b12576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613b1e57fe5b90506020020135811015613b69576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600f6020526040902060030154613b95908263ffffffff61443916565b6001600160a01b0384166000818152600f60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3613bf8833383614578565b505050600101613a78565b50506008805460ff19169055505050505050565b600881565b600854600160a81b900460ff1681565b600281565b60408051635d4a985360e11b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163ba9530a69160c480820192602092909190829003018186803b158015613caa57600080fd5b505af4158015613cbe573d6000803e3d6000fd5b505050506040513d6020811015613cd457600080fd5b5051979650505050505050565b60085460609060ff1615613d2a576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b600854600160a81b900460ff16613d7c576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b600e805480602002602001604051908101604052809291908181526020018280548015613dd257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613db4575b5050505050905090565b600e5490565b6011546001600160a01b03163314613e32576040805162461bcd60e51b815260206004820152600e60248201526d4552525f4e4f545f434f4e46494760901b604482015290519081900360640190fd5b6001600160a01b038216613e7d576040805162461bcd60e51b815260206004820152600d60248201526c22a9292fad22a927afa0a2222960991b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b03199091168117909155600c8290556040805183815290517fccaa809140cb901df601f6c5eae0a0d30849c3b29378df0886f660270c9735e99181900360200190a25050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600854600160a81b900460ff1615613f55576040805162461bcd60e51b815260206004820152601060248201526f11549497d254d7d1925390531256915160821b604482015290519081900360640190fd5b60085461010090046001600160a01b03163314613fae576040805162461bcd60e51b815260206004820152601260248201527122a9292fa727aa2fa1a7a72a2927a62622a960711b604482015290519081900360640190fd5b601160009054906101000a90046001600160a01b03166001600160a01b031663ff42517d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ffc57600080fd5b505afa158015614010573d6000803e3d6000fd5b505050506040513d602081101561402657600080fd5b505181111561406f576040805162461bcd60e51b815260206004820152601060248201526f494e56414c49445f455849545f46454560801b604482015290519081900360640190fd5b600a8190556040805182815290517f09ea89c001139a826eedf1b1b3a690524db01249f803b62c0f6a30b09f4976fc9181900360200190a150565b600d5460ff1681565b6706f05b59d3b2000081565b60085460009060ff1615614108576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff16614165576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090206002015460105461419590829063ffffffff6146da16565b9392505050565b600381600581106141a957fe5b0154905081565b60085461010090046001600160a01b031681565b60085460009060ff161561420d576040805162461bcd60e51b815260206004820152600b60248201526a4552525f5245454e54525960a81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600f602052604090205460ff1661426a576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b506001600160a01b03166000908152600f602052604090206003015490565b60408051633e35abb560e21b8152600481018890526024810187905260448101869052606481018590526084810184905260a481018390529051600091734f8d1c6dabbb379134272cb1273638cc98212a449163f8d6aed49160c480820192602092909190829003018186803b158015613caa57600080fd5b61430b81614998565b50565b61431930838361431d565b5050565b6001600160a01b038316600090815260208190526040902054811115614381576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0383166000908152602081905260409020546143aa908263ffffffff61443916565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546143df908263ffffffff6147e216565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006144488585614a19565b915091508015614493576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b61431982308361431d565b60008282028315806144c05750828482816144bd57fe5b04145b614504576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614557576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b61430b81614a3e565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106145f55780518252601f1990920191602091820191016145d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614657576040519150601f19603f3d011682016040523d82523d6000602084013e61465c565b606091505b509150915081801561468a57508051158061468a575080806020019051602081101561468757600080fd5b50515b6146d3576040805162461bcd60e51b8152602060048201526015602482015274115490cc8c17d514905394d1915497d19052531151605a1b604482015290519081900360640190fd5b5050505050565b60008161471d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806147455750670de0b6b3a764000084828161474257fe5b04145b614789576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156147d7576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161456457fe5b600082820183811015614195576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106148b25780518252601f199092019160209182019101614893565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614914576040519150601f19603f3d011682016040523d82523d6000602084013e614919565b606091505b5091509150818015614947575080511580614947575080806020019051602081101561494457600080fd5b50515b6146d3576040805162461bcd60e51b815260206004820152601a60248201527f45524332305f5452414e534645525f46524f4d5f4641494c4544000000000000604482015290519081900360640190fd5b306000908152602081905260409020546149b8908263ffffffff6147e216565b306000908152602081905260409020556002546149db908263ffffffff6147e216565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600080828410614a2f5750508082036000614a37565b505081810360015b9250929050565b30600090815260208190526040902054811115614a99576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b30600090815260208190526040902054614ab9908263ffffffff61443916565b30600090815260208190526040902055600254614adc908263ffffffff61443916565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35056fea265627a7a72315820e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b064736f6c63430005110032
Deployed Bytecode Sourcemap
21048:24733:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21048:24733:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27609:917;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27609:917:0;;:::i;:::-;;7576:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7576:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8234:187:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;672:52;;;:::i;:::-;;;;;;;;;;;;;;;;184:97;;;:::i;23293:19::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23293:19:0;;;;;;;;;;;;;;521:41;;;:::i;29441:622::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;29441:622:0;;;;;;;;;;:::i;28812:621::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28812:621:0;;;;;;;;;;:::i;855:47::-;;;:::i;8135:91::-;;;:::i;26239:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26239:195:0;;;;:::i;571:41::-;;;:::i;8573:598::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8573:598:0;;;;;;;;;;;;;;;;;:::i;23908:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23908:100:0;-1:-1:-1;;;;;23908:100:0;;:::i;7766:85::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41398:1702;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41398:1702:0;;;;;;;;;;;;;:::i;30071:1031::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30071:1031:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30071:1031:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30071:1031:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;30071:1031:0;;-1:-1:-1;30071:1031:0;-1:-1:-1;30071:1031:0;:::i;23209:22::-;;;:::i;39998:1392::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39998:1392:0;;;;;;;;;;;;;:::i;23238:22::-;;;:::i;23500:23::-;;;:::i;8022:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8022:105:0;-1:-1:-1;;;;;8022:105:0;;:::i;23319:22::-;;;:::i;33130:3176::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;33130:3176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36314:494;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36314:494:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36816:3174::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;36816:3174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32629:493::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;32629:493:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;777:43::-;;;:::i;28611:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28611:193:0;-1:-1:-1;;;;;28611:193:0;;:::i;25278:258::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25278:258:0;-1:-1:-1;;;;;25278:258:0;;:::i;24581:160::-;;;:::i;911:53::-;;;:::i;23530:21::-;;;:::i;24337:236::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24337:236:0;-1:-1:-1;;;;;24337:236:0;;:::i;7669:89::-;;;:::i;1027:58::-;;;:::i;26442:1117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26442:1117:0;;;;;;;;:::i;8429:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8429:136:0;;;;;;;;:::i;31110:1511::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31110:1511:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;31110:1511:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31110:1511:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;31110:1511:0;;-1:-1:-1;31110:1511:0;-1:-1:-1;31110:1511:0;:::i;468:44::-;;;:::i;23179:21::-;;;:::i;417:44::-;;;:::i;43108:517::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43108:517:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24120:209::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24120:209:0;;;;;;;;;;;;;;;;;24016:96;;;:::i;25907:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25907:277:0;;;;;;;;:::i;7859:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7859:155:0;;;;;;;;;;:::i;25544:293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25544:293:0;;:::i;23348:22::-;;;:::i;973:47::-;;;:::i;24749:287::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24749:287:0;-1:-1:-1;;;;;24749:287:0;;:::i;21174:159::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21174:159:0;;:::i;23049:25::-;;;:::i;25044:226::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25044:226:0;-1:-1:-1;;;;;25044:226:0;;:::i;43633:519::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;43633:519:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27609:917::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;27694:10;;-1:-1:-1;;;;;27694:10:0;27680;:24;27672:55;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;-1:-1:-1;;;27672:55:0;;;;;;;;;;;;;;;27747:9;;-1:-1:-1;;;27747:9:0;;;;27746:10;27738:39;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;-1:-1:-1;;;27738:39:0;;;;;;;;;;;;;;;27796:7;:14;460:1;-1:-1:-1;27796:34:0;27788:61;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;-1:-1:-1;;;27788:61:0;;;;;;;;;;;;;;;27868:7;:14;511:1;-1:-1:-1;27868:34:0;27860:61;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;-1:-1:-1;;;27860:61:0;;;;;;;;;;;;;;;27954:9;:12;27942:24;;;27934:48;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;-1:-1:-1;;;27934:48:0;;;;;;;;;;;;;;;28013:31;;28001:43;;;27993:67;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;-1:-1:-1;;;27993:67:0;;;;;;;;;;;;;;;28073:10;;28102:174;28126:16;28122:1;:20;28102:174;;;28180:9;28190:1;28180:12;;;;;;;;;28168:8;:24;28164:101;;;28221:4;28213:12;;28244:5;;28164:101;28144:3;;28102:174;;;;28294:5;28286:38;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;-1:-1:-1;;;28286:38:0;;;;;;;;;;;;;;;28335:7;:18;;;28366:9;:16;;-1:-1:-1;;;;28366:16:0;-1:-1:-1;;;28366:16:0;;;28395:32;954:10;28395:14;:32::i;:::-;28438:44;28453:10;954;28438:14;:44::i;:::-;28510:7;;28500:18;;;;;;;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;27609:917::o;7576:85::-;7648:5;;;;;;;;;;;;-1:-1:-1;;;7648:5:0;;;;7576:85;:::o;8234:187::-;8323:10;8295:4;8312:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;8312:27:0;;;;;;;;;;;:33;;;8361:30;;;;;;;8295:4;;8312:27;;8323:10;;8361:30;;;;;;;;-1:-1:-1;8409:4:0;8234:187;;;;:::o;672:52::-;715:9;672:52;:::o;184:97::-;-1:-1:-1;;;184:97:0;:::o;23293:19::-;;;-1:-1:-1;;;;;23293:19:0;;:::o;521:41::-;561:1;521:41;:::o;29441:622::-;22971:6;;29575:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29618:17:0;;;;;;:8;:17;;;;;:23;;;29610:49;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;-1:-1:-1;;;29610:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29678:18:0;;;;;;:8;:18;;;;;:24;;;29670:50;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;-1:-1:-1;;;29670:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29757:17:0;;;29731:23;29757:17;;;:8;:17;;;;;;;;29812:18;;;;;;;;29899:16;;;;;29934:15;;;;;29968:17;;;;30004:16;;;;29861:194;;-1:-1:-1;;;29861:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29812:18;;29861:5;;:19;;:194;;;;;;;;;;:5;:194;;;5:2:-1;;;;30:1;27;20:12;5:2;29861:194:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29861:194:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29861:194:0;;29441:622;-1:-1:-1;;;;;29441:622:0:o;28812:621::-;22971:6;;28939:17;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28982:17:0;;;;;;:8;:17;;;;;:23;;;28974:49;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;-1:-1:-1;;;28974:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29042:18:0;;;;;;:8;:18;;;;;:24;;;29034:50;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;-1:-1:-1;;;29034:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29121:17:0;;;29095:23;29121:17;;;:8;:17;;;;;;;;29176:18;;;;;;;;;29263:16;;;;;29298:15;;;;;29332:17;;;;29368:16;;;;29403:7;;29225:200;;-1:-1:-1;;;29225:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29176:18;;29225:5;;:19;;:200;;;;;;;;;;:5;:200;;;5:2:-1;;;;30:1;27;20:12;855:47:0;897:5;855:47;:::o;8135:91::-;8206:12;;8135:91;:::o;26239:195::-;26322:7;;-1:-1:-1;;;;;26322:7:0;26300:10;:30;26292:57;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;-1:-1:-1;;;26292:57:0;;;;;;;;;;;;;;;26360:10;:19;;;;;-1:-1:-1;;26360:19:0;;;;;;;;26395:31;;;;;;;26407:10;;26395:31;;;;;;;;;;26239:195;:::o;571:41::-;402:6;571:41;:::o;8573:598::-;8686:4;8725:10;-1:-1:-1;;;;;8725:17:0;;;;:55;;-1:-1:-1;;;;;;8753:15:0;;;;;;:10;:15;;;;;;;;8769:10;8753:27;;;;;;;;8746:34;;;8725:55;8703:126;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;-1:-1:-1;;;8703:126:0;;;;;;;;;;;;;;;8840:20;8846:3;8851;8856;8840:5;:20::i;:::-;8875:10;-1:-1:-1;;;;;8875:17:0;;;;;;:63;;-1:-1:-1;;;;;;8896:15:0;;;;;;:10;:15;;;;;;;;8912:10;8896:27;;;;;;;;-1:-1:-1;;8896:42:0;;8875:63;8871:271;;;-1:-1:-1;;;;;8986:15:0;;;;;;:10;:15;;;;;;;;9002:10;8986:27;;;;;;;;8985:71;;9038:3;8985:71;:34;:71;:::i;:::-;-1:-1:-1;;;;;8955:15:0;;;;;;;:10;:15;;;;;;;;8971:10;8955:27;;;;;;;;;;:101;;;9076:54;;;;;;;;;;8971:10;;9076:54;;;;;;;;;;8871:271;-1:-1:-1;9159:4:0;8573:598;;;;;:::o;23908:100::-;-1:-1:-1;;;;;23983:11:0;23959:4;23983:11;;;:8;:11;;;;;:17;;;;23908:100::o;7766:85::-;7565:2;7766:85;:::o;41398:1702::-;41556:22;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;41599:9:0;;22863:13;41599:9;41591:39;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;-1:-1:-1;;;41591:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41649:18:0;;;;;;:8;:18;;;;;:24;;;41641:50;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;-1:-1:-1;;;41641:50:0;;;;;;;;;;;;;;;897:5;41710:12;:31;;41702:58;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;-1:-1:-1;;;41702:58:0;;;;;;;;;;;;;;;41773:40;41788:10;41800:12;41773:14;:40::i;:::-;41871:1;41861:7;;:11;:35;;;;-1:-1:-1;41890:6:0;;-1:-1:-1;;;;;41890:6:0;41876:10;:20;;41861:35;41857:217;;;41913:16;41932:26;41950:7;;41932:12;:17;;:26;;;;:::i;:::-;41988:6;;41913:45;;-1:-1:-1;41973:32:0;;-1:-1:-1;;;;;41988:6:0;41913:45;41973:14;:32::i;:::-;42035:27;:12;42053:8;42035:27;:17;:27;:::i;:::-;42020:42;;41857:217;;42086:28;42101:12;42086:14;:28::i;:::-;-1:-1:-1;;;;;42154:18:0;;42127:24;42154:18;;;:8;:18;;;;;;;;;42245:17;;;;42277:16;;;;;42308:12;;42335;;42389:7;;42200:207;;-1:-1:-1;;;42200:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42154:18;;42200:5;;:30;;:207;;;;;;;;;;:5;:207;;;5:2:-1;;;;30:1;27;20:12;5:2;42200:207:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42200:207:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42200:207:0;;-1:-1:-1;42428:30:0;;;;42420:56;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;-1:-1:-1;;;42420:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;42528:18:0;;;;;;:8;:18;;;;;1075:1;42528:26;;42527:48;;1067:18;42527:33;:48::i;:::-;42509:14;:66;;42487:133;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;-1:-1:-1;;;42487:133:0;;;;;;;;;;;;;;;42654:17;;;;42653:40;;42678:14;42653:40;:24;:40;:::i;:::-;42633:17;;;:60;42765:7;;42726:16;;42745:28;;:14;;:28;:19;:28;:::i;:::-;42788:10;;42726:47;;-1:-1:-1;42788:10:0;;42784:82;;;42846:7;;42826:28;;:14;;:28;:19;:28;:::i;:::-;42815:39;;42784:82;42883:46;;;;;;;;-1:-1:-1;;;;;42883:46:0;;;42892:10;;42883:46;;;;;;;;;42966:4;;42940:41;;42956:8;;-1:-1:-1;;;;;42966:4:0;42972:8;42940:15;:41::i;:::-;42992:68;43008:8;43018:10;43030:29;:14;43050:8;43030:29;:19;:29;:::i;:::-;42992:15;:68::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;41398:1702;;-1:-1:-1;;;41398:1702:0:o;30071:1031::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;30203:9:0;;22863:13;30203:9;30195:39;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;-1:-1:-1;;;30195:39:0;;;;;;;;;;;;;;;30276:7;:14;30253:37;;30245:69;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;-1:-1:-1;;;30245:69:0;;;;;;;;;;;;;;;30327:17;30347:13;:11;:13::i;:::-;30327:33;-1:-1:-1;30371:13:0;30387:29;:13;30327:33;30387:29;:18;:29;:::i;:::-;30371:45;-1:-1:-1;30435:10:0;30427:38;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;-1:-1:-1;;;30427:38:0;;;;;;;;;;;;;;;30483:9;30478:525;30502:7;:14;30498:18;;30478:525;;;30538:9;30550:7;30558:1;30550:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30550:10:0;30589:11;;;:8;:11;;;;;;:19;;;30550:10;;-1:-1:-1;30589:19:0;30647:15;:5;30589:19;30647:15;:10;:15;:::i;:::-;30623:39;-1:-1:-1;30685:18:0;30677:46;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;-1:-1:-1;;;30677:46:0;;;;;;;;;;;;;;;30763:12;;30776:1;30763:15;;;;;;;;;;;;;30746:13;:32;;30738:57;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;-1:-1:-1;;;30738:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30833:11:0;;;;;;:8;:11;;;;;:19;;;30832:41;;30859:13;30832:41;:26;:41;:::i;:::-;-1:-1:-1;;;;;30810:11:0;;;;;;:8;:11;;;;;;;;;:19;;:63;;;;30893:38;;;;;;;30810:11;;30902:10;;30893:38;;;;;;;;;;30946:45;30962:1;30965:10;30977:13;30946:15;:45::i;:::-;-1:-1:-1;;;30518:3:0;;30478:525;;;;31013:29;31028:13;31013:14;:29::i;:::-;31053:41;31068:10;31080:13;31053:14;:41::i;:::-;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;30071:1031:0:o;23209:22::-;;;;:::o;39998:1392::-;22830:6;;40155:21;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;40197:9:0;;22863:13;40197:9;40189:39;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;-1:-1:-1;;;40189:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40247:17:0;;;;;;:8;:17;;;;;:23;;;40239:49;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;-1:-1:-1;;;40239:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40339:17:0;;;;;;:8;:17;;;;;:25;;;40338:46;;1012:8;40338:32;:46::i;:::-;40321:13;:63;;40299:129;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;-1:-1:-1;;;40299:129:0;;;;;;;;;;;;;;;40441:51;40457:7;40466:10;40478:13;40441:15;:51::i;:::-;40525:16;40544:27;40563:7;;40544:13;:18;;:27;;;;:::i;:::-;40586:10;;40525:46;;-1:-1:-1;40586:10:0;;40582:81;;;40643:7;;40624:27;;:13;;:27;:18;:27;:::i;:::-;40613:38;;40582:81;40689:28;:13;40708:8;40689:28;:18;:28;:::i;:::-;-1:-1:-1;;;;;40756:17:0;;40730:23;40756:17;;;:8;:17;;;;;;;;;40845:16;;;;40876:15;;;;;40906:12;;40933;;40988:7;;40800:206;;-1:-1:-1;;;40800:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40673:44;;-1:-1:-1;40756:17:0;40800:5;;:30;;:206;;;;;40756:17;;40800:206;;;;;:5;:206;;;5:2:-1;;;;30:1;27;20:12;5:2;40800:206:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40800:206:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40800:206:0;;-1:-1:-1;41025:33:0;;;;41017:59;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;-1:-1:-1;;;41017:59:0;;;;;;;;;;;;;;;41109:16;;;;41108:38;;41132:13;41108:38;:23;:38;:::i;:::-;41089:16;;;:57;41184:4;;41159:40;;41175:7;;-1:-1:-1;;;;;41184:4:0;41190:8;41159:15;:40::i;:::-;41215:44;;;;;;;;-1:-1:-1;;;;;41215:44:0;;;41224:10;;41215:44;;;;;;;;;41270:29;41285:13;41270:14;:29::i;:::-;41310:41;41325:10;41337:13;41310:14;:41::i;23238:22::-;;;;:::o;23500:23::-;;;-1:-1:-1;;;;;23500:23:0;;:::o;8022:105::-;-1:-1:-1;;;;;8105:14:0;8078:7;8105:14;;;;;;;;;;;;8022:105::o;23319:22::-;;;;:::o;33130:3176::-;22830:6;;33362:22;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;33429:17:0;;22863:6;33429:17;;;:8;:17;;;;;:23;22863:13;33429:23;33421:49;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;-1:-1:-1;;;33421:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33489:18:0;;;;;;:8;:18;;;;;:24;;;33481:50;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;-1:-1:-1;;;33481:50:0;;;;;;;;;;;;;;;33550:9;;-1:-1:-1;;;33550:9:0;;;;33542:39;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;-1:-1:-1;;;33542:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33620:26:0;;;33594:23;33620:26;;;:8;:26;;;;;;33684:27;;;;;;;33764:16;;;;33763:37;;1012:8;33763:23;:37::i;:::-;33746:13;:54;;33724:120;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;-1:-1:-1;;;33724:120:0;;;;;;;;;;;;;;;33857:23;33896:5;:19;33934:8;:16;;;33969:8;:15;;;34003:9;:17;;;34039:9;:16;;;34074:7;;33896:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33896:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33896:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33896:200:0;;-1:-1:-1;34115:27:0;;;;34107:59;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;-1:-1:-1;;;34107:59:0;;;;;;;;;;;;;;;34196:199;34225:8;:16;;;34256:8;:15;;;34286:9;:17;;;34318:9;:16;;;34349:13;34377:7;;34196:14;:199::i;:::-;34179:216;;34432:12;34414:14;:30;;34406:56;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;-1:-1:-1;;;34406:56:0;;;;;;;;;;;;;;;34514:34;:13;34533:14;34514:34;:18;:34;:::i;:::-;34495:15;:53;;34473:118;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;-1:-1:-1;;;34473:118:0;;;;;;;;;;;;;;;34624:16;;;;34623:38;;34647:13;34623:38;:23;:38;:::i;:::-;34604:16;;;;:57;;;;34693:17;;;34692:40;;34717:14;34692:40;:24;:40;:::i;:::-;34672:9;:17;;:60;;;;34762:5;:19;34796:8;:16;;;34827:8;:15;;;34857:9;:17;;;34889:9;:16;;;34920:7;;34762:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34762:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34762:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34762:176:0;;-1:-1:-1;34957:33:0;;;;34949:61;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;-1:-1:-1;;;34949:61:0;;;;;;;;;;;;;;;35047:8;35029:14;:26;;35021:54;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;-1:-1:-1;;;35021:54:0;;;;;;;;;;;;;;;35163:8;-1:-1:-1;;;;;35093:146:0;35141:7;-1:-1:-1;;;;;35093:146:0;35116:10;-1:-1:-1;;;;;35093:146:0;;35186:13;35214:14;35093:146;;;;;;;;;;;;;;;;;;;;;;;;35252:51;35268:7;35277:10;35289:13;35252:15;:51::i;:::-;35316:16;35335:27;35354:7;;35335:13;:18;;:27;;;;:::i;:::-;35316:46;-1:-1:-1;35399:17:0;-1:-1:-1;;;;;35449:22:0;;;;;;:61;;-1:-1:-1;;;;;;35488:22:0;;35500:10;35488:22;;35449:61;:99;;;;-1:-1:-1;;;;;;35527:21:0;;35539:9;35527:21;;35449:99;35431:398;;;-1:-1:-1;35598:1:0;35587:12;;35633:45;35649:7;35658:8;35587:12;35633:15;:45::i;:::-;35713:16;;;;35712:34;;35736:9;35712:34;:23;:34;:::i;:::-;35693:8;:16;;:53;;;;35798:7;-1:-1:-1;;;;;35766:51:0;35788:8;-1:-1:-1;;;;;35766:51:0;35776:10;-1:-1:-1;;;;;35766:51:0;;35807:9;35766:51;;;;;;;;;;;;;;;;;;35431:398;35861:16;35880:27;35899:7;;35880:13;:18;;:27;;;;:::i;:::-;35922:10;;35861:46;;-1:-1:-1;35922:10:0;;35918:78;;;35960:24;:8;35974:9;35960:24;:13;:24;:::i;:::-;35949:35;;35918:78;36042:8;36014:24;:8;36028:9;36014:24;:13;:24;:::i;:::-;:36;;36006:62;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;-1:-1:-1;;;36006:62:0;;;;;;;;;;;;;;;36104:4;;36079:40;;36095:7;;-1:-1:-1;;;;;36104:4:0;36110:8;36079:15;:40::i;:::-;36150:16;;;;36149:33;;36173:8;36149:33;:23;:33;:::i;:::-;36130:16;;;:52;36195:53;36211:8;36221:10;36233:14;36195:15;:53::i;:::-;-1:-1:-1;;;;;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;33130:3176;;;;-1:-1:-1;33130:3176:0;-1:-1:-1;;;;;33130:3176:0:o;36314:494::-;36510:21;36533:22;36588:212;36630:7;36656:11;36686:8;36713:14;36746:8;36781:3;36588:23;:212::i;:::-;36568:232;;;;36314:494;;;;;;;;:::o;36816:3174::-;22830:6;;37049:21;;;;22830:6;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;37115:17:0;;22863:6;37115:17;;;:8;:17;;;;;:23;22863:13;37115:23;37107:49;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;-1:-1:-1;;;37107:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37175:18:0;;;;;;:8;:18;;;;;:24;;;37167:50;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;-1:-1:-1;;;37167:50:0;;;;;;;;;;;;;;;37236:9;;-1:-1:-1;;;37236:9:0;;;;37228:39;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;-1:-1:-1;;;37228:39:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;37306:26:0;;;37280:23;37306:26;;;:8;:26;;;;;;37370:27;;;;;;;1075:1;37451:17;;;37450:39;;1067:18;37450:24;:39::i;:::-;37432:14;:57;;37410:124;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;-1:-1:-1;;;37410:124:0;;;;;;;;;;;;;;;37547:23;37586:5;:19;37624:8;:16;;;37659:8;:15;;;37693:9;:17;;;37729:9;:16;;;37764:7;;37586:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37586:200:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37586:200:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37586:200:0;;-1:-1:-1;37805:27:0;;;;37797:59;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;-1:-1:-1;;;37797:59:0;;;;;;;;;;;;;;;37885:200;37914:8;:16;;;37945:8;:15;;;37975:9;:17;;;38007:9;:16;;;38038:14;38067:7;;37885:14;:200::i;:::-;37869:216;;38121:11;38104:13;:28;;38096:53;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;-1:-1:-1;;;38096:53:0;;;;;;;;;;;;;;;38201:34;:13;38220:14;38201:34;:18;:34;:::i;:::-;38182:15;:53;;38160:118;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;-1:-1:-1;;;38160:118:0;;;;;;;;;;;;;;;38311:16;;;;38310:38;;38334:13;38310:38;:23;:38;:::i;:::-;38291:16;;;;:57;;;;38380:17;;;38379:40;;38404:14;38379:40;:24;:40;:::i;:::-;38359:9;:17;;:60;;;;38449:5;:19;38483:8;:16;;;38514:8;:15;;;38544:9;:17;;;38576:9;:16;;;38607:7;;38449:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38449:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38449:176:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38449:176:0;;-1:-1:-1;38644:33:0;;;;38636:61;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;-1:-1:-1;;;38636:61:0;;;;;;;;;;;;;;;38734:8;38716:14;:26;;38708:54;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;-1:-1:-1;;;38708:54:0;;;;;;;;;;;;;;;38850:8;-1:-1:-1;;;;;38780:146:0;38828:7;-1:-1:-1;;;;;38780:146:0;38803:10;-1:-1:-1;;;;;38780:146:0;;38873:13;38901:14;38780:146;;;;;;;;;;;;;;;;;;;;;;;;38939:51;38955:7;38964:10;38976:13;38939:15;:51::i;:::-;39003:16;39022:27;39041:7;;39022:13;:18;;:27;;;;:::i;:::-;39003:46;-1:-1:-1;39084:17:0;-1:-1:-1;;;;;39134:22:0;;;;;;:61;;-1:-1:-1;;;;;;39173:22:0;;39185:10;39173:22;;39134:61;:99;;;;-1:-1:-1;;;;;;39212:21:0;;39224:9;39212:21;;39134:99;39116:398;;;-1:-1:-1;39283:1:0;39272:12;;39318:45;39334:7;39343:8;39272:12;39318:15;:45::i;:::-;39398:16;;;;39397:34;;39421:9;39397:34;:23;:34;:::i;:::-;39378:8;:16;;:53;;;;39483:7;-1:-1:-1;;;;;39451:51:0;39473:8;-1:-1:-1;;;;;39451:51:0;39461:10;-1:-1:-1;;;;;39451:51:0;;39492:9;39451:51;;;;;;;;;;;;;;;;;;39116:398;39546:16;39565:27;39584:7;;39565:13;:18;;:27;;;;:::i;:::-;39607:10;;39546:46;;-1:-1:-1;39607:10:0;;39603:78;;;39645:24;:8;39659:9;39645:24;:13;:24;:::i;:::-;39634:35;;39603:78;39727:8;39699:24;:8;39713:9;39699:24;:13;:24;:::i;:::-;:36;;39691:62;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;-1:-1:-1;;;39691:62:0;;;;;;;;;;;;;;;39789:4;;39764:40;;39780:7;;-1:-1:-1;;;;;39789:4:0;39795:8;39764:15;:40::i;:::-;39835:16;;;;39834:33;;39858:8;39834:33;:23;:33;:::i;:::-;39815:16;;;:52;39880:53;39896:8;39906:10;39918:14;39880:15;:53::i;32629:493::-;32824:22;32848;32903:211;32944:7;32970:13;33002:8;33029:12;33060:8;33095:3;32903:22;:211::i;777:43::-;815:5;777:43;:::o;28611:193::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;-1:-1:-1;;;;;28682:15:0;;22863:6;28682:15;;;:8;:15;;;;;:21;22863:13;28682:21;28674:47;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;-1:-1:-1;;;28674:47:0;;;;;;;;;;;;;;;28758:38;;;-1:-1:-1;;;28758:38:0;;28790:4;28758:38;;;;;;-1:-1:-1;;;;;28758:23:0;;;;;:38;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;28758:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28758:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28758:38:0;-1:-1:-1;;;;;28732:15:0;;;;;;;:8;28758:38;28732:15;;;;:23;;:64;22899:6;:14;;-1:-1:-1;;22899:14:0;;;28611:193::o;25278:258::-;22743:10;-1:-1:-1;;;;;22725:39:0;22734:7;;-1:-1:-1;;;;;;22734:7:0;-1:-1:-1;;;;;22725:39:0;;22755:8;;22725:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;22725:39:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;22725:39:0;;;;-1:-1:-1;22725:39:0;;-1:-1:-1;;;;22725:39:0;25367:10;;;;;-1:-1:-1;;;;;25367:10:0;25353;:24;25345:55;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;-1:-1:-1;;;25345:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25419:21:0;;25411:47;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;-1:-1:-1;;;25411:47:0;;;;;;;;;;;;;;;25469:10;:20;;-1:-1:-1;;;;;;25469:20:0;;-1:-1:-1;;;;;25469:20:0;;;;;;;;;;;;25505:23;;;;-1:-1:-1;;25505:23:0;25278:258;:::o;24581:160::-;22971:6;;24689:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;24721:12:0;;24581:160;:::o;911:53::-;954:10;911:53;:::o;23530:21::-;;;-1:-1:-1;;;;;23530:21:0;;:::o;24337:236::-;22971:6;;24453:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24486:15:0;;;;;;:8;:15;;;;;:21;;;24478:47;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;-1:-1:-1;;;24478:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24543:15:0;;;;;:8;:15;;;;;:22;;;;24337:236::o;7669:89::-;7743:7;;;;;;;;;;;;-1:-1:-1;;;7743:7:0;;;;7669:89;:::o;1027:58::-;1067:18;1027:58;:::o;26442:1117::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;22872:4;-1:-1:-1;;22863:13:0;;;;;;;;;26536:10;;-1:-1:-1;;;;;26536:10:0;26522;:24;26514:55;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;-1:-1:-1;;;26514:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26589:15:0;;;;;;:8;:15;;;;;:21;;;26588:22;26580:47;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;-1:-1:-1;;;26580:47:0;;;;;;;;;;;;;;;26647:9;;-1:-1:-1;;;26647:9:0;;;;26646:10;26638:39;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;-1:-1:-1;;;26638:39:0;;;;;;;;;;;;;;;26698:7;:14;511:1;-1:-1:-1;26690:60:0;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;-1:-1:-1;;;26690:60:0;;;;;;;;;;;;;;;402:6;26771;:20;;26763:47;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;-1:-1:-1;;;26763:47:0;;;;;;;;;;;;;;;656:9;26829:20;;;26821:47;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;-1:-1:-1;;;26821:47:0;;;;;;;;;;;;;;;26899:38;;;-1:-1:-1;;;26899:38:0;;26931:4;26899:38;;;;;;26881:15;;-1:-1:-1;;;;;26899:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;26899:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26899:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26899:38:0;26980:24;;;-1:-1:-1;;;26980:24:0;;;;26899:38;;-1:-1:-1;26950:15:0;;-1:-1:-1;;;;;26980:22:0;;;;;:24;;;;;26899:38;;26980:24;;;;;;;:22;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;26980:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26980:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26980:24:0;26972:33;;26968:2;:37;;-1:-1:-1;27035:5:0;27024:16;;;27016:42;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;-1:-1:-1;;;27016:42:0;;;;;;;;;;;;;;;815:5;27117:7;:21;27106:7;:32;;27098:60;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;-1:-1:-1;;;27098:60:0;;;;;;;;;;;;;;;27186:12;;:25;;27204:6;27186:25;:17;:25;:::i;:::-;27171:12;:40;;;715:9;-1:-1:-1;27230:32:0;27222:65;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;-1:-1:-1;;;27222:65:0;;;;;;;;;;;;;;;27318:141;;;;;;;;27347:4;27318:141;;;27373:7;:14;;27318:141;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27300:15:0;;-1:-1:-1;27300:15:0;;;:8;:15;;;;;:159;;;;-1:-1:-1;;27300:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;27470:19:0;;;;;;;;;-1:-1:-1;;;;;;27470:19:0;;;;;27507:44;;;;;;;;;;;;;27300:15;;27516:10;;27507:44;;;;;;;;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;26442:1117:0:o;8429:136::-;8491:4;8508:27;8514:10;8526:3;8531;8508:5;:27::i;:::-;-1:-1:-1;8553:4:0;8429:136;;;;:::o;31110:1511::-;22830:6;;;;22829:7;22821:31;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;-1:-1:-1;;;22821:31:0;;;;;;;;;;;;;;;22863:6;:13;;-1:-1:-1;;22863:13:0;22872:4;22863:13;;;;;-1:-1:-1;;;31242:9:0;;22863:13;31242:9;31234:39;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;-1:-1:-1;;;31234:39:0;;;;;;;;;;;;;;;31316:7;:14;31292:38;;31284:70;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;-1:-1:-1;;;31284:70:0;;;;;;;;;;;;;;;897:5;31403:12;:31;;31395:58;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;-1:-1:-1;;;31395:58:0;;;;;;;;;;;;;;;31466:17;31486:13;:11;:13::i;:::-;31466:33;;31510:16;31529:26;31547:7;;31529:12;:17;;:26;;;;:::i;:::-;31634:6;;31510:45;;-1:-1:-1;;;;;;31634:6:0;31620:10;:20;31616:65;;;-1:-1:-1;31668:1:0;31616:65;31691:23;31717:27;:12;31735:8;31717:27;:17;:27;:::i;:::-;31691:53;-1:-1:-1;31755:13:0;31771:31;31691:53;31792:9;31771:31;:20;:31;:::i;:::-;31755:47;-1:-1:-1;31821:10:0;31813:38;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;-1:-1:-1;;;31813:38:0;;;;;;;;;;;;;;;31864:40;31879:10;31891:12;31864:14;:40::i;:::-;31954:12;;31950:77;;31998:6;;31983:32;;-1:-1:-1;;;;;31998:6:0;32006:8;31983:14;:32::i;:::-;32037:31;32052:15;32037:14;:31::i;:::-;32086:9;32081:533;32105:7;:14;32101:18;;32081:533;;;32141:9;32153:7;32161:1;32153:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32153:10:0;32192:11;;;:8;:11;;;;;;:19;;;32153:10;;-1:-1:-1;32192:19:0;32251:15;:5;32192:19;32251:15;:10;:15;:::i;:::-;32226:40;-1:-1:-1;32289:19:0;32281:47;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;-1:-1:-1;;;32281:47:0;;;;;;;;;;;;;;;32369:13;;32383:1;32369:16;;;;;;;;;;;;;32351:14;:34;;32343:60;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;-1:-1:-1;;;32343:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32441:11:0;;;;;;:8;:11;;;;;:19;;;32440:42;;32467:14;32440:42;:26;:42;:::i;:::-;-1:-1:-1;;;;;32418:11:0;;;;;;:8;:11;;;;;;;;;:19;;:64;;;;32502:39;;;;;;;32418:11;;32511:10;;32502:39;;;;;;;;;;32556:46;32572:1;32575:10;32587:14;32556:15;:46::i;:::-;-1:-1:-1;;;32121:3:0;;32081:533;;;-1:-1:-1;;22899:6:0;:14;;-1:-1:-1;;22899:14:0;;;-1:-1:-1;;;;;;31110:1511:0:o;468:44::-;511:1;468:44;:::o;23179:21::-;;;-1:-1:-1;;;23179:21:0;;;;;:::o;417:44::-;460:1;417:44;:::o;43108:517::-;43391:226;;;-1:-1:-1;;;43391:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43351:7;;43391:5;;:20;;:226;;;;;;;;;;;;;;;:5;:226;;;5:2:-1;;;;30:1;27;20:12;5:2;43391:226:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43391:226:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43391:226:0;;43108:517;-1:-1:-1;;;;;;;43108:517:0:o;24120:209::-;22971:6;;24216:23;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;24265:9;;-1:-1:-1;;;24265:9:0;;;;24257:39;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;-1:-1:-1;;;24257:39:0;;;;;;;;;;;;;;;24314:7;24307:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24307:14:0;;;;;;;;;;;;;;;;;;;;;;;24120:209;:::o;24016:96::-;24090:7;:14;24016:96;:::o;25907:277::-;26004:7;;-1:-1:-1;;;;;26004:7:0;25982:10;:30;25974:57;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;-1:-1:-1;;;25974:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;26050:18:0;;26042:44;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;-1:-1:-1;;;26042:44:0;;;;;;;;;;;;;;;26097:4;:11;;-1:-1:-1;;;;;26097:11:0;;-1:-1:-1;;;;;;26097:11:0;;;;;;;;26119:7;:13;;;26150:26;;;;;;;;;;;;;;;;;25907:277;;:::o;7859:155::-;-1:-1:-1;;;;;7986:15:0;;;7954:7;7986:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;7859:155::o;25544:293::-;25606:9;;-1:-1:-1;;;25606:9:0;;;;25605:10;25597:39;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;-1:-1:-1;;;25597:39:0;;;;;;;;;;;;;;;25669:10;;;;;-1:-1:-1;;;;;25669:10:0;25655;:24;25647:55;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;-1:-1:-1;;;25647:55:0;;;;;;;;;;;;;;;25728:7;;;;;;;;;-1:-1:-1;;;;;25728:7:0;-1:-1:-1;;;;;25728:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25728:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25728:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25728:23:0;25721:30;;;25713:59;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;-1:-1:-1;;;25713:59:0;;;;;;;;;;;;;;;25783:7;:13;;;25812:17;;;;;;;;;;;;;;;;;25544:293;:::o;23348:22::-;;;;;;:::o;973:47::-;1012:8;973:47;:::o;24749:287::-;22971:6;;24863:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24896:15:0;;;;;;:8;:15;;;;;:21;;;24888:47;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;-1:-1:-1;;;24888:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;24963:15:0;;24946:14;24963:15;;;:8;:15;;;;;:22;;;25015:12;;25003:25;;24963:22;;25003:25;:11;:25;:::i;:::-;24996:32;24749:287;-1:-1:-1;;;24749:287:0:o;21174:159::-;;;;;;;;;;;;;-1:-1:-1;21174:159:0;:::o;23049:25::-;;;;;;-1:-1:-1;;;;;23049:25:0;;:::o;25044:226::-;22971:6;;25149:7;;22971:6;;22970:7;22962:31;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;-1:-1:-1;;;22962:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;25182:15:0;;;;;;:8;:15;;;;;:21;;;25174:47;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;-1:-1:-1;;;25174:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25239:15:0;;;;;:8;:15;;;;;:23;;;;25044:226::o;43633:519::-;43917:227;;;-1:-1:-1;;;43917:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43877:7;;43917:5;;:20;;:227;;;;;;;;;;;;;;;:5;:227;;;5:2:-1;;;;30:1;27;20:12;45608:81:0;45668:13;45674:6;45668:5;:13::i;:::-;45608:81;:::o;45488:112::-;45560:32;45574:4;45581:2;45585:6;45560:5;:32::i;:::-;45488:112;;:::o;7022:312::-;-1:-1:-1;;;;;7138:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;7138:20:0;7130:53;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;-1:-1:-1;;;7130:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;7211:13:0;;:8;:13;;;;;;;;;;;7210:25;;7231:3;7210:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7194:13:0;;;:8;:13;;;;;;;;;;;:41;;;;7263:13;;;;;;;7262:25;;7283:3;7262:25;:20;:25;:::i;:::-;-1:-1:-1;;;;;7246:13:0;;;:8;:13;;;;;;;;;;;;:41;;;;7303:23;;;;;;;7246:13;;7303:23;;;;;;;;;;;;;7022:312;;;:::o;1782:191::-;1841:7;1862:9;1873;1886:14;1895:1;1898;1886:8;:14::i;:::-;1861:39;;;;1920:4;1919:5;1911:35;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;-1:-1:-1;;;1911:35:0;;;;;;;;;;;;;;;-1:-1:-1;1964:1:0;1782:191;-1:-1:-1;;;1782:191:0:o;45364:116::-;45438:34;45444:4;45458;45465:6;45438:5;:34::i;2230:306::-;2289:7;2322:5;;;2346:6;;;:21;;;2366:1;2361;2356:2;:6;;;;;;:11;2346:21;2338:50;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;-1:-1:-1;;;2338:50:0;;;;;;;;;;;;;;;2418:8;2412:15;;2446:8;;;;2438:37;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;-1:-1:-1;;;2438:37:0;;;;;;;;;;;;;;;2486:10;1206:6;2499:2;:9;;;2230:306;-1:-1:-1;;;;;;2230:306:0:o;45697:81::-;45757:13;45763:6;45757:5;:13::i;44913:443::-;45162:46;;;-1:-1:-1;;;;;45162:46:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;45162:46:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;45151:58:0;;;;45103:12;;45117:17;;45151:10;;;;45162:46;45151:58;;;25:18:-1;45151:58:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;45151:58: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;;45102:107:0;;;;45242:7;:57;;;;-1:-1:-1;45254:11:0;;:16;;:44;;;45285:4;45274:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45274:24:0;45254:44;45220:128;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;-1:-1:-1;;;45220:128:0;;;;;;;;;;;;;;;44913:443;;;;;:::o;2544:382::-;2603:7;2631:6;2623:31;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;-1:-1:-1;;;2623:31:0;;;;;;;;;;;;;;;1206:6;2678:8;;2705:6;;;:24;;;1206:6;2720:1;2715:2;:6;;;;;;:14;2705:24;2697:53;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;-1:-1:-1;;;2697:53:0;;;;;;;;;;;;;;;2801:1;2797:5;;2791:12;;2822:8;;;;2814:37;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;-1:-1:-1;;;2814:37:0;;;;;;;;;;;;;;;2879:10;2897:1;2892:2;:6;;;;1605:169;1664:7;1696:5;;;1720:6;;;;1712:35;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;-1:-1:-1;;;1712:35:0;;;;;;;;;;;;;;44394:511;44675:63;;;-1:-1:-1;;;;;44675:63:0;;;;;;;44724:4;44675:63;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;44675:63:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;44646:107:0;;;;44598:12;;44612:17;;44646:10;;;;44675:63;44646:107;;;25:18:-1;44646:107:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;44646:107: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;;44597:156:0;;;;44786:7;:57;;;;-1:-1:-1;44798:11:0;;:16;;:44;;;44829:4;44818:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44818:24:0;44798:44;44764:133;;;;;-1:-1:-1;;;44764:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6490:221;6582:4;6565:8;:23;;;;;;;;;;;6564:35;;6595:3;6564:35;:30;:35;:::i;:::-;6555:4;6538:8;:23;;;;;;;;;;:61;6625:12;;:22;;6643:3;6625:22;:17;:22;:::i;:::-;6610:12;:37;6663:40;;;;;;;;6692:4;;6680:1;;6663:40;;;;;;;;;6490:221;:::o;1981:241::-;2071:7;2080:4;2111:1;2106;:6;2102:113;;-1:-1:-1;;2137:5:0;;;2144;2129:21;;2102:113;-1:-1:-1;;2191:5:0;;;2198:4;2102:113;1981:241;;;;;:::o;6719:295::-;6792:4;6775:8;:23;;;;;;;;;;;:30;-1:-1:-1;6775:30:0;6767:63;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;-1:-1:-1;;;6767:63:0;;;;;;;;;;;;;;;6885:4;6868:8;:23;;;;;;;;;;;6867:35;;6898:3;6867:35;:30;:35;:::i;:::-;6858:4;6841:8;:23;;;;;;;;;;:61;6928:12;;:22;;6946:3;6928:22;:17;:22;:::i;:::-;6913:12;:37;6966:40;;;;;;;;6998:1;;6983:4;;6966:40;;;;;;;;;6719:295;:::o
Swarm Source
bzzr://e4bc0b79265b34f3071fc12ee0e04d56963a3285dc6081942b73e464bfc1c8b0
Loading...
Loading
Loading...
Loading
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.